Blitzmax Einsteigertut (Teil 1)

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

Abrexxes

Betreff: Blitzmax Einsteigertut (Teil 1)

BeitragDi, Sep 26, 2006 12:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallöchen. Mr. Green

Dies ist ein Einsteiger Tutorial für Blitzmax Neulinge. In den diversen Teilen werde ich jedem "willigen" Blitzmax etwas näher bringen. Wenn euch der Code zu "grün" ist dann verzweifelt nicht. Beim kopieren des Textes in die IDE (Benutzeroberfläche) eurer Wahl wird alles schön farbig und übersichtig.

Bevor Ihr also anfangt solltet Ihr erst mal eine ordentliche IDE anschaffen. Ich empfehle BlitzEdit2 oder BLIde. Beide kostenlos.

http://www.future-coding.de <--Blitzedit
http://www.blide.org <--BLIde

---Index-(Links)-----------------------------------------------
Teil 1 : Die ersten Schritte (Variablen/Schleifen/Input/Funktionen)
Teil 2
---------------------------------------------------------------

Weitere Helfer: Jan_ , Dremora , ...

*************************************************
Vieles ist identisch mit der englischen Version von "wave". Ich übersetze aber nicht mehr alles 1:1 sondern erweitere und mache einiges anders. Wer das englische Original lesen will, bitte:
http://www.blitzbasic.com/Comm...opic=42519
*************************************************

Bevor Wir beginnen zuerst etwas Theorie. Ihr müsst das nicht sofort verstehen, nachher wenn die Beispiele anfangen kommt alles nochmal und Ihr könnt das ganze nachlesen wenn was unklar ist. Auch ist Blitzmax sehr flexibel. Es gibt also immer mehrere Wege zum Ziel. Anderes ist nur eine Hilfe die Ihr annehmen oder lassen könnt. Um das ganze etwas kompletter zu machen spreche ich aber zumindest vieles kurz an mit Links für weitere Infos.

Nach diesem Teil solltet Ihr schon rumexperimentieren können, also ran.

Variablen

Eine Variable ist ein Platz im Speicher wo wir einen Wert oder einen Text speichern können. Es gibt verschiedene Arten von Variablen, je nachdem wofür sie genutzt werden. Die gebräuchlichsten Typen sind:
- Integer (speichern ganze Zahlen),
- Strings (speichern Text) und
- Floats (speichern Komma-zahlen).
Wir haben ebenfalls Objekt –Types die alles von Arrays, Listen bis hin zu unseren eigenen Types speichern können (mehr dazu später).

Wir überspringen hier einiges, schaut euch daher die Sprach-Referenz für weitere Informationen zu Variablen an.
Wenn du eine Variable erhöhen willst, sagen wir Speed (Tempo), kannst du schreiben :
Code: [AUSKLAPPEN]
Speed = Speed + Acceleration '(Beschleunigung)
Oder anders :
Code: [AUSKLAPPEN]
Speed+ Acceleration

Beides ist gleich. Es ist dringend empfohlen, wenn auch nicht vorgeschrieben, seine Variablen zu deklarieren bevor man sie verwendet.
Code: [AUSKLAPPEN]
Speed:Float=0, Acceleration:Int , Name:String="Start Name"

oder anders:
Code: [AUSKLAPPEN]
Speed#=0      , Acceleration       , Name$ = "Name"

Diese beiden Linien sind gleich, benutze was dir am meisten zusagt. Wie du sehen kannst, kannst du direkt einen Wert an die Variable übergeben. Gibts du keinen Type an (Acceleration) ist es automatisch eine Integerzahl. Gescheite Leute verwenden dann auch noch die "Ungarische Notation". Acceleration würde dann iAcceleration heisen. So sieht amn immer sofort das es sich im einen "int" Wert handelt und weist nicht aus versehen falsche Werte zu. (float= fSpeed/char= cName etc). Bei grossen Projekten eine gute Sache.
http://de.wikipedia.org/wiki/Ungarische_Notation

