Author Topic: Spaceshooter Spielerfigur und Schüsse erstellen mit Erklärung  (Read 7134 times)

Offline jasper111

  • Mc. Print
  • *
  • Posts: 32
    • View Profile
>>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
« Last Edit: 2008-Jun-16 by jasper111 »
Rechtschreibfehler sind pure Absicht und dienen der allgemeinen Belustigung.
_____________________________________________________________

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5021
  • O Rly?
    • View Profile
Move to GLBasic - de

Grund: Kein Tutorial!
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Quentin

  • Prof. Inline
  • *****
  • Posts: 915
    • View Profile
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.

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10714
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
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.

Offline jasper111

  • Mc. Print
  • *
  • Posts: 32
    • View Profile
@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.
_____________________________________________________________

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5021
  • O Rly?
    • View Profile
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 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline jasper111

  • Mc. Print
  • *
  • Posts: 32
    • View Profile
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.
_____________________________________________________________

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5021
  • O Rly?
    • View Profile
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 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5021
  • O Rly?
    • View Profile
Move to Tutorials
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard