Spaceshooter Spielerfigur und Schüsse erstellen mit Erklärung

Previous topic - Next topic

jasper111

>>Vorab, erstellen wird mit zwei l's geschrieben<<

Hallo zusammen,

nach meiner Frage nach einem Tut, hab ich mir mal das Video von Gernot angesehen.

Habe dann quasi alles nach gearbeitet und dabei ist der folgende Code rausgekommen.

Bitte mal kontrollieren und ich wäre dankbar wenn mir jemand noch die FOREACH Abfrage erläutern könnte.
Code (glbasic) Select
// --------------------------------- //
// Project: letzter versuch
// Start: Friday, February 15, 2008
// IDE Version: 5.172


GLOBAL playery = 400
GLOBAL playerx = 200
//---------------------------------------------------------------------------------------
LOADSPRITE "../thomas/raumschiff.png", 0

LOADSPRITE "../thomas/asteroid.png", 2

LOADSPRITE "../thomas/laser.png", 1

//--------------------------------------------------------------------------------------
TYPE SCHUSS //SCHUSS mit feld >>x<< und Feld >>y<< vormerken
x
y
ENDTYPE
//---------------------------------------------------------------------------------------

LOCAL schuesse[] AS SCHUSS    //schuesse[] als variable(veränderbar) AS(als) SCHUSS

//---------------------------------------------------------------------------------------
WHILE TRUE //wenn wahr dann......

//---------------------------------------------------------------------------------------

IF KEY(203) THEN playerx =playerx -2 // Bewegung des Spieler Raumschiffes
IF KEY(205) THEN playerx =playerx +2 //Tasten druck wird geprüft und wenn ja(while true) dann minus oder plus nach links oder rechts
//---------------------------------------------------------------------------------------

playerx = MAX(MIN(playerx,600),16)  //Begrenzung des Spielers auf die x-Achse des Spielfeldes zwischen 16
    //und 600 (16 = 16 pixel vom linken Rand weg und 600 = rechter Rand)
   
//---------------------------------------------------------------------------------------    

LOCAL schuss AS SCHUSS //nach dem Abschuss wird der schuss als Neuer SCHUSS der widerum als variable schuesse[]
   //,(wir erinnern uns,SCHUSS wurde als TYPE SCHUSS hinterlegt,vor der Schleife)
//---------------------------------------------------------------------------------------



IF KEY(57) AND warten = GETTIMERALL()   <<Pause bis zum nächsten Schuss
schuss.y=400 //Wenn Space(Leertaste) gedrückt dann den schuss.y <-auf der y-Achse malen hier 400
schuss.x = playerx+10      //hier wird der schuss auf der x-Achse gemalt anhand der Raumschiff Position +10 nach rechts
    //damit er in der Mitte der Grafik erscheint
DIMPUSH schuesse[], schuss //fügt ein neues Feld(in unserem Fall einen Schuss ein) hier steht schuss als Wert der eingetragen wird in ->
//schuesse[] ( schuesse[] wurden ja "LOCAL" als "SCHUSS" bezeichnet)
//Also zum Verständniss >>schuss<< wird in die Variable schuesse[] "+einen schuss"eingetragen, die widerum in
//den Type SCHUSS hinterlegt wird.
warten = GETTIMERALL()+200
ENDIF



//---------------------------------------------------------------------------------------

FOREACH laser IN schuesse[] //Das verstehe ich noch nicht so ganz, >>Foreach<< heißt soviel wie >> "Für jeden" <<
//Hier wird irgendwie aus dem Schuss eine neue Variable namens laser
//die in schuesse[], die widerum in den Type SCHUSS erstellt werden, denke ich.

DEC laser.y, 2   // hier wird der laser.y, also die y-achse pro durchlauf um 2 verringert (DEC = verringern),das heißt der laser geht 2 Felder auf y-achse hoch
// wir erinnern uns (INC = erhöhen) der Variable Beispiel a = 5 wird bei jedem durchlauf um wert x veringert (INC a,(1 =x)

IF laser.y < 0 THEN DELETE laser  //wenn der laser kleiner 0 auf der y-achse ist, bitte löschen

DRAWSPRITE 1,laser.x,laser.y //Naja und hier zeichnen wir den laser(schuss) auf den Bildschirm