Info : Wenn du erzwingen willst das alle Variablen deklariert werden müssen, benutze das Kommando Strict.
So erhälst du einen Compiler Fehler wenn die Variable nicht wie folgt deklariert ist.
Code: [AUSKLAPPEN]

Strict
Local Leben:int , Spieler:String

Wenn du es also benutzen willst, deklariere alle Variablen. Ich empfehle Strict zu nutzen wenn du nicht gerade zu faul bist, oder nur kleine Beispiele machst. Es hilf dir Tippfehler zu finden bevor sie das Programm stören.
Wichtig :Blitzmax erkennt Speed, speed und sPeEd als GLEICHE Variable an. Dies geht mit allen Befehlen wie Rem oder reM.

Global oder Lokal

Eine Variable kann Global oder Lokal sein. Globale können von jeder Stelle im Programm genutzt werden. Lokale andererseits sind komplizierter weil sie nur da existieren wo sie auch deklariert wurden. Wenn du eine Lokale Variable benutzen willst setze das Schlüsselwort Local vordran. Wenn du eine Lokale in einer Funktion deklarierst gilt sie nur dort. Wenn sie in einer Schleife ist, nur solange du in dieser bleibst. In einer IF Bedingung, nur innerhalb derselben.

Konstanten

Du kannst auch Konstanten deklarieren (Const). Eine Konstante behält immer denn Wert der ihr zuerst zugeorndnet wurde. Sie sind keine Variablen weil sie es nicht zulassen dass man ihren Wert ändert. Dies kann gut sein wenn man einen Wert keinesfalls ändern sollte (Zb Kartengrösse). Wenn du versuchst eine Konstante zu ändern wird der Compiler dich warnen wenn du compilieren willst (das Programm ausführen).

Kommentare

Kommentare sind Texte die denn Code erklären (umschreiben/dokumentieren). Kommentare werden nicht gebraucht damit das Programm arbeitet. Es ist also etwas ohne das man leben könnte. Hier ein Beispiel :
Code: [AUSKLAPPEN]
Speed#=0 'Sets speed to zero

Das ' gibt an das der Rest der Zeile ein Kommentar ist. Du kannst auch folgendes benutzen :
Code: [AUSKLAPPEN]
Rem
Wenn du mehrere Zeilen dokumentieren oder auskommentieren willst.
End Rem

Kommentiere viel, es hilft anderen die deinen Code lesen und dir selbst. Du wirst eventuell manchmal vergessen wieso du diesen Weg gewählt hast oder wieso du diese Funktion benutzt hast und was sie tut. Wenn du Anfänger bist rate ich Dir jede Zeile zu kommentieren. Etwas zu umschreiben ist ein guter Weg es zu lernen, benutze Kommentare um genau dies zu tun wenn du neu bist.

If Bedingungen

If Bedingungen werden benutzt um festzustellen ob eine Bedingung erfüllt wurde um dann danach zu handeln. Dieses Beispiel tut nichts besonderes, es zeigt nur wie man If, Else If, Else und Endif (Wenn, Ansonsten wenn, Ansonsten und Ende der If Bedingungen) benutzt. A,B,C und R sind Variablen.
Code: [AUSKLAPPEN]

If A > 10  ' Wenn A grösser ist als 10 …
   A = 10  ' … setze A auf 10
Else If A < 0 And B => 2 ' Wenn A kleiner als 0 und B gleich oder grösser als 2 ...
   R:- 10  ' ... ziehe 10 von R ab (wenn R also 100 war ist R jetzt 90
Else ' Wenn keine der obigen Bedingungen erfüllt wurde mache das…
   A:+B  ' addiere B zu A oder erhöhe A mit B. Das heist: A = A + B
End If

Du kannst If Bedingungen auch in eine Zeile schrieben. Das ; Zeichen signalisiert einen neuen Ausdruck.
Code: [AUSKLAPPEN]

