Spaceshooter
Übersicht

snipsBetreff: Spaceshooter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe auf den Code Playermove aus der Help File (samples/2d/da irgendwo) aufgebaut und ihn ausgeweitet (jetzt fliegt schon ein alien von links nach rechts). Ich habe angefangen Schüsse eintubauen aber es funzt net (schon aber der Schuss wird immer an den Playeranfangs-Koordianten gezeichnet. Ausserdem bewegt er sich nicht richtig nach oben und ich weiss nicht wie ich es mache das mehrere Schüsse nacheinander abschiesbar sind ( wenn der erste weg ist). Die Kollisoinsabfrage mache ich später.
Code: [AUSKLAPPEN] ;go into graphics mode
Graphics 640,480 ;enable double buffering SetBuffer BackBuffer() ;load a player image player=LoadImage("graphics\player.bmp") ziel=LoadImage("graphics\alien.bmp") schuss=LoadImage("graphics\bullet.bmp") ;initialize player position player_x=320 player_y=440 ziel_x=320 ziel_y=100 schuss_x=player_x schuss_y=player_y - 20 ;loop until ESC hit... While Not KeyDown(1) ;is left key being held? If KeyDown(203) ;move player to the left player_x=player_x-4 ;stop the player going 'off screen' If player_x<0 Then player_x=0 EndIf ;is right key being held? If KeyDown(205) ;move player to the right player_x=player_x+4 ;stop the player going 'off screen' If player_x>604 Then player_x=604 EndIf ;Alien wird über den Bildschirm bewegt ziel_x = ziel_x - 4 If ziel_x < -250 Then ziel_x = 800 ;Schuss wird nach oben bewegt schuss_y = schuss_y - 2 ;clear the screen Cls ;draw the player DrawImage player,player_x,player_y DrawImage ziel,ziel_x,ziel_y If KeyDown(57) DrawImage schuss, schuss_x, schuss_y EndIf ;swap front And back buffers Flip |
||
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Damit man mehrere Schüsse gleichzeitig machen kann eignen sich am besten Arrays oder Types.
Ich hab dir jetzt mal ne Lösung mit Types gezeigt. Code: [AUSKLAPPEN] ;go into graphics mode Graphics 640,480 ;enable double buffering SetBuffer BackBuffer() ;--> Type Schuss Type Schuss Field x,y End Type ;load a player image player=LoadImage("graphics\player.bmp") ziel=LoadImage("graphics\alien.bmp") img_schuss=LoadImage("graphics\bullet.bmp") ;<-- Hab den Namen geändert ;initialize player position player_x=320 player_y=440 ziel_x=320 ziel_y=100 ;--> Schuss X und Schuss Y wird erst beim erstellen eines Schusses gesetzt. ;loop until ESC hit... While Not KeyDown(1) ;is left key being held? If KeyDown(203) ;move player to the left player_x=player_x-4 ;stop the player going 'off screen' If player_x<0 Then player_x=0 EndIf ;is right key being held? If KeyDown(205) ;move player to the right player_x=player_x+4 ;stop the player going 'off screen' If player_x>604 Then player_x=604 EndIf ;Alien wird über den Bildschirm bewegt ziel_x = ziel_x - 4 If ziel_x < -250 Then ziel_x = 800 ;--> Alle Schüsse werden nach oben bewegt For schuss.Schuss = each Schuss schuss\y = schuss\y - 2 if schuss\y < -10 then delete schuss ;<-- Wenn der schuss den Bildschirm oben verlässt dann löschen Next ;clear the screen Cls ;draw the player DrawImage player,player_x,player_y DrawImage ziel,ziel_x,ziel_y ;--> Jeder Schuss wird gezeichnet For schuss.Schuss = each Schuss DrawImage img_schuss, schuss\x, schuss\y Next ;--> Schuss erstellen wenn Leertaste gedrückt If KeyDown(57) schuss.Schuss = new Schuss schuss\x = player_x schuss\y = player_y - 20 EndIf ;swap front And back buffers Flip Wend ;<-- Ende der Hauptprogrammschleife Delete each Schuss ;<-- Am Ende jeden Schuss löschen ;<-- Alle Bilder wieder aus Speicher entfernen FreeImage player FreeImage ziel FreeImage img_schuss End ;<-- Programm Ende Den Code hab ich nicht getestet, aber ich hoffe es Funktioniert so ![]() |
||
- Zuletzt bearbeitet von Jolinah am Sa, Jan 17, 2004 16:17, insgesamt 2-mal bearbeitet
![]() |
geldi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun wenn du mehr als einen Schuss haben möchtest must du das auch irgendwo abspeichern.
Elegant wären Types aber ein Ringspeicher in einem Dim ist einfacher. Also Dim Schuss(20,3) Das würd für 20 Schüsse mit x,x,richtung ausreichen. Dann braucht du noch einen Counter der den nächsten Schuss angibt cntr=cntr+1 if cntr>20 cntr = 1 mfg geldi |
||
snips |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Super ! Thx, aber der sagt Expecting "wend". also ich mach mich ma auf wend suche ^^ | ||
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab meinen Code oben nochmal editiert.
Mit Wend usw.. hatte ich vergessen. |
||
snips |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Riesengroßes Dankeschön ^^. Joa ich werde hier bestimmt noch ein paar fragen stellen (in diesem thread) | ||
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
geldi hat Folgendes geschrieben: Elegant wären Types aber ein Ringspeicher in einem Dim ist einfacher.
Jedem das Seine ![]() Ich finde jedoch das Arrays viel unübersichtlicher sind. Man arbeitet fast nur mit Zahlen statt mit Variablennamen die mehr Aussagen. schuss\x ist denke ich jedem klar wenn er den code ansieht. schuss(1,0) hingegen weniger, da bedarf es schon an Erklärung wozu das 0 im Array dient. Naja gibt auch noch die Lösung: Code: [AUSKLAPPEN] Const xpos = 0
Const ypos = 1 Const dir = 2 dim schuss(20,3) schuss(1,xpos) ;Fänd ich schon viel übersichtlicher Für viele Bereiche sind Arrays eindeutig besser, Tilemaps z.bsp. Aber bei Types gibts trotzdem paar Vorteile. -Man geht mit der For schleife wirklich nur die Schüsse durch die auch existieren, statt 20 oder 100 (oder 1000?) Ok geht mit array auch, dann braucht man aber ne extra variable die die Objekte zählt. - Es ist sehr einfach neue Variablen in den Type einzubauen. Ohne das man dann den ganzen Code durchsuchen und überall was ändern muss. Geth bei Dim auch solange man keine Weitere kommastelle einfügt. |
||
- Zuletzt bearbeitet von Jolinah am Sa, Jan 17, 2004 16:34, insgesamt einmal bearbeitet
snips |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hab ne frage zur Kolisionsabfrage, wie soll ich die x,y werte angeben?
Code: [AUSKLAPPEN] If ImagesOverlap(img_schuss, x1, y1, ziel, x2, y2) Then Delete ziel
|
||
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] For schuss.Schuss = each Schuss
If ImagesOverlap(img_schuss, schuss\x, schuss\y, ziel, ziel_x, ziel_y) Then.. Next Jedoch geht Delete nicht bei allem. Das funktioniert nur bei Types. Das heisst du müsstest die Gegner auch noch in Types fassen. Code: [AUSKLAPPEN] ;Type definieren, vor der Hauptschleife Type Alien Field x,y End Type ;Erstmal ein neues Alien erstellen alien.Alien = new Alien alien\x = 320 alien\y = 100 ... ;Aliens werden über den Bildschirm bewegt, in der Hauptschleife For alien.Alien = each Alien alien\x = alien\x - 4 if alien\x < -250 then alien\x = 800 Next ... ;Aliens zeichnen, auch in Hauptschleife da wo die Drawimages sind. For alien.Alien = each Alien DrawImage ziel, alien\x, alien\y Next ... ;Kollisionen, Alien und Schuss werden gelöscht beim Zusammenstoss. For schuss.Schuss = each Schuss For alien.Alien = each Alien If ImagesOverlap(img_schuss, schuss\x, schuss\y, ziel, alien\x, alien\y) Then Delete alien : Delete schuss Next Next Musst die Sachen nur noch am Richtigen Ort einbauen dann sollte es funktionieren Edit: Und alle Zeilen wo ziel_x und ziel_y drin vorkommen kannst du löschen und durch meine Sachen ersetzen, das einzige was drin bleiben muss ist das Bild (ziel = LoadImage("...") ) |
||
snips |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
joa das obere was du geschriben hasst funzt, das andere hab ich no0ch net probiert. gibts irgendwo nen tut über types ? Ach ja bekomme das mit der lebens anzeige net gebacken :
Code: [AUSKLAPPEN] ;go into graphics mode
Graphics 640,480 ;enable double buffering SetBuffer BackBuffer() ;--> Type Schuss Type Schuss Field x,y End Type ;load a player image player=LoadImage("graphics\player.bmp") ziel=LoadImage("graphics\alien.bmp") img_schuss=LoadImage("graphics\bullet.bmp") ;<-- Hab den Namen geändert ;initialize player position player_x=320 player_y=440 ziel_x=320 ziel_y=100 ;Lebensvariable leben = 10 ;--> Schuss X und Schuss Y wird erst beim erstellen eines Schusses gesetzt. ;loop until ESC hit... While Not KeyDown(1) ;is left key being held? If KeyDown(203) ;move player to the left player_x=player_x-4 ;stop the player going 'off screen' If player_x<0 Then player_x=0 EndIf ;is right key being held? If KeyDown(205) ;move player to the right player_x=player_x+4 ;stop the player going 'off screen' If player_x>604 Then player_x=604 EndIf ;Alien wird über den Bildschirm bewegt ziel_x = ziel_x - 4 If ziel_x < -250 Then ziel_x = 800 ;--> Alle Schüsse werden nach oben bewegt For schuss.Schuss = Each Schuss schuss\y = schuss\y - 2 If schuss\y < -10 Then Delete schuss ;<-- Wenn der schuss den Bildschirm oben verlässt dann löschen Next ;Kolisionsabfrage For schuss.Schuss = Each Schuss If ImagesOverlap(img_schuss, schuss\x, schuss\y, ziel, ziel_x, ziel_y) Then Delete schuss ;hier müsste noch was hin (leben = leben - 1) aber das funzt net !!! Next ;clear the screen Cls ;Lebensanzeige Color 100,0,0 Text 20, 20, "Alien: " Locate 70, 20 Print leben ;draw the player DrawImage player,player_x,player_y DrawImage ziel,ziel_x,ziel_y ;--> Jeder Schuss wird gezeichnet For schuss.Schuss = Each Schuss DrawImage img_schuss, schuss\x, schuss\y Next ;--> Schuss erstellen wenn Leertaste gedrückt If KeyHit(57) schuss.Schuss = New Schuss schuss\x = player_x schuss\y = player_y - 20 EndIf ;swap front And back buffers Flip Wend ;<-- Ende der Hauptprogrammschleife Delete Each Schuss ;<-- Am Ende jeden Schuss löschen ;<-- Alle Bilder wieder aus Speicher entfernen FreeImage player FreeImage ziel FreeImage img_schuss |
||
User posted image |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaube Print geht nicht wenn der Grafik Modus aktiviert ist. Du müsstest Text verwenden.
Am besten einfach so: Code: [AUSKLAPPEN] Text 20,20,"Alien: " + leben
Damit wird leben direkt an den Text angefügt. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
print schreibt immer in den Frontbuffer, daher kann es sein dass geprintete Ausgaben vom nächsten cls/flip gelöscht werden bevor du sie gesehen hast. daher ist eher text zu empfehlen. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group