NEXT
//---------------------------------------------------------------------------------------
DRAWSPRITE 0,playerx,playery
SHOWSCREEN
WEND

Damit nicht durchgehend geschossen wird habe ich noch eine Pause mit warten = GETTIMERALL() eingebaut.

Hier zur besseren Übersicht auch noch eine PDF-Datei

spaceshooter teil 1 tut.pdf - 0.04MB

Hier die Grafiken:

grafiken.rar - 0.00MB

Gruß Jasper
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

so wie ich das sehe, hast du die Prinzipien doch schon sehr gut verstanden ;)
die FOREACH-Schleife ist lediglich eine spezielle Variante der FOR - NEXT - Schleife, die etwas Schreibarbeit spart und, so glaube ich, auch schneller abläuft. Außerdem kannst du den DELETE Befehl nur innerhalb einer FOREACH-Schleife anwenden.

Kitty Hello

Schaut ja schon super aus.
Das FOREACH hat folgenden Hintergrund:
Code (glbasic) Select
FOR i=0 TO LEN(feld[])-1
   feld[i] = feld[i] + 1
NEXT
Jetzt schau die Zeile feld = feld+1 an. Hier muss der Compiler 2x den Zeiger von feld[0] (der ist gespeichert) auf feld schieben. Dabei sind jedesmal 4 Multiplikationen und paar additionen notwendig.

Code (glbasic) Select
FOREACH f in feld[]
   f = f +1
NEXT
Hier wird ein Zeiger auf feld[0] intern gemacht (der heisst dann 'f') und bei jedem NEXT nur um 1 inkrementiert (also eins weitergezählt). Keine Multiplikation. Und je mehr man in der Schleife macht, desto größer wird der Unterschied.
Darum: Wo's geht: FOREACH, wo nicht halt herkömmlich.

Nch schlimmer bei:
Code (glbasic) Select
FOR i=0 TO LEN(Autohaus[iHaus].Parkdeck[iDeck].Autos[])-1
   Autohaus[iHaus].Parkdeck[iDeck].Autos[i] = 1
NEXT
Hier findet die Multiplikation für iHaus, iDeck und i statt.

Code (glbasic) Select
FOREACH car IN Autohaus[iHaus].Parkdeck[iDeck].Autos[]
   car = 1
NEXT
Keine Multiplikation mehr.

jasper111

@Schranz0r

wie muss ein Tutorial deiner Meinung nach aussehen? =(

Habe gerade mal die anderen "Tut's" mir angesehen dann musste ja fast alle Moven!

P.S.: Ein Kommentierter Code ist sehr wohl ein TUT ;)

Zitat:"Tutorials müssen nicht ein eigenständiges Dokument sein, sie können auch Teil des Programms sein und dieses durch das Prinzip "Learning by Doing" erklären (häufige Anwendung in Computerspielen)."

Gruß Jasper
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Schranz0r

Weil du das Tutorial von Gernot einfach nur abgeschrieben hast, Grafiken usw alles fehlen, somit ist es kein Tutorial sondern höchstens ein Codeschnipsel ;)

Editiere den ersten Post.
Mach die Grafiken verfügbar, erklär ein wenig die Aufgaben der Befehle(Da es ja für Anfänger sein soll), dann move ich ins Tutorialforum, und wenns mir gut gefällt, mach ich es evtl noch Stiky(fixiere es im TutorialForum oben)

Gruß zurück, Schranz0r
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

jasper111

Schranz0r,

damit nimste mir jede Freude. :wah:

Code nur abgetippt ? :(

Das was ich übernommen habe war der "Für jeden" Teil.
Aber da hab ich auch geschrieben das ich den noch blicken muss.

Dann haste ihn auch nicht richtig gelesen.
Hab den Code extra erklärt , musst nur nach rechts scrollen.

Wobei der auch schon wieder einfach ist, weil " Für jeden" ja schon alles sagt.
Ob ich alles einzeln anspreche oder in einer Schleife alle veränder,abarbeite.

Aber unter dem Strich egal, hauptsache ich hab ihn verstanden. :D


Jasper
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Schranz0r

Nagut, mach die Grafiken dazu dann gehts ab in Tutorial ;)

EDIT:

Add mich mal in ICQ, dann kann ich dir Helfen wenns mal haarig wird ;)  ICQ# : 286862111
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard