Blitzmax Einsteigertut (Teil 2)
Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials
AbrexxesBetreff: Blitzmax Einsteigertut (Teil 2) |
Di, Sep 26, 2006 12:01 Antworten mit Zitat |
|
---|---|---|
---Index-(Links)----------------------------------------------- Teil 1 : Die ersten Schritte (Variablen/Schleifen/Input/Funktionen) --------------------------------------------------------------- Nach den Zufallszahlen wirds für Neueinsteiger etwas heftiger. aber keine Angst, nicht für alles braucht Ihr die ganze Palette der Möglichkeiten. Ihr solltet aber wissen das es sie gibt. Bedenkt auch das wir hier nicht "alle" Möglichkeiten von BM beleuchtet können. Für vieles gibt es spezielle Tutorials, von den zusätzlichen Modulen ganz zu schweigen. Zufallszahlen Ein sehr nützlicher Befehl ist Rand(A, B) welcher einen Zufallswert zwischen A und B ausgibt. Beispiel : Code: [AUSKLAPPEN] Test = Rand(1,3)
Dies wird Test auf 1,2 oder 3 setzen. Wenn du : Rand(A) mit nur einem Parameter aufrufst wird er dir einen Wert zwischen 0 und A zurückgeben. Test = Rand(1) wird also 0 oder 1 zurückgeben. (Rand steht für das englische Random = Zufall). Arrays Arrays sind eine Möglichkeit mehrere Variablen in einem Block zu speichern. Code: [AUSKLAPPEN] Local NameList$[] = [ "Dawn" , "Trac" , "Fire" ,"Nitro" ,"Nex"]'Dies erzeugt ein Array mit 5 Strings. Text$ = NameList[2] 'Gibt das zweite Element aus. Arrays starten bei 0, also gibt es uns hier "Fire". NameList[0] = "None" 'Setzt das Element 0 auf "None" (vorher “Dawn”) Eine schnellere Methode ist es die Werte einzeln anzugeben. Bei öfterem Gebrauch also Zeitgewinn. Code: [AUSKLAPPEN] ar:String[3] ar[0] = "Name" ar[1] = "Speed" ar[2] = "Armor" Arrays sind nützlich weil man in einer Schleife den gesamten Inhalt auslesen kann. Code: [AUSKLAPPEN] Row% = 0 For Local Name$ = EachIn NameList 'Die Variable "Name" wird jedes Element dieses Arrays speichern DrawText Name,20,Row*20 ;Row:+1 Next Hier ein Beispiel wie man auf die Schnelle Arrays erzeugt. Code: [AUSKLAPPEN] Global Name$[]'Array deklarieren Print "Start Array Test ----------" Name = ["Torm","Arth","Yire","Float","Stew","Sword","Dew","Flash","Lost","Temore"] PrintArray(Name) Print "---Jetzt nehmen wir dieses Array----------------" Name = ["Storm","Earth","Fire","Water","Moon","Sunshine"] PrintArray(Name) Function PrintArray(Arr$[]) For Local S2$ = EachIn Arr If S2 <> "" Print S2$ Next Print "Array Length was : "+Arr.length EndFunction Wichtig: Wie du siehst gibt es hier keine "Graphics" Anweisung. Es handelt sich um ein Consolen-programm. Wenn du zb BlitzEdit2 benutzt kannst du nach dem Starten unten bei "Ausgabe" das Resultat sehen. Ein Array kann mehr als eine Dimension haben. Code: [AUSKLAPPEN] Local Grid%[5,5] Dies erstellt ein zwei Dimensionales Array mit 5x5 Integer Elementen. Das heist das du 25 verschiedene Variablen drin speichern kannst. Um ein bestimmtes Element auszulesen schreibe : Code: [AUSKLAPPEN] A = Grid[X,Y] Denk daran das auch hier das erste Element jeweils 0 ist, nicht etwa 1. Ein 3x3 Array sieht also in X,Y so aus: Code: [AUSKLAPPEN] 0,0-1,0-2,0 0,1-1,1-2,1 0,2-1,2-2,2 Wenn du also den Wert in der Mitte haben willst lautet die Coordinate x=1 y=1 oder besser : Code: [AUSKLAPPEN] Mitte = Grid[1,1]
Um alle Elemente auszulesen musst du einen verschachtelten For/Next Loop erzeugen. (Eine Schleife in einer Schleife). Wichtig: Alle Elemente in einem Array müssen vom gleichen Typ sein. Code: [AUSKLAPPEN] For n = 0 To 4 For i = 0 To 4 Test[n,i] = Rand(3)' Setzt alle Elemente auf einen Zufallswert zwischen 0 und 3 Next Next Du kannst auch Multidimensionale Arrays erzeugen wie hier : Code: [AUSKLAPPEN] My_map%[][] = [ [1,1,1],[1,1,2],[2,3,4] ] Erzeugt ein 3x3 Feld mit allen Werten die angegeben sind. Arrays sind Objekte. Deswegen haben sie auch Methods (Methoden, sozusagen Hilfskommandos). Die nützlichsten davon sind lenght (grösse,anzahl) und sort (sortieren). Code: [AUSKLAPPEN] Name.Sort Das Array wird nach dem Alphabet sortiert werden , bei int/floats wird numerisch sortiert. Durch den Zusatz : Code: [AUSKLAPPEN] Name.Sort(false)
wird von hinten nach vorn sortiert. Code: [AUSKLAPPEN] Local Test[] = [7,4,32,19,94,5,5,77,39,1,24,5,6,3,8,19,5,3,3,2,5,18,8,2,221,3,4,5,63,87,12,92] Test.Sort For Nr = EachIn Test Print Nr Next Print "Lenght "+Test.length Dieses Beispiel zeigt wie mächtig und einfach Arrays in BM sind. Ich nutze Arrays nicht immer weil Blitzmax einen anderen Weg zum speichern von Daten besitzt. Einen Weg der extrem fexibel ist, und es erlaubt mit einfachem Code sowie Objekt Orientiertem Programmieren (OOP) zu arbeiten. Du kannst Arrays auch in deinen Types benutzen. Types Ein Type ist wie eine Struktur oder Blaupause einer Variablen. Es ist wie ein Grundgerüst das du einmal definierst und es dann für alle Tiere/Objekte benutzt die du erstellen willst. Types sind der Teil von Blitzmax die es zu einer OOP Sprache machen Types ist einer der am schwersten zu verstehenden Teile wenn du neu in OOP oder Programmierung allgemein bist. Mache eine neue Datei wenn du das folgende Beispiel probieren willst. Types (Objekte) deklarieren Sagen wir mal wir wollen ein Raumschiff machen, bilden wir also eine Struktur dafür. Code: [AUSKLAPPEN] Type Spaceship 'Deklariert einen neuen Type 'Das hier ist das was die Struktur enthält Global Fleet$ 'Flotte zb Kriegsflotte Field MaxSpeed# 'Maximale Geschwindigkeit Field Armor%=2000 'Geschosse (hier 2000) Field Name$ 'Schiffsname End Type' Ende der Deklaration Hier noch einmal genau das gleiche etwas anders : Code: [AUSKLAPPEN] Type Spaceship Global Fleet:String Field MaxSpeed:Float Field Armor:Int=2000 Field Name:String End Type Hier deklariere ich nun die Variable um “Ship”(unser erstes Raumschiff) zu benutzen. Code: [AUSKLAPPEN] Local Ship:Spaceship Nun sind wir bereit um ein neues Raumschiff zu erschaffen, welches eine Instanz unserer Struktur (Spaceship)sein wird. Code: [AUSKLAPPEN] Ship = New SpaceShip Um jetzt auf die verschiedenen Werte unseres Raumschiffs mit dem Namen Ship zurückzugreifen, benutzen wir einen Punkt. Den Punkt kannst du also wie “reinschreiben“ betrachten. Code: [AUSKLAPPEN] Ship.MaxSpeed = 3.5 'Setzt maximale Geschwindigkeit von Ship auf 3.5 Ship.Armor = 5000 Ship.Name = "Wavebreaker" Was ich hier gemacht habe ist nichst weiter als das ich eine Variable Ship deklariert habe die die Struktur Spaceship benutzen soll. Dann habe ich ein neues Raumschiff generiert das ein Objekt ist (eine Instanz von Spaceship) und dieses neue Raumschiff in die Variable Ship gelegt (seine Addresse). Ich kann nun die Werte dieses Objektes mit Ship.Fieldname verändern. Wenn ich kein neues Schiff deklariere (= New Spaceship) wird es den Wert 0 haben und keine Datenfelder (Leeres Objekt). Lass und ein zweites Schiff bauen. Code: [AUSKLAPPEN] Local Ship2:Spaceship = New SpaceShip 'Hier fasse ich 2 Schritte zusammen Ship2.MaxSpeed = 7.5 'Ich entschliesse mich die normale Schussanzahl zu nutzen, also 2000 (siehe SpaceShip-Type) Ship2.Name = "Starbreaker" Ich habe nun 2 Objekte des SpaceShip Types, Ship und Ship2. Ich kann diese Variablen wie jede andere Auch benutzen. Code: [AUSKLAPPEN] If Ship.MaxSpeed > 200 then... Gigantisch Wichtig :Wenn ich nun Ship2 auf die Werte von Ship setzten will und Ship2 = Ship angebe, werden beide nur noch als Ship vorhanden sein. Klartext : Blitzmax wird Ship2 automatisch löschen und es ist nicht mehr möglich auf Ship2 zurückzugreifen. Das Objekt Ship2 ist unwiderruflich verloren. Ship/Ship2 ist nur die Adresse dieser Objekte. Ein Objekt kann mehrere Zeiger auf sich gerichtet haben. Das Objekt selbst ist einzigartig, aber seine Adressen können in verschiedenen Variablen liegen. Denk darüber nach. Code: [AUSKLAPPEN] SpaceShip.Fleet = "Quantum Light" 'Bezieht sich auf die Globale des Types Print "Name: " +Ship.Name Print "MaxSpeed: " +Ship.MaxSpeed Print "Armor: " +Ship.Armor Print "Fleet Name: " +Ship.Fleet Print "---------------" Print "Name: " +Ship2.Name Print "MaxSpeed: " +Ship2.MaxSpeed Print "Armor: " +Ship2.Armor Print "Fleet Name: " +Ship2.Fleet Beachte die Globale Fleet$. Weil Fleet eine Globale im SpaceShip Type ist sind hier alle Instanzen von SpaceShip betroffen. Wenn ein SpaceShip seine Flotte ändert tun alle anderen es automatisch mit. Konstanten verhalten sich gleich, können aber nicht geändert werden. (Wie schon gesagt, wenn jetzt die Birne raucht, entspannen. Mit der Zeit wird das alles klarer. Am besten setzt du die Fragmente nun zusammen und experimentierst damit rum) List types Bis jetzt haben wir Types noch nicht mit voller Power genutzt. (Sehe ich da jemanden schwitzen?) Ich denke das beste an Types ist das jedes von ihnen in eine Liste gesetzt werden kann. Du kannst diese Liste dann schleifen und alle Types mit einer Schleife aktualisieren.Wenn du deine Types in eine Liste setzt musst du ihnen keine individuellen Namen geben. Schauen wir uns das mit einem neuen ausführbarem Beispiel an. Denk daran, in der IDE sieht das sauberer aus. Code: [AUSKLAPPEN] Global Number_of_Tanks = 10 'Wie viele Panzer sollen es denn sein ? 'Globale wie diese erlauben es auf einfachem Wege denn Ablauf des Programms zu ändern, 'zumindest in solchen kleinen Beispielen wie hier. Jetzt brauchen wir ein Panzer Type. Type Tank Field X#,Y# Field Dir%, Armor%=100 Field Speed#=0.2,Size%=25 Global TankNumber=0 'Die aktuelle Zahl der Panzer End Type Graphics 800,600 Global TankList:TList = CreateList()'Erzeugt eine Liste um alle Panzer zu speichern. 'TankList:TList deklariert TankList als List-Type, CreateList() gibt eine Liste zurück. 'Die variable TankList wird jetzt immer benutzt wenn diese TList erweitert, verkleinert oder verändert 'werden soll. 'Tlist ist ein internes Type von Blitzmax, es hat daher seine eigenen Methoden und Funktionen. 'Lass uns Panzer bauen. For Nr = 1 To Number_of_Tanks ' Number_of_Tanks ist obige Globale Local NewTank:Tank 'Delariert eine Variable für unseren Panzer-Type NewTank = New Tank 'Gibt die Adresse des neuen Panzers an diese Variable 'Wir setzten die einzelnen Werte dieses Panzers NewTank.Armor = Rand(1,5)*10 'Erzeugt eine Zufallsbewaffnung 10,20,30,40 or 50 NewTank.X = Rand(5,800) ;NewTank.Y = Rand(5,600)'Zufalls Startposition NewTank.Dir = Rand(0,360) 'Zufalls Richtung ListAddLast TankList,NewTank 'Gibt den neuen Panzer in die Panzerliste ein. Tank.TankNumber:+1 'Die Panzeranzahl wird um 1 erhöht Next While Not KeyDown(Key_Escape) For T:Tank = EachIn TankList 'Lokale T hält jeweils den aktuellen Panzer in der Schleife DrawRect(T.X,T.Y,T.Size,T.Size) DrawText "Number of Tanks : "+Tank.TankNumber,20,20 T.X:+T.Speed*Cos(T.Dir) T.Y:+T.Speed*Sin(T.Dir) Next 'Dieser Loop wird für jeden Panzer in der Liste ausgeführt, bis zum letzten. Flip ;Cls Wend Versuche hier als kleine Übung eine Zeile einzufügen die jeweils die Bewaffnung des Panzers anzeigt (Armor). Achte hierbei auf die Variable T. Auch verbietet hier keiner ausgiebiges Experimentieren. ***vorläufiges Ende*** |
||
Wild-Storm |
Do, Jan 04, 2007 14:16 Antworten mit Zitat |
|
---|---|---|
Wow cooles Tutorial, schön geschrieben!
Was mir noch fehlt ist der Umgang mit Methods/Funktionen innerhalb eines Types. |
||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
#ReaperNewsposter |
Sa, März 03, 2007 14:47 Antworten mit Zitat |
|
---|---|---|
Finde das Tut auch sehr schön
Aber Wild-Storm schließ ich mich mal an, ich bräuchte eine Erklärung von Methoden in Types, Funktionen kapier ich jetzt schon (glaube ich ^^) Btw: Muss man eigentlich das so machen Ship2:Spaceship = New SpaceShip oder kann man auch das :Spaceship weglassen? Hab es jetzt schon andauernt anders gesehen Oder auch bei den TLists: Global TankList:TList = CreateList() oder auch Global TankList:TList = New TList ?? Oder z.B.. eine Interger zu nem String: Global bla$ = String(x%) odeer String.fromInt(x%) (ist % noch für Integer, oder?) |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
timmeTheOnly |
Sa, Aug 25, 2007 14:54 Antworten mit Zitat |
|
---|---|---|
Danke, hat mir sehr geholfen. | ||
Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials
Powered by phpBB © 2001 - 2006, phpBB Group