Spaceshooter

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

snips

Betreff: Spaceshooter

BeitragSa, Jan 17, 2004 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 17, 2004 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
  • Zuletzt bearbeitet von Jolinah am Sa, Jan 17, 2004 16:17, insgesamt 2-mal bearbeitet

geldi

BeitragSa, Jan 17, 2004 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 17, 2004 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Super ! Thx, aber der sagt Expecting "wend". also ich mach mich ma auf wend suche ^^
User posted image

Jolinah

BeitragSa, Jan 17, 2004 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab meinen Code oben nochmal editiert.
Mit Wend usw.. hatte ich vergessen.
 

snips

BeitragSa, Jan 17, 2004 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Riesengroßes Dankeschön ^^. Joa ich werde hier bestimmt noch ein paar fragen stellen (in diesem thread)
User posted image

Jolinah

BeitragSa, Jan 17, 2004 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
geldi hat Folgendes geschrieben:
Elegant wären Types aber ein Ringspeicher in einem Dim ist einfacher.


Jedem das Seine Very Happy

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

BeitragSa, Jan 17, 2004 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 17, 2004 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 17, 2004 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 18, 2004 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragSo, Jan 18, 2004 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group