Grundlagen<br />Christopher Schleideni-chschl@microsoft.com<br />
www.sechsta-sinn.de<br />
Agenda<br /><ul><li>Überblick
Grundlage/Fenstererzeugen
2D Grafik laden/anzeigen
Eingabe(n) abfragen
2D Sprite bewegen
Kollionsabfrage
Animation
Sound</li></li></ul><li>XNA ÜberBlick<br />
History<br />2006 Dez – XNA Game Studio Express 1.0<br />2007 April – XNA Game Studio Express 1.0 Refresh<br />2007 Dez – ...
Was ist XNA?<br /><ul><li>XNA (XNA’s Not Acronymed)
Framework zur Spieleentwicklung (2D & 3D) für Windows, Xbox 360 und Zune (auch Zune HD)
Übernimmt Funktionen wie grafische Ausgabe, Wiedergabe von Audio-Dateien, Abfragen von Eingabegeräten</li></li></ul><li>Wa...
Entwicklung mit XNA<br />Entwickelt wird in C#<br />Keine DirectX Kenntnisse notwendig<br />Einzige andere wichtige Sprach...
Application Model<br />Fenstermanagement<br />Initialisieren des Graphics-Device<br />Bereitstellen des Game-Loop<br />//<...
usingSystem;<br />usingSystem.Collections.Generic;<br />usingSystem.Linq;<br />usingMicrosoft.Xna.Framework;<br />usingMic...
Application Model<br />Initialize()<br />LoadContent()<br />UnloadContent()<br />Update()<br />Draw()<br />
GameloopBestandteile<br />UpdateAktualisiert die Spiellogik der Anwendung<br />DrawZeichnetveränderten Zustand der Anwendu...
Timing<br />Default: Fixed-Timestep mit Ziel-Framerate 60 FPS<br />Pro Sekunde wird 60 mal Update aufgerufen<br />d.h. 16,...
Timing verwenden<br />Update und Draw besitzen ein GameTime Objekt<br />z.B. Zeitspanne zwischen zwei Aufrufen von Update(...
Content Pipeline<br />Inhalte werden nicht im Original-Format geladen<br />Inhalte werden mittels Content Pipeline in eige...
Content Pipeline: Flow<br />
Vordefinierte Prozessoren<br />Unterstütze Formate:<br />Grafiken (.bmp, .jpg, .png, .dds, .tga)<br />3D Modelle (.x, .fbx...
Content Pipeline: Importer/Processor<br />
Grafikenanzeigen<br />
1. Inhalt laden<br />Grafiken (Sprites) werden durch Klasse Texture2D repräsentiert<br />Texture2D mySprite = 	Content.Loa...
2. Anzeigen - SpriteBatch<br />2D GrafikenwerdenmittelsSpriteBatchgezeichnet<br />SpriteBatchkann 1 bis n Sprites mitgleic...
2. Anzeigen – SpriteBatch.Draw<br />spriteBatch.Begin();<br />spriteBatch.Draw( Texture2D, Vector2, Color );								…sprit...
Aufgabe 1<br />Sprite laden, anzeigen, in der Mitte des Bildschirmsrotieren (um Mittelpunkt der Grafik) und Rot färben<br ...
Lösung – Aufgabe 1<br />private Texture2D MySprite;<br />private float RotationAngle = 0.0f;<br />// Load our sprite throu...
Lösung – Aufgabe 1<br />// Begin sprite drawing<br />spriteBatch.Begin();<br />// Position where the sprite should be disp...
SpriteBatch.Draw Funktion<br />Ausschnitte<br />Rotation<br />Ursprung versetzen<br />Skalierung<br />Effekte (umdrehen de...
Stapelverarbeitung von Sprites<br />SpriteBatch.Begin()<br />Sprites anzeigen<br />SpriteBatch.End()<br />Begin (	SpriteBl...
AlphaBlend
None
Deferred
BackToFront
FrontToBack
Texture
Immediate
SaveState
None</li></li></ul><li>BackBuffer<br />Gezeichnet wird auf ein sog. RenderTarget<br />RenderTarget ist ein Buffer in dem d...
BackBuffer<br />BackBuffer<br />FrontBuffer<br />
Eigenschaften des Displays<br />
Display<br />Auflösung ändern:<br />graphicsDeviceManager.	PreferredBackBufferWidth = 1280;<br />graphicsDeviceManager.	Pr...
Text anzeigen<br />
Schrift anzeigen<br />XNA verwendet normale Windows TrueType Fonts<br />ContentPipeline erzeugt daraus Textur (SpriteFont)...
SpriteFont<br />Laden<br />myFont= Content.Load&lt;SpriteFont&gt;(“XML-Datei”);<br />Anzeigen<br />SpriteBatch.DrawString(...
Nützliche Funktionen<br />Höhe und Breite eines Strings abfragen<br />	SpriteFont.MeasureString( String )<br />XNA Fonts<b...
Eingabe<br />
Eingabe<br />XNA ermöglicht:<br />Mauseingaben			Klasse: Mouse<br />Tastatureingaben		Klasse: Keyboard<br />Xbox-Controlle...
Eingabe: Tastatur<br />Tastenstatus abfragenKeyboard.GetState().IsKeyDown(Keys.Up)<br />Tastendruck abfragenKeyboardStatec...
Eingabe: Xbox-Controller<br />Thumbstick<br />GamePadState.ThumbSticks.Left / .Right<br />DPad  / ButtonGamePadState.Butto...
Aufgabe 2<br />Sprite mitTastatur/Mausbewegen<br />Position des Sprites auf Bildschirmanzeigen<br />
Lösung – Aufgabe 2<br /> // Get new keyboard state<br />KeyboardStatekeyboardState = Keyboard.GetState();<br />// Calculat...
Lösung – Aufgabe 2<br />// Draw the sprite (White as color to disable any color effects)<br />spriteBatch.Draw(MySprite, s...
Kollisionsbehandlung<br />
Mathematische Funktionen: Vektoren<br />Klassen Vector2, Vector3 und Vector4<br />Grundrechnenarten<br />Add(), Multiply()...
Matrizen<br />Klasse Matrix für Transformation<br />Wird insbesondere bei 3D verwendet<br />Hilfsfunktionen:<br />Matrix.C...
Rectangles<br />
Kollisionen erkennen<br />
Aufgabe 3<br />Kollisionen mit einem anderen Sprite im 2D-Raum feststellen und diese behandeln<br />Kollisionserkennung im...
Lösung – Aufgabe 3<br />// Load Sound Effect<br />soundEffect = cm.Load&lt;SoundEffect&gt;(&quot;thunder&quot;);<br />// P...
Nachtrag Aufgabe 3<br />Pixel-Genaue Kollision zwischen Sprites<br />Collision Series auf creators.xna.com<br />
Sound & Musik<br />
Sound<br />Wiedergabe von Sound-Dateien (wav, mp3, wma)<br />SoundEffect- und Song-Klasse<br />Abspielen mittels Play() Me...
Sound<br />SoundEffect-Klasse bietet zusätzliche 3D-Sound Funktion (Play3D)<br />Sounds im 3D-Raum positionieren<br />Soun...
Musik<br />MediaPlayer-Klasse Funktionen zum:<br />Abspielen, Stoppen, Resumen von Songs<br />Abspielen einer Datei<br />M...
Upcoming SlideShare
Loading in …5
×

XNA Gaming Night Bonn

2,976 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,976
On SlideShare
0
From Embeds
0
Number of Embeds
209
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • IchentwickeleSpieleseitrund 10 Jahren, wobeinebeneinigenkleinerenProjektenmomentanimmernocheinEchtzeitstrategiespielnamens “Die Verbotene Welt” aktuellist. Gestartet ca. 2001, basierten die erstenVersionennoch auf DirectX 6 bzw. spaeter auf DirectX 7, wobei wir dann spaeter auf OpenGL umgestiegen sind, da unsere Grafiker, die komischerweise fast alle Mac Fans sind, auch mitspielen wollten. WegendieserUmstellungenund diversen Hardware Abstraktionslayern, die wirselberentwickelnmussten, sindwirauchimmernochdran, peilenabereinen Release vermutlichimnaechstenJahr an.Wermehrdaruebererfahrenmoechte, kannsichunterwww.sechsta-sinn.dedarueberinformieren.
  • XNA ist in der Tradition von Akronymen wie GNU ein rekursives Akronym und steht für „XNA`s Not Acronymed“. XNA ist ein Framework von Microsoft, dass seit 2006 erhältlich ist und die Spieleentwicklung auf Windows, Xbox360 und dem Zune (inklusive HD) ermöglicht. Es ist als Nachfolger von Managed DirectX zu sehen, dass ca. 2005 eingestellt wurde und ermöglicht grafische Ausgabe, Wiedergabe von Sounds und das Abfragen von Eingabegeräten.
  • KommerziellverfuegbareMiddlewareswie Unity oder die Unreal Engine bringen oft direktfertigeEditoren, ein Entity Konzeptfuer die Spielwelt, eineeigeneSkriptsprache und aehnlichesmit. Diese Engines bewegensichschonziemlichweitRichtungSpiele-Editoren und muessen in vielenFaellennur um gewisse, fuer das eigene Spiel wichtige, Funktionenergaenztwerden. Das ist XNA nicht. Wiegesagtstellt XNA die GrundfunktionalitaetenzurVerfuegung um die Hardware komfortabelanzusprechen, und um
  • XNA istsozusagen der inoffizielleNachfolger von Managed DirectX, dessenEntwicklung ~2005 eingestelltwurde.
  • Das XNA Framework umfasstverschiedeneKomponenten. Zugrundeliegeneinige Kern-Microsoft Technologien, wie DirectX, als Hardware Abstraction Layer und Interface zuGrafikkarten und allgemein das .NET Framework unter Windows bzw. das .NET Compact Framework auf der Xbox und dem Zune.
  • Das XNA Application Model nimmtunsvieleAufgabenab, die ehermit der HardwareabstraktionsschichtoderdemBetriebssystemselbstzutunhaben. Beispielweisesieht die Fenster + Grafikinitialisierungmit der VerwendungeinigerHilfen so aus [Animation]. Das sindalles in allem ca. 600 Zeilen Code, die unsnichtsliefernalseinleeresFenster.
  • Die meiste Interaktion haben wir als Programmierer mit der Game-Loop. Ein Spiel verhaelt sich bei der Behandlung der Benutzereingaben etwas anders als “normale” Software. Bei einer normalen Windows Forms oder aehnliches GUI Applikation reagieren wir normalerweise nur auf Events, wie z.B. ein Kontextmenu, einen Button oder einen Tastendruck. Bei einem Spiel muessen durchgehend Aktionen durchgefuehrt werden, es muss beispielsweise das Verhalten von computer-gesteuerten Charakteren berechnet werden, es muss die Physik der Spielwelt aktualisiert werden – wenn ein Objekt faellt, faellt es nicht nur, wenn der Benutzer etwas tut sondern solange bis es irgendwie angekommen ist. Daher befinden sich Spiele waehrend ihrer Ausfuehrung konstant in einer Schleife, der sogenannten Gameloop.In der Gameloop werden also durchgehend Aktionen ausgeführt wird:Eingaben des Spielers abfragen (Tastatur, Gamepad, Maus etc.)Physik berechnen => KollisionenKünstliche IntelligenzWelt, Charaktere, Objekte anzeigenInterface anzeigenDiese Aktionen lassen sich also grob in zwei Kategorien einteilen, einmal Aktionen die den Stand der Spielwelt/Spiellogik verändern und einmal Aktionen die die Spielwelt nur anzeigen, also nichts verändern sondern nur lesen. Die eigentliche XNA Gameloop besteht daher für uns aus zwei Funktionen:Update()Draw()
  • TODO
  • Debugging: Breakpoints in verzögern Spiel, verändern Update/Draw Reihenfolge
  • GameTime.IsRunningSlowlz
  • Assets werden bei XNA Projekten nicht im Original geladen, sondern erst von einem Content Processor in ein XNA eigenes Binaerformat (.xnb)konvertiert. Beim Ausführen des Spiels werden die Assets dann direkt aus diesem XNB Format geladen. Die Vorteile bestehen darin, dass gewisse Arbeitsschritte bereits beim kompilieren des Projekts erledigt werden können und nicht erst zur Laufzeit ausgefuehrt werden.
  • Jetztwollenwirendlich mal konkretetwastun und zwarein Sprite anzeigen. ImGrunde benötigen wir dazu nur zwei Schritte:
  • Der erste Schritt ist das Laden der Grafik. Beispielsweise wollen wir hier eine 2D Grafik namens Held.bmp laden. Dazulegenwirunseinfachein Texture2D Objekt an und laden mittels der Content Pipeline die Grafik.Wichtigisthierbei, dassbeim Laden keineDateiendungangegebenwird, also anstatt Held.bmp nur Held da – wirerinnernuns – die Content Pipeline unser Original-Bitmap in das XNA eigene Format ueberfuehrt hat, und dabei die Endungverlorengegangenistbzw. nichtmehrgebrauchtwird.Ansonsten muss man nochdaraufachten, dass man den Content wirklicherst in LoadContentlaedt und nichtbereitsim Constructor oder in Initialize, da die Content Pipeline dortnochnichtinitialisiertist.
  • Der naechsteSchrittistdann das anzeigen. Um 2D Grafiken auf den Bildschirmzubringenstellt XNA eineKlassenamensSpriteBatchzurVerfuegung. In der Draw Methodebekommenwireinsolchesdirektvom Framework uebergeben, muessenuns also keineigeneserstellen.Wie der Name bereitssagt, kanneinSpriteBatchObjektmehrere Sprites anzeigen, dazugibteseineRahmenstruktur und zwarmuessenalleOperationenmitdemSpriteBatchObjekt von einem .Begin und einem .End Aufruf
  • Im Code sieht das Ganzefolgendermaßen aus. Wir haben die Rahmenstruktur und dazwischen beliebig viele .Draw Aufrufe. Was diese Rahmenstruktur, die im Grunde ein Batch – wie der Name schon sagt – liefert, bringt, werden wir spaeter noch sehen. Das SpriteBatchObjekte hat diverse überladene .Draw Methoden, wobei die einfachsteeineTextur, einen Vector mit der PositionsangabesowieeineFarbeerwartet.
  • Das Ganzesolltihrjetzteinfach mal in einerkleinenAufgabeausprobieren. Erstellteuch in Visual Studio einneues XNA GamestudioProjekt und fuegtdanneineGrafikeuremProjekthinzu. Alsnaechstes die Grafik in der Draw Methodeanzeigen. Wennihr das geschaffthabt, koennteicheuchnochmal die ueberladungen von SpriteBatch Draw angucken und einmalversuchen die Grafik um den Mittelpunkt des Bildschirmsrotierenzulassen.
  • Also, wie mehrfahch gesagt, die SpriteBatch Draw Funktion ist mehrfach ueberladen. Die wichtigsten Effekte die man damit erzielen kann habe ich hier mal dargestellt.Ausschnitte kann man z.B. nutzen, um bei einer Animation mit vielen Stufen nicht fuer jedes Frame eine eigene Textur laden zu muessen…Rotation koennte man beispielsweise in einem Spiel wie Asteroids nutzen, in dem man ein Raumschiff von oben sieht und in alle Richtungen drehen kann. Damit man nicht Bilder fuer alle Richtungen basteln muss, kann man das Schiff einfach drehen. Ebenso wenn man ein Sprite vielleicht nicht unbedingt um den Mittelpunkt/Ursprung drehen moechte, kann man den Referenzpunkt, den origin angeben. Des weiterengibtesnochEffekte, so kann man beispielsweise das Sprite horizontal odervertikalspiegelnoderueber die Farbe das Sprite einfaerben, oder transparent darstellenlassen. Das Einfaerbenkoennte man beispielsweisenutzen, um auf sehreinfache Art und Weise verschiedeneGegnertypendarzustellen.ZuletztistesnochmoeglicheinelayerTiefeanzugeben, die istbei der Stapelverarbeitung von Sprites wichtig. [Folienwechsel]
  • SpriteBlendModeAdditiveAlphaBlendingNoneSpriteSortModeDeferred – Sprites werden in Queue des jeweiligenSpriteBatchObjektsaufgenommen (FtB, BtF – genauso, abermitSortierungnach Z; Texture – SortierungnachTextur)Immediate – Sprites werdensofortgerendertSaveStateModeSaveState – RenderStates VOR Begin() werdengespeichert und nach End() wiederhergestelltNone – GenauumgekehrtMatrixMatrix – Translate, Scale, Rotation angewendet auf alle Sprites des Batch Objekts
  • Lizensierung von Fonts, kannproblematischsein
  • Mausnatuerlichnurunter Windows
  • Nachdemwirunsbisheruns die erstenWegeangeguckthaben um Grafiken auf demBildschirmanzuzeigen und zubewegen, sollnatuerlich
  • Mittels XACT istesmoeglich, die Zuordnung von Events zu Sounds auszulagern. Das heisstihrdefinierte in Eurem Spiel, dassbeieinerbestimmenAktionbeispielsweiseein
  • XNA Gaming Night Bonn

    1. 1. Grundlagen<br />Christopher Schleideni-chschl@microsoft.com<br />
    2. 2. www.sechsta-sinn.de<br />
    3. 3. Agenda<br /><ul><li>Überblick
    4. 4. Grundlage/Fenstererzeugen
    5. 5. 2D Grafik laden/anzeigen
    6. 6. Eingabe(n) abfragen
    7. 7. 2D Sprite bewegen
    8. 8. Kollionsabfrage
    9. 9. Animation
    10. 10. Sound</li></li></ul><li>XNA ÜberBlick<br />
    11. 11. History<br />2006 Dez – XNA Game Studio Express 1.0<br />2007 April – XNA Game Studio Express 1.0 Refresh<br />2007 Dez – XNA Game Studio 2.0<br />2008 Okt – XNA Game Studio 3.0<br />2009 März – XNA Game Studio 3.1<br />
    12. 12. Was ist XNA?<br /><ul><li>XNA (XNA’s Not Acronymed)
    13. 13. Framework zur Spieleentwicklung (2D & 3D) für Windows, Xbox 360 und Zune (auch Zune HD)
    14. 14. Übernimmt Funktionen wie grafische Ausgabe, Wiedergabe von Audio-Dateien, Abfragen von Eingabegeräten</li></li></ul><li>Was ist XNA nicht?<br />“Spiele-Engine”/Midlewarewiez.B. Unity, Unreal Engine oderCryEngine<br />KeineSpielmechnismen, Level Editoren, Kollisionsbehandlung etc. <br />ABER:Viele Beispiele, komplette Spiele (Starter Kits) direkt von Microsoft zur freien Verwendung<br />
    15. 15. Entwicklung mit XNA<br />Entwickelt wird in C#<br />Keine DirectX Kenntnisse notwendig<br />Einzige andere wichtige Sprache ist HLSL (High Level Shader Language) zur Shaderprogrammierung<br />XNA Anwendungen <br />Managed Code, alles wird von CLR ausgeführt<br />rufen .NET und DirectX Funktionen auf<br />
    16. 16.
    17. 17. Application Model<br />Fenstermanagement<br />Initialisieren des Graphics-Device<br />Bereitstellen des Game-Loop<br />//<br />// init_d3d.cpp - Initializing Direct3D9<br />//<br />// Copyright 2004 by Ken Paulson<br />//<br />// This program is free software; you can redistribute it and/or modify it<br />// under the terms of the Drunken Hyena License. If a copy of the license was<br />// not included with this software, you may get a copy from:<br />// http://www.drunkenhyena.com/docs/DHLicense.txt<br />//<br />#defineWIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers<br />#include&lt;D3DX9.h&gt;<br />#include&quot;../common/dhWindow.h&quot;<br />#include&quot;../common/dhD3D.h&quot;<br />#include&quot;../common/dhUtility.h&quot;<br />#include&quot;../Common/dhUserPrefsDialog.h&quot;<br />// This is causes the required libraries to be linked in, the same thing can be accomplished by<br />// adding it to your compiler&apos;s link list (Project-&gt;Settings-&gt;Link in VC++),<br />// but I prefer this method.<br />#pragmacomment(lib,&quot;d3d9.lib&quot;)<br />#pragmacomment(lib,&quot;dxerr9.lib&quot;)<br />// Forward declarations for all of our functions, see their definitions for more detail<br />LRESULTCALLBACKdefault_window_proc(HWNDp_hwnd,UINTp_msg,WPARAMp_wparam,LPARAMp_lparam);<br />HRESULTinit_scene(void);<br />voidkill_scene(void);<br />HRESULTrender(void);<br />voidInitVolatileResources(void);<br />voidFreeVolatileResources(void);<br />// The name of our application. Used for window and MessageBox titles and error reporting<br />constchar*g_app_name=&quot;Initializing Direct3D9&quot;;<br />// Our screen/window sizes and bit depth. A better app would allow the user to choose the<br />// sizes. I&apos;ll do that in a later tutorial, for now this is good enough.<br />constintg_width=640;<br />constintg_height=480;<br />constintg_depth=16;//16-bit colour<br />// Our global flag to track whether we should quit or not. When it becomes true, we clean<br />// up and exit.<br />boolg_app_done=false;<br />// Our main Direct3D interface, it doesn&apos;t do much on its own, but all the more commonly<br />// used interfaces are created by it. It&apos;s the first D3D object you create, and the last<br />// one you release.<br />IDirect3D9*g_D3D=NULL;<br />// The D3DDevice is your main rendering interface. It represents the display and all of its<br />// capabilities. When you create, modify, or render any type of resource, you will likely<br />// do it through this interface.<br />IDirect3DDevice9*g_d3d_device=NULL;<br />//Our presentation parameters. They get set in our call to dhInitDevice, and we need them<br />//in case we need to reset our application.<br />D3DPRESENT_PARAMETERSg_pp;<br />}<br />//******************************************************************************************<br />// Function:init_scene<br />// Whazzit:Prepare any objects required for rendering.<br />//******************************************************************************************<br />HRESULTinit_scene(void){<br />HRESULThr=D3D_OK;<br />InitVolatileResources();<br />returnhr;<br />}<br />//******************************************************************************************<br />// Function:kill_scene<br />// Whazzit:Clean up any objects we required for rendering.<br />//******************************************************************************************<br />voidkill_scene(void){<br />FreeVolatileResources();<br />}<br />//******************************************************************************************<br />// Function: render<br />// Whazzit:Clears the screen and then presents the results.<br />// If we were doing any real drawing, it would go in this function between<br />// the BeginScene() & EndScene().<br />//******************************************************************************************<br />HRESULTrender(void){<br />HRESULThr;<br />//Clear the buffer to our new colour.<br />hr=g_d3d_device-&gt;Clear(0,//Number of rectangles to clear, we&apos;re clearing everything so set it to 0<br />NULL,//Pointer to the rectangles to clear, NULL to clear whole display<br />D3DCLEAR_TARGET,//What to clear. We don&apos;t have a Z Buffer or Stencil Buffer<br />0x00000000,//Colour to clear to (AARRGGBB)<br />1.0f,//Value to clear ZBuffer to, doesn&apos;t matter since we don&apos;t have one<br />0);//Stencil clear value, again, we don&apos;t have one, this value doesn&apos;t matter<br />if(FAILED(hr)){<br />returnhr;<br />}<br />//Notify the device that we&apos;re ready to render<br />hr=g_d3d_device-&gt;BeginScene();<br />if(FAILED(hr)){<br />returnhr;<br />//******************************************************************************************<br />// Function:WinMain<br />// Whazzit:The entry point of our application<br />//******************************************************************************************<br />intAPIENTRYWinMain(HINSTANCE,HINSTANCE,LPSTR,int){<br />boolfullscreen;<br />HWNDwindow=NULL;<br />D3DFORMATformat;<br />HRESULThr;<br />dhUserPrefsuser_prefs(g_app_name);<br />// Prompt the user, Full Screen? Windowed? Cancel?<br />// Prompt the user for their preferences<br />if(!user_prefs.QueryUser()){<br />dhLog(&quot;Exiting &quot;);<br />return0;<br />}<br />fullscreen=user_prefs.GetFullscreen();<br />// Build our window.<br />hr=dhInitWindow(fullscreen,g_app_name,g_width,g_height,default_window_proc,&window);<br />if(FAILED(hr)){<br />dhLog(&quot;Failed to create Window&quot;,hr);<br />return0;<br />}<br />//Build the D3D object<br />hr=dhInitD3D(&g_D3D);<br />if(FAILED(hr)){<br />dhKillWindow(&window);<br />dhLog(&quot;Failed to create D3D&quot;,hr);<br />return0;<br />}<br />//Find a good display/pixel format<br />hr=dhGetFormat(g_D3D,fullscreen,g_depth,&format);<br />if(FAILED(hr)){<br />dhKillWindow(&window);<br />dhLog(&quot;Failed to get a display format&quot;,hr);<br />return0;<br />g_app_done=true;<br />dhLog(&quot;Error rendering&quot;,hr);<br />}<br />}<br />//Free all of our objects and other resources<br />kill_scene();<br />//Clean up all of our Direct3D objects<br />dhKillD3D(&g_D3D,&g_d3d_device);<br />//Close down our window<br />dhKillWindow(&window);<br />//Exit happily<br />return0;<br />}<br />//******************************************************************************************<br />// Function:InitVolatileResources<br />// Whazzit:Prepare any objects that will not survive a device Reset. These are initialized<br />// separately so they can easily be recreated when we Reset our device.<br />//******************************************************************************************<br />voidInitVolatileResources(void){<br />//In this lesson there is nothing that needs to be done here.<br />}<br />//******************************************************************************************<br />// Function:FreeVolatileResources<br />// Whazzit:Free any of our resources that need to be freed so that we can Reset our device,<br />// also used to free these resources at the end of the program run.<br />//******************************************************************************************<br />voidFreeVolatileResources(void){<br />//This sample has no resources that need to be freed here.<br />}<br />//<br />//All rendering goes here<br />//<br />//Notify the device that we&apos;re finished rendering for this frame<br />g_d3d_device-&gt;EndScene();<br />//Show the results<br />hr=g_d3d_device-&gt;Present(NULL,//Source rectangle to display, NULL for all of it<br />NULL,//Destination rectangle, NULL to fill whole display<br />NULL,//Target window, if NULL uses device window set in CreateDevice<br />NULL);//Unused parameter, set it to NULL<br />returnhr;<br />}<br />//******************************************************************************************<br />// Function:default_window_proc<br />// Whazzit:This handles any incoming Windows messages and sends any that aren&apos;t handled to<br />// DefWindowProc for Windows to handle.<br />//******************************************************************************************<br />LRESULTCALLBACKdefault_window_proc(HWNDp_hwnd,UINTp_msg,WPARAMp_wparam,LPARAMp_lparam){<br />switch(p_msg){<br />caseWM_KEYDOWN:// A key has been pressed, end the app<br />caseWM_CLOSE://User hit the Close Window button, end the app<br />caseWM_LBUTTONDOWN://user hit the left mouse button<br />g_app_done=true;<br />return0;<br />}<br />return(DefWindowProc(p_hwnd,p_msg,p_wparam,p_lparam));<br />}<br />DWORDadapter=user_prefs.GetAdapter();<br />D3DDEVTYPEdev_type=user_prefs.GetDeviceType();<br />//Initialize our PresentParameters<br />dhInitPresentParameters(fullscreen,window,g_width,g_height,format,D3DFMT_UNKNOWN,&g_pp);<br />//Create our device<br />hr=dhInitDevice(g_D3D,adapter,dev_type,window,&g_pp,&g_d3d_device);<br />if(FAILED(hr)){<br />dhKillD3D(&g_D3D,&g_d3d_device);<br />dhKillWindow(&window);<br />dhLog(&quot;Failed to create the device&quot;,hr);<br />return0;<br />}<br />//One-time preparation of objects and other stuff required for rendering<br />init_scene();<br />//Loop until the user aborts (closes the window,presses the left mouse button or hits a key)<br />while(!g_app_done){<br />dhMessagePump();//Check for window messages<br />hr=g_d3d_device-&gt;TestCooperativeLevel();<br />if(SUCCEEDED(hr)){<br />hr=render();//Draw our incredibly cool graphics<br />}<br />//Our device is lost<br />if(hr==D3DERR_DEVICELOST||hr==D3DERR_DEVICENOTRESET){<br />dhHandleLostDevice(g_d3d_device,&g_pp,hr);<br />}elseif(FAILED(hr)){//Any other error<br />
    18. 18. usingSystem;<br />usingSystem.Collections.Generic;<br />usingSystem.Linq;<br />usingMicrosoft.Xna.Framework;<br />usingMicrosoft.Xna.Framework.Audio;<br />usingMicrosoft.Xna.Framework.Content;<br />usingMicrosoft.Xna.Framework.GamerServices;<br />usingMicrosoft.Xna.Framework.Graphics;<br />usingMicrosoft.Xna.Framework.Input;<br />usingMicrosoft.Xna.Framework.Media;<br />usingMicrosoft.Xna.Framework.Net;<br />usingMicrosoft.Xna.Framework.Storage;<br />namespaceWindowsGame1<br />{<br />publicclassGame1 : Microsoft.Xna.Framework.Game {<br />GraphicsDeviceManagergraphics;<br />SpriteBatchspriteBatch;<br />publicGame1() {<br />graphics=newGraphicsDeviceManager(this);<br />Content.RootDirectory=&quot;Content&quot;;<br /> }<br />protectedoverridevoidInitialize() {<br />base.Initialize();<br /> }<br />protectedoverridevoidLoadContent() {<br />// Create a new SpriteBatch, which can be used to draw textures.<br />spriteBatch=newSpriteBatch(GraphicsDevice);<br /> }<br />protectedoverridevoidUnloadContent() {<br /> }<br />protectedoverridevoidUpdate(GameTimegameTime) {<br />base.Update(gameTime);<br /> }<br />protectedoverridevoidDraw(GameTimegameTime) {<br />GraphicsDevice.Clear(Color.CornflowerBlue);<br />base.Draw(gameTime);<br /> }<br /> }<br />}<br />
    19. 19. Application Model<br />Initialize()<br />LoadContent()<br />UnloadContent()<br />Update()<br />Draw()<br />
    20. 20. GameloopBestandteile<br />UpdateAktualisiert die Spiellogik der Anwendung<br />DrawZeichnetveränderten Zustand der Anwendung auf den Bildschirm<br />
    21. 21. Timing<br />Default: Fixed-Timestep mit Ziel-Framerate 60 FPS<br />Pro Sekunde wird 60 mal Update aufgerufen<br />d.h. 16,67 Millisekunden pro Frame<br />So oft wie möglich dazu noch Draw<br />
    22. 22. Timing verwenden<br />Update und Draw besitzen ein GameTime Objekt<br />z.B. Zeitspanne zwischen zwei Aufrufen von Update() oder Draw()<br />protected override void Update(GameTime gameTime)<br />{<br />int elapsed = gameTime.ElapsedGameTime.Milliseconds;<br />}<br />
    23. 23.
    24. 24. Content Pipeline<br />Inhalte werden nicht im Original-Format geladen<br />Inhalte werden mittels Content Pipeline in eigenes XNA Format übersetzt (XNA Binary, .xnb)<br />Dabei werden diese für die Verwendung vorbereitet:<br />3D Modelle in XNA eigene Datenstruktur laden<br />z.B. 3D-Modelle mit Textur zusammenfügen<br />
    25. 25. Content Pipeline: Flow<br />
    26. 26. Vordefinierte Prozessoren<br />Unterstütze Formate:<br />Grafiken (.bmp, .jpg, .png, .dds, .tga)<br />3D Modelle (.x, .fbx, .obj)<br />Schriften (.spritefont)<br />Shader-Dateien (HLSL) (.fx)<br />Audio-Dateien (.wav, .wma, .mp3)<br />XACT-Soundprojekte (.xap)<br />
    27. 27. Content Pipeline: Importer/Processor<br />
    28. 28. Grafikenanzeigen<br />
    29. 29. 1. Inhalt laden<br />Grafiken (Sprites) werden durch Klasse Texture2D repräsentiert<br />Texture2D mySprite = Content.Load&lt;Texture2D&gt;(“Held”);<br />KeineDateiendungangeben!<br />Content in LoadContent laden<br />
    30. 30. 2. Anzeigen - SpriteBatch<br />2D GrafikenwerdenmittelsSpriteBatchgezeichnet<br />SpriteBatchkann 1 bis n Sprites mitgleichenEinstellungenzeichnen<br />Umschlossen von SpriteBatch.Begin() und SpriteBatch.End()<br />
    31. 31. 2. Anzeigen – SpriteBatch.Draw<br />spriteBatch.Begin();<br />spriteBatch.Draw( Texture2D, Vector2, Color ); …spriteBatch.Draw( Texture2D, Vector2, Color );<br />spriteBatch.End();<br />
    32. 32. Aufgabe 1<br />Sprite laden, anzeigen, in der Mitte des Bildschirmsrotieren (um Mittelpunkt der Grafik) und Rot färben<br />XNA GamestudioProjekterstellen<br />Grafik in Projekteinfügen (Unterpunkt Content)<br />Laden mit Content.Load<br />Mittels SpriteBatch und Draw Funktion anzeigen<br />Rotation: SpriteBatch.Draw ist mehrfach überladen<br />Mitte des Bildschirms: GraphicsDevice.Viewport.....<br />
    33. 33. Lösung – Aufgabe 1<br />private Texture2D MySprite;<br />private float RotationAngle = 0.0f;<br />// Load our sprite through the content pipeline<br />MySprite= Content.Load&lt;Texture2D&gt;(&quot;Controller&quot;);<br />// Update rotation according to elapsed time<br />RotationAngle+= (float)gameTime.ElapsedGameTime.TotalSeconds;<br />RotationAngle %= MathHelper.Pi * 2.0f;<br />
    34. 34. Lösung – Aufgabe 1<br />// Begin sprite drawing<br />spriteBatch.Begin();<br />// Position where the sprite should be displayed on the screen<br />Vector2 pos = new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2);<br />// Center point of rotation<br />Vector2 origin = new Vector2(MySprite.Width / 2, MySprite.Height / 2);<br />// Draw the sprite<br />spriteBatch.Draw(MySprite, pos, null, Color.Red, RotationAngle, origin, 1.0f, SpriteEffects.None,0f);<br />// End sprite drawing<br />spriteBatch.End();<br />
    35. 35. SpriteBatch.Draw Funktion<br />Ausschnitte<br />Rotation<br />Ursprung versetzen<br />Skalierung<br />Effekte (umdrehen der Grafik)<br />Einfärben der Grafik<br />Layer<br />
    36. 36. Stapelverarbeitung von Sprites<br />SpriteBatch.Begin()<br />Sprites anzeigen<br />SpriteBatch.End()<br />Begin ( SpriteBlendMode blendMode, SpriteSortMode sortMode, SaveStateMode stateMode, Matrix transformMatrix)<br /><ul><li>Additive
    37. 37. AlphaBlend
    38. 38. None
    39. 39. Deferred
    40. 40. BackToFront
    41. 41. FrontToBack
    42. 42. Texture
    43. 43. Immediate
    44. 44. SaveState
    45. 45. None</li></li></ul><li>BackBuffer<br />Gezeichnet wird auf ein sog. RenderTarget<br />RenderTarget ist ein Buffer in dem die Pixel eines Bildschirm gespeichert werden<br />Default RenderTarget wird auch BackBuffer genannt<br />
    46. 46.
    47. 47. BackBuffer<br />BackBuffer<br />FrontBuffer<br />
    48. 48. Eigenschaften des Displays<br />
    49. 49. Display<br />Auflösung ändern:<br />graphicsDeviceManager. PreferredBackBufferWidth = 1280;<br />graphicsDeviceManager. PreferredBackBufferHeight = 720;<br />Vollbild<br />graphicsDeviceManager.IsFullScreen = true;<br />Viewport<br />Teil eines RenderTargets, muss nicht gesamtes RenderTarget ausfüllen<br />
    50. 50. Text anzeigen<br />
    51. 51. Schrift anzeigen<br />XNA verwendet normale Windows TrueType Fonts<br />ContentPipeline erzeugt daraus Textur (SpriteFont)<br />Steuerung mittels XML-Datei<br />Font-Name<br />Font-Größe<br />Normal, Fett, Kursiv<br />Abstände<br />Zeichenbereiche<br />
    52. 52. SpriteFont<br />Laden<br />myFont= Content.Load&lt;SpriteFont&gt;(“XML-Datei”);<br />Anzeigen<br />SpriteBatch.DrawString(SpriteFont, String, Vector2, Color );<br />DrawString() ist ähnlich überladen wie Draw<br />
    53. 53. Nützliche Funktionen<br />Höhe und Breite eines Strings abfragen<br /> SpriteFont.MeasureString( String )<br />XNA Fonts<br />Kooten.ttf<br />Linds.ttf<br />Miramo.ttf<br />Bold Miramob.ttf<br />Peric.ttf<br />Pericl.ttf<br />Pesca.ttf<br />Pescab.ttf<br />
    54. 54. Eingabe<br />
    55. 55. Eingabe<br />XNA ermöglicht:<br />Mauseingaben Klasse: Mouse<br />Tastatureingaben Klasse: Keyboard<br />Xbox-Controller Klasse: Gamepad<br />Jeweils: GetState() Methode<br />
    56. 56. Eingabe: Tastatur<br />Tastenstatus abfragenKeyboard.GetState().IsKeyDown(Keys.Up)<br />Tastendruck abfragenKeyboardStatecurrentKBState = Keyboard.GetState();if( currentKBState.IsKeyDown(key) && !previousKBState.IsKeyDown(key) ) { … }previousKBState = currentKBState;<br />
    57. 57. Eingabe: Xbox-Controller<br />Thumbstick<br />GamePadState.ThumbSticks.Left / .Right<br />DPad / ButtonGamePadState.Buttons.DPadLeft…GamePadState.Buttons.A …<br />VibrationGamePad.SetVibration(…)<br />
    58. 58. Aufgabe 2<br />Sprite mitTastatur/Mausbewegen<br />Position des Sprites auf Bildschirmanzeigen<br />
    59. 59. Lösung – Aufgabe 2<br /> // Get new keyboard state<br />KeyboardStatekeyboardState = Keyboard.GetState();<br />// Calculate the amount of moving with the elapsed time since the last frame, this gives us framerate independent movement<br />float movement = (float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.5f;<br />// Left/Right<br />if (keyboardState.IsKeyDown(Keys.Left)) {<br />spritePosition.X-= movement;<br />}<br />if (keyboardState.IsKeyDown(Keys.Right)) {<br />spritePosition.X+= movement;<br />}<br />// Up/Down<br />if (keyboardState.IsKeyDown(Keys.Up)) {<br />spritePosition.Y-= movement;<br />}<br />if (keyboardState.IsKeyDown(Keys.Down)) {<br />spritePosition.Y+= movement;<br />}<br />
    60. 60. Lösung – Aufgabe 2<br />// Draw the sprite (White as color to disable any color effects)<br />spriteBatch.Draw(MySprite, spritePosition, Color.White);<br />// Text to display<br />string displayText = &quot;Position: &quot; + spritePosition.X + &quot; : &quot; + spritePosition.Y;<br />// Display text in upper left corner of viewport<br />Vector2 displayPosition = new Vector2(10, 10);<br />// Display text using our loaded Font and in red color<br />spriteBatch.DrawString(MyFont, displayText, displayPosition, Color.Red); <br />
    61. 61. Kollisionsbehandlung<br />
    62. 62. Mathematische Funktionen: Vektoren<br />Klassen Vector2, Vector3 und Vector4<br />Grundrechnenarten<br />Add(), Multiply(), etc.<br />Vector2.Distance()<br />Abstand zwischen zwei Vektoren<br />Vector2.Length()<br />Länge eines Vektors<br />Vector2.Reflect()<br />Veränderter Vektor nach einer Kollision<br />+ =<br />
    63. 63. Matrizen<br />Klasse Matrix für Transformation<br />Wird insbesondere bei 3D verwendet<br />Hilfsfunktionen:<br />Matrix.CreateRotation(...)<br />Matrix.CreateTranslation(...)<br />…<br />
    64. 64. Rectangles<br />
    65. 65. Kollisionen erkennen<br />
    66. 66. Aufgabe 3<br />Kollisionen mit einem anderen Sprite im 2D-Raum feststellen und diese behandeln<br />Kollisionserkennung implementieren, die verhindert, dass ein Sprite den sichtbaren Teil des Bildschirmes verläßt<br />
    67. 67. Lösung – Aufgabe 3<br />// Load Sound Effect<br />soundEffect = cm.Load&lt;SoundEffect&gt;(&quot;thunder&quot;);<br />// Play Sound<br />soundEffect.Play();<br />
    68. 68. Nachtrag Aufgabe 3<br />Pixel-Genaue Kollision zwischen Sprites<br />Collision Series auf creators.xna.com<br />
    69. 69. Sound & Musik<br />
    70. 70. Sound<br />Wiedergabe von Sound-Dateien (wav, mp3, wma)<br />SoundEffect- und Song-Klasse<br />Abspielen mittels Play() Methode<br />Werden mittels der Content Pipeline geladen<br />
    71. 71. Sound<br />SoundEffect-Klasse bietet zusätzliche 3D-Sound Funktion (Play3D)<br />Sounds im 3D-Raum positionieren<br />Sounds pitchen<br />Sounds loopen<br />
    72. 72. Musik<br />MediaPlayer-Klasse Funktionen zum:<br />Abspielen, Stoppen, Resumen von Songs<br />Abspielen einer Datei<br />MediaPlayer.Play(SongObject);<br />Musik-Dateien werden in einer Endlosschleife abgespielt<br />Kann durch eigene Musik von der Xbox360 „ersetzt“ werden<br />
    73. 73. Aufgabe 4<br />Wiedergabe von Sounds<br />Bei Bewegung eines Objektes<br />Kollision eines Objektes<br />Wiedergabe von Musik<br />Permanente Hintergrund-Musik<br />
    74. 74. Lösung – Aufgabe 4<br />soundEffect = Content.Load&lt;SoundEffect&gt;(&quot;thunder&quot;);<br />KeyboardStatekeyboardState = Keyboard.GetState();<br />if( keyboardState.IsKeyDown( Keys.Space ) && lastKeyState.IsKeyUp( Keys.Space ) )<br />{<br />soundEffect.Play();<br />}<br />soundSong = Content.Load&lt;Song&gt;(&quot;maid&quot;);<br />MediaPlayer.Play( soundSong );<br />
    75. 75. Alternative XACT<br />Cross-platform Audio Creation Tool<br />Tool zum Erzeugen von Sound-Cues<br />Erlaubt das Erstellen einer Vielzahl von Effekten und Sound-Kombinationen<br />Erstellte Cues werden im Quelltext nur noch abgespielt, keine weitere Programmierung nötig<br />
    76. 76. XACT<br />
    77. 77. Animationen<br />
    78. 78. Animationen<br />Charakteranimationtypischerweise: vieleeinzelne Frames<br />Möglichkeit 1: Texure2D pro Frame<br />Sinnvoller:<br />Große Textur mit allen Frames<br />Auswahl über Rectangle<br />
    79. 79. Animationsparameter<br />Animations-Geschwindigkeit<br />Anzahl der Frames<br />Größe eines Frames<br />Rectangle rc = new Rectangle();rc.Width = 175;rc.Height = 220;rc.X = (currentFrame % 4) * 175;<br />cc.Y = (currentFrame / 4) * 220;<br />175px<br />220px<br />
    80. 80. Aufgabe 5 – Animation<br />Sprite „BossWalkRight.png“ laden<br />Breite: 175px <br />Höhe: 220px <br />1 Animationsrichtung pro Zeile<br />6 Frames pro Animation<br />Lauf-Animation anzeigen<br />
    81. 81. Lösung – Aufgabe 5<br />constintSpriteFrameWidth = 175; constintSpriteFrameHeight = 220;<br />constintAnimationSpeed = 75; constintAnimationNumFrames = 6;<br />intanimationTimer;<br />intanimationFrame;<br />// Update<br />int elapsed = gameTime.ElapsedGameTime.Milliseconds;<br />animationTimer+= elapsed;<br />while( animationTimer &gt; AnimationSpeed) {<br />animationTimer-= AnimationSpeed;<br />animationFrame= (animationFrame + 1) % AnimationNumFrames;<br />}<br />Animationsparameter<br />
    82. 82. Lösung – Aufgabe 5<br />// Draw<br />Rectangle rect = new Rectangle();<br />rect.Width= SpriteFrameWidth;<br />rect.Height= SpriteFrameHeight;<br />rect.X= animationFrame * SpriteFrameWidth;<br />rect.Y= 1 * SpriteFrameHeight;<br />spriteBatch.Draw( texture, new Vector2( 0, 0 ), rect, Color.White);<br />
    83. 83. // animationsdatei für bunkermenschensoldatgewehr<br />// christopherschleiden2009<br />// ---------------------------------------------------------------<br />// anzahlframes gesamt<br />NUMFRAMES 70<br />// able_to == ALL, MOVE, ATTACK, SHOOT, DIE, NULL<br />// ----------------------------------------------------------------------------------------------------<br />//n namestanumreq go2 able_todelaystatecallname<br />// ----------------------------------------------------------------------------------------------------<br />// AUFRECHT BEWEGEN<br />// ----------------------------------------------------------------------------------------------------<br />0 steht 0 8 -1 0 NULL 100 STAND DEFAULT<br />1 begin_1 8 8 -1 2 MOVE 100 STAND MOVE_NORMAL_START<br />2 begin_2 16 8 1 3 MOVE 100 STAND<br />3 laufen_1 24 8 2 4 MOVE 100 STAND MOVE_NORMAL_RUN<br />4 laufen_2 32 8 3 5 MOVE 100 STAND<br />5 laufen_3 40 8 4 6 MOVE 100 STAND<br />6 laufen_4 48 8 5 7 MOVE 100 STAND<br />7 laufen_5 56 8 6 8 MOVE 100 STAND<br />8 laufen_6 64 8 7 3 MOVE 100 STAND<br />9 ende_1 72 8 -1 10 MOVE 100 STAND MOVE_NORMAL_END<br />10 ende_2 80 8 9 0 MOVE 100 STAND<br />// ----------------------------------------------------------------------------------------------------<br />// AUFRECHT STERBEN (HELDENTOD ;)<br />// ----------------------------------------------------------------------------------------------------<br />11 sterben_steht_1 456 8 0 12 NULL 250 DIE DIE_NORMAL<br />12 sterben_steht_2 464 8 11 13 NULL 250 DIE <br />13 sterben_steht_3 472 8 12 14 NULL 250 DIE<br />// das ist die zeit die die leiche liegen bleibt<br />14 tot_steht 480 8 13 66 NULL 60000 DIE<br />// ----------------------------------------------------------------------------------------------------<br />// AUFRECHT TRINKEN<br />// ----------------------------------------------------------------------------------------------------<br />15 trinken_1 184 8 0 16 NULL 100 STAND IDLE_1<br />16 trinken_2 192 8 15 17 NULL 200 STAND<br />17 trinken_3 200 8 16 18 NULL 500 STAND<br />18 trinken_2 192 8 17 19 NULL 200 STAND<br />19 trinken_1 184 8 18 0 NULL 100 STAND<br />// ----------------------------------------------------------------------------------------------------<br />// AUFRECHT HELM AB<br />// ----------------------------------------------------------------------------------------------------<br />
    84. 84. Game Components<br />
    85. 85. Quellen<br />Folienbasierenteilweise auf Originalen von Ingo Köster<br />
    86. 86. Resourcen - Grafiken<br />http://reinerstileset.4players.de/<br />http://www.ambrosine.com/resource.php#Graphics,%20Music,%20and%20Other%20Resources<br />http://www.flyingyogi.com/fun/spritelib.html<br />http://www.spriteworks.com/sworks.html<br />
    87. 87. Danke für Eure Aufmerksamkeit!<br />
    88. 88. Und jetzt…?Wettbewerb!<br />Um XX:XX kürt die fachkundige Jury das beste/interessanteste/spielbarste Spiel!<br />

    ×