Blitzmax Einsteigertut (Teil 2)

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

Abrexxes

Betreff: Blitzmax Einsteigertut (Teil 2)

BeitragDi, Sep 26, 2006 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen

---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. Smile 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. Smile
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

BeitragDo, Jan 04, 2007 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

#Reaper

Newsposter

BeitragSa, März 03, 2007 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Finde das Tut auch sehr schön Smile
Aber Wild-Storm schließ ich mich mal an, ich bräuchte eine Erklärung von Methoden in Types, Funktionen kapier ich jetzt schon Smile (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 Sad

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

BeitragSa, Aug 25, 2007 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, hat mir sehr geholfen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group