If A < 0 And C=2 Then B = 2 ; C=3; R:+5 else A=1; C:+1

Die obige Zeile ist das gleiche wie :
Code: [AUSKLAPPEN]

If A < 0 And C=2
   B = 2
   C=3
   R:+5
Else
   A=1
   C:+1
End if

Hinweis : Statt “End if” kann mann auch “EndIf” schreiben.

Then

Wann benutzen wir Then (Dann) . Ich selbst benutze es nie weil es nicht notwendig ist, und ich finde das der Code auch leicht ohne zu lesen ist. Zum Beispiel ist ( If A = 1 then B = 2 ) das gleiche wie ( If A = 1 B = 2). Wenn du aus einem Blitzmax Code alle rausnimmst, wird sich nichts ändern. Benutze Then wenn du glaubst das es dir beim lesen deines Codes hilft.

Not True or <> False?

True und False (richtig oder falsch) können in IF Bedingungen genutzt werden. Normalerweise um denn Code etwas übersichtlicher zu schreiben, notwendig sind sie jedoch nicht. False heist das irgendwas gleich 0 ist, True heist nicht gleich 0. Viele Funktionen geben bei Erfolg eine 1 zurück, bei Fehler 0. Dies kann mann bei einer If Bedingung so anwenden:
Code: [AUSKLAPPEN]
 If Keydown(Space) = True Then A = 10 Else A = 0

Dies ist das gleich wie:
Code: [AUSKLAPPEN]
If Keydown(Key_Space) Then A = 10 Else A = 0

weil immer davon ausgegangen wird das die Bedingungen richtig (=True) sein sollen. Du kannst auch Not nach einem If benutzen um zu sehen ob sie nicht richtig (also falsch) ist, zum Beispiel so :
Code: [AUSKLAPPEN]
If Keydown(Key_Space) = False Then...

oder auch :
Code: [AUSKLAPPEN]
If Not Keydown(Key_Space) Then...

was beides das gleiche ist. Du kannst auch Objekte mit
True und False abfragen. Wenn ein Objekt 0 ist (nicht existiert) ist es falsch ansonsten richtig.

Erste Grafiken

DrawRect, DrawOval, DrawLine, DrawText und Plot sind einige der vorhandenen Grafikbefehle. Der einfachste Weg Rechtecke, Ovale, Linien, Texte und Pixel zu zeichnen. Um Grafiken darzustellen, musst du zuerst die Grafikausgabe starten und die Auflösung angeben. Gib einfach Graphics 800,600 für einen Vollbildschirm mit der Auflösung 800x600 ein. Graphics 800,600,0 erzeugt denn Fenstermodus. Sehr gut für schnelle Tests. (Lies ruhig weiter, ein Beispiel folgt weiter unten.)

Schleifen

Eine Schleife (Loop) ist der Weg BM mitzuteilen, das er etwas mehrmals tun soll, oder im Spiel, das Spiel solange laufen zu lassen, bis es beendet ist (wird). Die folgende Schleife startet bei Repeat (Wiederhole). Wenn das Programm zu der Zeile Until X >= 600 kommt, wird es solange zu Repeat springen bis die Bedingung (X >=600) erfüllt ist. Die Dauer der Schleife hängt also von X ab.
Code: [AUSKLAPPEN]

Graphics 800,600 'Grafik Modus setzen
Repeat
    DrawRect X,40,10,12  ' 40 ist die Y Coordinate des Rechtecks
   '10 ist die Breite und 12 die Höhe desselben
    DrawText "- Bitte warten -",0,0    'Der Text zwischen "" wird bei 0,0 ausgegeben
   X:+1    'Bei jedem Durchgang X um 1 erhöhen
   Flip    'Zeigen was gezeichnet wurde
Until X >= 600     'Schleife verlassen wenn X ist gleich oder gröser als 600

Drücke F5 um das Programm zu compilieren und auszuführen. Der Code erzeugt eine Ladelinie am oberen Schirm. Setze ein Cls in eine neue Zeile unter Flip, und ein Rechteck wird von 0 nach 600 wandern, gemessen in Pixel. Ersetze auch einmal DrawRect durch DrawOval etc.

Flip und Clear

In Blitzmax wird alles was gezeichnet wird auf ein unsichtbares Board gelegt. Du kannst soviel darauf zeichnen wie du willst, es wird nicht zu sehen sein. Du kannst dir vorstellen das BM auf die Rückseite des Bildschirms zeichet, und wenn du es sehen willst drehst du das Board um (umdrehen=flip) und voilà, wir können sehen was wir gezeichnet haben. Wenn wir nun immer nur zeichnen und das Board dauernt drehen wäre es sehr verschmutzt. Deswegen müssen wir immer wieder löschen bevor wir neu drauf zeichnen (löschen=clear). Das bedeutet aber auch das wir ALLES neu zeichnen müssen was vorher auf dem Board war, nicht nur die Änderungen. Und das ist das Arbeitsprinzip. Dieses Board ist als Backbuffer bekannt. Du brauchst (und kannst) den Backbuffer nicht ein oder ausschalten (wie in B+ oder B3D). Diese Methode mit Flip und Clear nennt man Double Buffering und verhindert Grafikflimmern.

Das Koordinaten System

Dieser Teil ist in B+ und B3D gleich. Oben links auf dem Bildschirm haben wir den Punkt 0,0. Füge diese Zeilen in dem obigen Beispiel unter Repeat ein :
Code: [AUSKLAPPEN]

Plot 0,0        'Zeichnet einen Pixel oben links in die Ecke. Versuche auch 1,1
Plot 200,200 'Zeichnet einen Pixel bei 200,200 also zeichne bei X=200, Y=200

Die X-Axe ist die horizontale Axe von links nach rechts auf dem Schirm. Die Y-Axe ist die Vertikale und geht von oben nach unten. Die Auflösung gibt an wieviele Pixel diese Axen betragen. In unserem Beispiel ist die Bildschirmbreite (X) also genau 800 Pixel (Bildpunkte) breit. Die Höhe beträgt 600 Pixel.
Je mehr Pixel auf dem Bildschirm sind desto mehr Berechnungen sind nötig. Das gilt für 2D und 3D.
Das Line X1,Y1,X 2,Y 2 Kommando zeichnet eine Linie von X1,Y1 zu X2,Y2. Gib folgende Zeile in deinem Beispiel ein :
Code: [AUSKLAPPEN]

DrawLine 40,40,80,80 ;DrawLine 40,40,40,200'

Wichtig: Das ; Zeichen erlaubt es mehrere Befehle in eine Zeile zu schreiben.
Je mehr Pixel auf dem Bildschirm sind desto mehr Berechnungen sind nötig. Das gilt für 2D und 3D.
Das Line X1,Y1,X 2,Y 2 Kommando zeichnet eine Linie von X1,Y1 zu X2,Y2. Gib folgende Zeile in deinem Beispiel ein :

DrawLine 40,40,80,80 ;DrawLine 40,40,40,200'

Wichtig: Das ; Zeichen erlaubt es mehrere Befehle in eine Zeile zu schreiben.

Input

Input (Eingabe) ist ein einfacher und leichter Teil von Blitzmax. Wenn du dieses Schleifen Beispiel verstanden hast, gehört dir ein dickes Stück vom Kucken. Alternativ gibts einen fettes Keks Wink
(Wir reden hier von Tastatur und Maus Eingabe, nicht von dem Befehl Input)
Code: [AUSKLAPPEN]

Graphics 800,600
X=500;Y=500' <--- Start Punkt
' - - - - - - - - - - ANFANG SCHLEIFE - - - - - - - - - - - - -
While Not KeyDown(Key_Escape)
'Eine neue Schleifen Art genau wie Repeat, allerdings ist die Bedingung hier am Anfang (nicht am 'Ende)

   'ZEICHNE____________________________________________
   DrawOval X,Y,8,8 'Zeichen ein Oval bei X,Y mit 8 breite und 8 höhe
   DrawText "Drücke Pfeiltasten zum bewegen, Leertaste zum zentrieren",20,20
   
   'EINGABE_______________________________________
   If KeyDown(Key_Left)   X:-1  'Negiere  X <-- Nach links
   If KeyDown(Key_Right)   X:+1 'Erhöhe   X --> Nach rechts
   If KeyDown(Key_Down) Y:+1 'Erhöhe    Y   Nach unten \/
   If KeyDown(Key_Up)    Y:-1  'Negiere  Y   Nach oben  /\   
   If KeyHit(Key_Space) X=400;Y=300 'Setze Mitte
      
   Flip;Cls    
Wend
' - - - - - - - - -- - - ENDE SCHLEIFE - - - - - - - - - - - - -

Um den Code zu optimieren setze eine Variable namens Speed hinter Graphics aber vor die Schleife. Jetzt ersetze alle 1 durch die neue Variable Speed. Gehe zu deiner Variable (oben) und setze sie auf 5. Wenn du alles richtig gemacht hast wirst du merken das das Tempo sich erhöht hat.

Merke dir auch das jede Taste mit Key_ anfängt. Die A Taste ist zum Beispiel Key_A . Dies gilt für alle Buchstaben und Zahlen. Schaue in die Beschreibung um eine Tabelle aller Tasten zu bekommen. (Scan Code Sektion)

Funktionen

Eine Funktion ist ein Weg den Code mehrfach zu benutzen. Es kann auch dazu dienen den Code aufzuteilen in Teile die einfacher zu managen sind. Das Prinzip ist das gleiche wie in B+/B3D. So sieht eine Funktion aus :
Code: [AUSKLAPPEN]

Function Collectdata$( Name$, Id%,  Age% )' $ deklariert String (Text), % deklariert Int (Zahl)
   TotalData$ = "Name: "+Name+" ID: "+id+" Age: "+Age   
   Return TotalData
End Function

Um diese Funktion zu benutzen müssen wir ihr einen Namen, eine ID und ein Alter übergeben.
Nimm das Input Beispiel und füge diesen Teil hinter Graphics aber vor die Schleife ein :
Code: [AUSKLAPPEN]

TestData$ = Collectdata("Blast", 8, 30)

Jetzt füge die obige Funktion Collectdate unten oder am Anfang in den Code ein. Aber nicht in die Schleife! Schreibe noch folgendes in die Schleife :
Code: [AUSKLAPPEN]

DrawText TestData,20,40

