Xna Einsteiger Tutorial - VB
Transcription
Xna Einsteiger Tutorial - VB
Xna Einsteiger Tutorial Inhaltsangabe Was ist Xna – Was kann Xna Alles Xna Download Graphicsdevice erstellen Unser Anfang in Xna Wie ist sowas zu Realisieren Hintergrund erstellen Spieler malen und bewegen Seite Seite Seite Seite Seite Seite Seite 1 2 1 – 4 4 - 5 5 – 6 6 6 Was ist Xna? Xna ist ein von Microsoft Entwickeltes Framework um Spiele zu Programmieren. Xna ist gedacht für C# aber man kann es auch in Visual Basic und wahrscheinlich auch in vielen anderen Programmiersprachen benutzen da diese Funktionen in Dlls ausgelagert sind! Warum sollte ich Xna benutzen? Das ist eine gute Frage! Xna stellt eine menge von Klassen schon vorgefertigt da zum Beispiel wie man 2D Objekte zerstört, einen Laserstrahl schießt und so weiter, trotztdem hat man noch eine ziehmlich Große auswahl an möglichkeiten. Xna ist schneller als GDI ist also für die Spieleprogrammierung besser geeignet! Was kann man mit Xna alles machen? Mit Xna kann man 3D aber auch 2D Spiele entwickeln. Man kann 2D Texturen z.b. für den Boden eines 3D Spiels benutzen! Da das ein großer ansporn ist habe ich eine kleine Liste von Links zusammengestellt wo ich denke das jeder gerne so ein Spiel entwickeln möchte, hier die Links: http://www.xnamag.de/uploads/iow/2521624732_iow.jpg http://www.xnamag.de/uploads/iow/2521281472_iow.png http://www.xnamag.de/uploads/iow/2463725518_iow.jpg http://www.xnamag.de/uploads/iow/2520209488_iow.png Oder mal 3D aber richtig Professionell: http://www.xnamag.de/uploads/iow/2510362060_iow.jpg Video: http://www.youtube.com/watch?v=qoZaYnXC8Yg&feature=player_embedded Hier mal ein Video eines Spiels von Microsoft entwickelt mit Xna: http://www.youtube.com/watch?v=TgChURF5fQE http://www.youtube.com/watch?v=rRGMcFswwik Oder auch Need for Speed in Xna Gemacht: http://www.youtube.com/watch?v=uc_bNFG3IQ4 Xna Downloaden Bevor ihr fortfahrt müsst ihr sicherstellen ob ihr Xna auf euren Computer habt, wenn nicht dann installiert es bitte hier der Download link: http://www.chip.de/downloads/Microsoft-XNA-Game-Studio-Express-1.0_24654414.ht ml Viel Spaß! Graphics Device erstellen in Visual Basic So jetzt fangen wir mit den eigentlichen Teil an, wir erstellen das Graphics Device und definieren es so das wir praktisch fast die Codes von C# hier benutzen können. Dieses Device muss man in C# nicht benutzen da dieses schon Vordefiniert ist. Also fangen wir an: Wir gehen auf Datei - Neues Projekt und erstellen es mit den Typ Konsolenanwendung aber das ändern wir noch so ab das die Konsole nicht angezeigt wird. So jetzt sollte bei euch im Projektmappenexplorer eine Module.vb sein also so: Soo jetzt macht ihr rechtsklick darauf und dann sollte dort so ein Kontextmenustrip erscheinen: So jetzt klickt ihr auf Umbenennen und ändert den namen auf Program.vb (das ist eigentlich nicht wirklich nötig aber so siehts in C# auch aus und ihr werdet immer öfter mitbekommen das ihr manchmal C# Codes bekommt und diese dann Teilweise selber übersetzten müsst dann ist es einfacher wenn es bei euch genau so aussieht! So soweit so gut, wir gehen jetzt oben im Menustrip auf Projekt und auf Projekt eigenschaften! Da seht ihr jetzt ein Label mit den Text Anwendungstyp: und darunter eine Combobox, in der Combobox wählt ihr Windows Forms Application und darunter steht Module1 und ihr wähtl in der Combobox Sub main. Jetzt ist das Game keine Konsole mehr und ihr könnt Fortfahren Jetzt fügt ihr über Projekt -> Verweis hinzufügen folgende Verweise hinzu: Microsoft.XNA.Framework version 3.0 Microsoft.XNA.Framework.Content.Pipline version 3.0 Microsoft.XNA.Framework.Game version 3.0 Bitte achtet darauf das es wirklich auch alle 3.0 sind! Dann fangen wir jetzt mit den richtigen Code an! Wir erstellen jetzt über Projekt -> Klasse hinzufügen.. eine neue Klasse hinzu diese nenennen wir dann gleich Game1.vb. Jetzt steht bei euch nur Public Class Game1 und End Class. Über Public Class fügt ihr folgende Imports hinzu: Imports Microsoft.Xna.Framework Imports Microsoft.Xna.Framework.Content Imports Microsoft.Xna.Framework.Game Imports Microsoft.Xna.Framework.Graphics Das sind die Imports einmal Das Framework überhaupt, die Graphics für die Texturen, Game dafür das auch siehe später das Modul funktioniert (was nicht angezeigt wird), und Content damit wir auch die Texturen laden können! Soo jetzt seid ihr schon ziehmlich weit gekommen. Jetzt unter Public Class Game1 noch folgendes: Inherits Game Jetzt ist es auch ein richtiges "Game" also aus der Klasse Microsoft.xna.Framework.Game Jetzt kommt unter inherts Game noch die Deklarationen: Dim graphics As GraphicsDeviceManager So jetzt kommt die Sub new diese Tritt auf wenn wir im später im Modul das Game starten bzw. als new Deklarieren. Also folgende sub: Public Sub New() graphics = New GraphicsDeviceManager(Me) Content.RootDirectory = "Content" graphics.PreferredBackBufferWidth = 1280 graphics.PreferredBackBufferHeight = 720 graphics.IsFullScreen = False End Sub Diese sagt dass graphics ein neues Graphicsdevice sein soll und das ganze in der Klasse Game1.vb (besser gesagt dort wird ein Game angegeben und die Klasse ist das Game) Content.RootDirectory ist das Directory wo alle Texturen mit Content.Load drausgeladen werden können. Ihr wissen ihr habt jetzt im Game selber keine Graphische Oberfläche mehr! Danach weil es sonst nicht so schön aussieht haben wir die Anwendung in Fullscreen gestartet! So jetzt die nächste sub Intalize Protected Overrides Sub Initialize() MyBase.Initialize() End Sub Diese Sub tritt auf wenn Mybase.Intalize aufgerufen wird das ist genauso wie bei C# da könnte man also auch sachen deklarieren aber dafür empfehle ich New oder Später auch LoadContent Unsere Nächste Sub wäre dann die Loadcontent. Protected Overrides Sub LoadContent() ' Texturen laden End Sub Hier können jetzt die Texturen geladen werden bzw. sachen Deklariert werden. Jetzt kommen wir zur UnloadContent diese wird aufgerufen wenn das Spiel verlassen wird. Also hier die Sub: Protected Overrides Sub UnloadContent() End Sub Jetzt kommen wir zu der Update Methode diese wird aufgerufen wenn sich was im Spiel verändert: Protected Overrides Sub Update(ByVal gameTime As GameTime) MyBase.Update(gameTime) End Sub So und jetzt unsere Letze Sub Die Draw Methode der Titel sagt eigentlich schon alles, hier werden die 2D oder auch 3D Texturen Models oder was auch immer Gedrawt!: Protected Overrides Sub Draw(ByVal gameTime As GameTime) graphics.GraphicsDevice.Clear(Color.CornflowerBlue) ' Hier gehts dann bei 2D weiter! Hier wird Gemalt usw. MyBase.Draw(gameTime) End Sub Jetzt gehen wir nur noch ín die Module1 und hauen folgenden Code in die Sub main: Using game As New Game1 game.Run() game.Dispose() game.Exit() End Using Jetzt wisst ihr wovon ich ganzezeit mit New() gesprochen habe wir haben jetzt nähmlich Game als neues Game1 deklariert. So wenn ihr jetzt Debuggt sollte es bei euch so aussehen: Unser Anfang in 2D So jetzt ist es soweit jetzt kommen wir zu der eigentlichen Spieleprogrammierung! In diesen Abschnitt des Tutorial habe ich nochmal eine kleine liste von dingen erstellt die ich euch zeige wie es geht: Wie kann man sowas realisieren? Spieler bewegen So let's go! Wie kann man sowas realisieren? Diese frage sollte sich jeder stellen, wie kann man sowas realisieren? Was will ich überhaupt machen? Das ist immer eine gute Frage, in unseren fall machen wir es so ein kleines Mini Spiel mit Kollision wo man einen Spieler über eine kleine Karte bewegen kann und die Maps stehen in einer Datei. In der Spieleprogrammierung ob in 2D oder auch in 3D ist es wichtig das man lernt Klassen zu benutzen d.h. einzelne Structuren vielleicht auch Variablen des Games in Klassen auszulagern. Was ich euch empfehle ist auch Option Strict On das schreibt ihr ganz einfach über jedes Document was ihr erstellt, wenn ihr es sonst noch nie benutzt habt dann wird es für euch etwas schwer fallen aber da möchte ich euch sagen es ist eigentlich ganz einfach. Ihr werdet vielleicht sowas sehen wie Typ String kann nicht in Char umgewandelt werden aber auch so wird euer Code sauberer. Nehmen wir uns ein Beispiel, wir haben folgende schleife: Dim spl As String = "Hallo" & vbnewline & "Welt" For each trennung As String in spl.Split(vbcrlf) ' hier irgendwas Next und er zeigt euch genau das an was ich oben beschrieben habe. Dann müsstet ihr folgendes machen: Dim spl as string = "Hallo" & vbnewline & "Welt" For each trennung as String in spl.Split(Convert.ToChar(vbcrlf)) ' hier irgendwas Next Sowas ist immer gut und damit ist der Abschnitt realisierung auch zuende. Deklarationen in 2D So jetzt müssen wir um richtig zu zeichnen auch deklarieren was ist immer eine gute Frage. Da wir 2D benutzen nehmen wir eine Spritebatch Also folgende deklaration: Dim spriteBatch As SpriteBatch Vielleicht fragen sich jetzt einige wieso Sprite? Was ist das? Damit soll nach meiner Meinung nach etwas wie lebendiges Object oder auch nach wikipedia Geist gemeint sein. Auf die Spritebatch zeichnen wir später alle unsere sachen drauf! Also jetzt kommt in die Load Content: spriteBatch = New SpriteBatch(GraphicsDevice) So jetzt ist die Spritebatch deklariert jetzt machen wir nur noch folgendes in die Draw Sub aber unter Graphicsdevice.Clear: spriteBatch.Begin() ' Hier werden Die Texturen gezeichnet spriteBatch.End() Soo jetzt gehts weiter zum nächsten Abschnitt. Hintergrund erstellen Da wir unser 2D Game ganz schön haben wollen erstellen wir einen Hintergrund dafür, größe 1280 Breite und 720 höhe, genauso groß wie dir Form. Bisschen weiter unten ist der Link zu meinen Background. Also erstmal deklarieren wir unter Public Class: Dim Background As Texture2D So der Background wär jetzt die Texture jetzt müssen wir ihn nur noch in der Load Content deklarieren damit der auch weiß welchen Background er nehmen soll, also ins Load Content: Background = Texture2D.FromFile(GraphicsDevice, "Pfad") Natrülich müsst ihr den Pfad durch euren Pfad ersetzen zum Backgroundbild. So jetzt gehen wir zum Zeichnen. Ihr geht also zu der Draw Sub und wo steht ' Hiwer werden Die Texturen gezeichnest da fahren wir gleich fort das ist zwischen sprtiebatch.Begin() und Spritebatch.End(). Also dort kommt folgender Code rein: spriteBatch.Draw(Background, New Vector2(0, 0), Nothing, Color.White) Jetzt haben wir in die Spritebatch die in Content Load mit der GraphicsDevice verbunden wurden ist den Background draufgezeichnet mit den koordinaten 0, 0 und die größe des Bildes. Bei mir sieht der Background so aus: http://file1.npage.de/005127/98/bilder/background_-_kopie.jpg Könnt ihr auch frei verwenden wie ihr wollt ist eigentlich der Standart Xna Himmel mit Umgekehrten farben. So jetzt gehen wir zum nächsten Abschnitt! Spieler malen und bewegen In diesen Abschnitt zeige ich euch wie ihr den Spieler bewegt nach links und rechts das andere sollte selbst erklären sein. Was ich erstmal sagen muss das das mit den Springen in Xna ist immer so eine sache für sich -> man muss sich etwas mit Physik auskennen kurz gesagt man muss mehr rechnungen erstellen wie z.b. die Geschwindikeit des Spielers und der Luftdruck um einen Perfekten Sprung hinzubekommen, da das für den Anfang noch etwas für Kompliziert ist lasse ich Springen weg und wir haben Links und Rechts. Aber soweit sind wir ja noch garnicht wir müssen erst den Spieler zeichnen. Das geht ähnlich wie mit den Hintergrund, erstmal Deklarieren wir folgendes unter Public Class: Dim Hero As Texture2D Dim Position As New Vector2(1, 500) ' Startposition des Spielers Das wird dann unser Held (Hero) und haben in Vector die Startposition geschrieben. Jetzt kommt nur noch in die Load Content: Hero = Texture2D.FromFile(GraphicsDevice, "Pfad") Und in die Draw Methode und jetzt aufpassen UNTER Spritebatch.Draw(Background kommt folgendes: Spritebatch.Draw(Hero, Position, Nothing, Color.White) Jetzt wird der Spieler immer dorthin gemalt wo die Position ist! Soweit so gut jetzt wollen wir aber den Spieler mit der Pfeiltaste Links und Rechts bewegen können! Dafür müssen wir in Visual Basic meineswissens jetzt zur GetAsyncKeystate aus der User32 Api greifen. Also folgende Deklaration: Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Boolean Das ist die Api Jetzt können wir einfach ins Update ereignis folgenden Code tun: If GetAsyncKeyState(Windows.Forms.Keys.Left) Then HeroGoLeft() ElseIf GetAsyncKeyState(Windows.Forms.Keys.Escape) Then [Exit]() ElseIf GetAsyncKeyState(Windows.Forms.Keys.Right) Then HeroGoRight() End If Aber bitte vor My.Base ... Jetzt wenn man Escape drückt beendet er das Game wenn man Pfeilrechts drückt geht er nach rechts Pfeil Links nach links aber das ganze passiert erst wenn wir unsere Subs haben. Fangen wir an mit der HeroGoLeft() Also Folgende Sub: Public Sub HeroGoLeft() Position = New Vector2(Position.X - 2, Position.Y) ' ggf mehr events einfügen End Sub Diese sagt das Position ein neuer Vector sein soll mit den Koordinaten von jetzt aber X ist -2 das heißt er läuft nach links. Jetzt die HeroGoRight() sub: Public Sub HeroGoRight() Position = New Vector2(Position.X + 2, Position.Y) ' ggf mehr events einfügen End Sub Das ist genau so wie vorher nur umgekehrt. Jetzt kann die Figur schon nach Rechts und Links gehen. In meinem nächsten Tutorial zeige ich euch wie ihr mit xna 2D Kollision anstellen könnt!