Der Name,ID und Alter sind die Input Parameter der Funktion. Die Funktion gibt einen Text zurück. Eine Funktion kann jeden Datentyp inklusive Objekte und Arrays zurückgeben (Arrays sind Objekte in BM). Was zurückgegeben wird, wird hinter dem Funktionsname angegeben. Das $ steht in dem Fall für String. Wenn du hier das $ durch int (% oder :Int) ersetzt,also CollectData :Int(… wirst du eine Fehler erhalten. “Unable to convert from ‘String’ to ‘Int’ ” (Kann nicht von Text in Zahl umwandeln). Die Funktion gibt also aktuell eine String zurück aber du wolltest eine Integer Zahl. Das soll aber nicht heissen das du allgemein keine Strings zu Ints umwandeln kannst. Schau wir uns das an.

Für eine String/Int Umwandlung mache dies:
Code: [AUSKLAPPEN]
A% = Int( “123E234 –Dies ist ein String” )

Das Resultat : A = 123. Das gleiche mit Floats :
Code: [AUSKLAPPEN]
B# = Float(A), Resultat : B = 123.0


Hier ist ein anderes Beispiel einer einfachen Funktion :
Code: [AUSKLAPPEN]

'--------------------- Addieren----------------------
' Parameter: A,B,C ; zu addierende Zahlen
' Return: Die Summe dieser Zahlen
' Beachte: Es sind nur Integer erlaubt
'_______________________________
Function Add( A% , B% , C% = 0 )

   Return A + B + C

End Function
'-------------------------------------------------------

Resultat = Add(2,2,3), wird den Wert 7 ausgeben.
Resultat = Add(2,2), wird als Wert 4 ausgeben.

In der Funktion steht C=0, das heist das C automatisch 0 ist wenn kein dritter Wert angegeben wird. Wenn du C=0 nicht schreiben würdest, hättest du einen Fehler sobald du versuchst nur 2 Zahlen zu addieren. Sie würde aber einwandfrei mit Add(9,9,9) funktionieren.

Merke dir das es wichtig ist seine Funktionen zu kommentieren. Schreib auf was die Parameter sind, was sie zurückgibt und was sie eigentlich tun soll. Versuche immer deine Funktion komplett auf einen Bildschirm zu beschränken, wegen der Übersicht. Wenn sie zu gross wird versuche sie in mehrere Funktionen aufzuteilen. Du kannst Funktionen auch innerhalb anderer Funktionen benutzen.

Zum Abschluss des ersten Teils nochmal obiges komplett zum üben:

Code: [AUSKLAPPEN]

Graphics 800,600,1 'tata, jetzt mal im Vollbildmodus
X=500;Y=500' <--- Start Punkt

TestData$ = Collectdata("Blast", 8, 30)

' - - - - - - - - - - ANFANG HAUPTSCHLEIFE - - - - - - - - - - - - -
While Not KeyDown(Key_Escape)
'Eine neue Schleifen Art genau wie Repeat, allerdings ist die Bedingung hier am Anfang (nicht am 'Ende)

   'ZEICHNE____________________________________________
   DrawOval X,Y,8,8 'Zeichen ein Oval bei X,Y mit 8 breite und 8 höhe
   DrawText "Drücke Pfeiltasten zum bewegen, Leertaste zum zentrieren",20,20
   
   'EINGABE_______________________________________
   If KeyDown(Key_Left)   X:-1  'Negiere  X <-- Nach links
   If KeyDown(Key_Right)   X:+1 'Erhöhe   X --> Nach rechts
   If KeyDown(Key_Down) Y:+1 'Erhöhe    Y   Nach unten \/
   If KeyDown(Key_Up)    Y:-1  'Negiere  Y   Nach oben  /\   
   If KeyHit(Key_Space) X=400;Y=300 'Setze Mitte
   
    DrawText TestData,20,40
     
   Flip;Cls   
Wend
' - - - - - - - - -- - - ENDE HAUPTSCHLEIFE - - - - - - - - - - - - -

Function Collectdata$( Name$, Id%,  Age% )' $ deklariert String (Text), % deklariert Int (Zahl)
   TotalData$ = "Name: "+Name+" ID: "+id+" Age: "+Age   
   Return TotalData
End Function


Hier seht Ihr auch das die HAUPTSCHLEIFE immer das eigentliche Programm ist. Anfang und Ende davon. Smile
Genaue Beobachter haben auch nun festgestellt das BM im Normalfall kein ü zeigt (Drcke Pfeiltasten..) genau wie französiche éàè etc. Das ist kein Fehler, BM kennt halt im Normalfall (ohne Eingriff) nur die englischen Zeichen.

Auf lange Sicht werden gute Kommentierungen und das fleisige benutzen von Funktionen dir viel Zeit ersparen. Wenn übrigens keine Return Parameter wie in dem letzten Beispiel angegeben werden, geht BM automatisch davon aus das es einen Int-Wert zurück geben soll.

Dies war der erste Teil. Nun könnt Ihr mal entspannen um rumüben. Verändert, experimentiert...kaputt machen könnt Ihr nichts. Wenn Ihr das hier soweit verstanden habe, ist die Grundlage für alles weitere schon mal da. Ab jetzt werden wir nach und nach mehr kennenlernen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group