[B2D] Gegner (Weltraumshooter)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: [B2D] Gegner (Weltraumshooter)

BeitragSo, Dez 28, 2008 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !
Ich versuche seit ca. 3 Stunden einen Weltraumshooter zu programmieren und hänge jetzt bei der Gegnerbewegung.

Hier der Code:

Code: [AUSKLAPPEN]
AppTitle "Weltraumshooter"

;Auflösung
Const  ax=1024
Const  ay=768

;Farben
Const  fx=32

;Variablen
Global px=512
Global py=700

Global speed=5

Global sx=523
Global sy=740

Global geganzahl=10

;--------------------------------------------------------------------------------------------

Type schuss
   
   Field x
   Field y
   
End Type

Type gegner
   
   Field x
   Field y
   Field image
   Field speed
   
End Type

;--------------------------------------------------------------------------------------------

Graphics ax,ay,fx,2
SetBuffer BackBuffer()

;Laden der Ressourcen
Global schiff  = LoadImage("gfx\schiff.png")

;Vorbereitung der Ressourcen zur Nutzung
MaskImage schiff,255,255,255

ClsColor 0,0,0

;--------------------------------------------------------------------------------------------

gegner_erstellen()

;--------------------------------------------------------------------------------------------

Repeat
      
   Cls         
   
   
   Bewegen()
   GegUpdate()
   Sterne()
   
   
   If KeyHit(57) Then
      
      s.Schuss = New schuss
   
      s\x = sx
      s\y = sy
      
   EndIf
   
   For s.Schuss = Each Schuss
      
      s\y = s\y - speed
      
      Rect s\x,s\y,2,5
      
      If s\y < 10 Then Delete s.Schuss
      
   Next
         
   
   
   DrawImage schiff,px,py
      
   Flip
   
Until KeyHit(1)
End

;--------------------------------------------------------------------------------------------


Function Bewegen()
   
   If KeyDown(30) Then px=px-1.5 sx=sx-1.5
   If KeyDown(32) Then px=px+1.5 sx=sx+1.5
   
End Function





Function gegner_erstellen()
   
   For a = 0 To geganzahl

      g.gegner = New gegner
      g\x         = Rnd(0,1000)
      g\y         = Rnd(0,500)
      g\image  = LoadImage("gfx\gegner.png")

   Next
   
   MaskImage g\image,255,255,255
   
End Function





Function GegUpdate()
   
   For upd.gegner = Each gegner

      DrawImage upd\image, upd\x, upd\y
   
      MaskImage upd\image,255,255,255
         
   Next
   
End Function




Function Sterne()

   For i=0 To 100
      
      Plot Rnd(0,1024),Rnd(0,768)
   
   Next
   
End Function


Ich hoffe ihr könnt mir helfen !

Mfg, N0X
  • Zuletzt bearbeitet von N0X am Mo, Dez 29, 2008 15:57, insgesamt 4-mal bearbeitet

Der Eisvogel

BeitragSo, Dez 28, 2008 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist denn das Problem?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

N0X

BeitragSo, Dez 28, 2008 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, sorry hab die Fragestellung versaut Razz
Also, ich möchte jetzt das die Gegner sich zufällig bewegen und der Y-Achse nach unten bewegen.

Mfg, N0X

N0X

Betreff: Kollision !

BeitragMo, Dez 29, 2008 2:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Neues Problem !
Wenn ich die Gegner abschieße funktioniert es nur teilweise.
Immer bei genau einem Gegner kommt "Memory Violation Error"
Und noch dazu lässt sich der Gegner nicht löschen wenn 2 Schüsse auf dem Bildschirm sind.

Warum ? Confused

Hier der Code: [AUSKLAPPEN]
AppTitle "Weltraumshooter"

;Auflösung
Const  ax=1024
Const  ay=768

;Farben
Const  fx=32

;Variablen
Global px=512
Global py=700

Global speed=5

Global sx=523
Global sy=740

Global geganzahl=10

;--------------------------------------------------------------------------------------------|

Type schuss
   
   Field x
   Field y
   
End Type

Type gegner
   
   Field x
   Field y
   Field image
   Field speed
   
End Type

;--------------------------------------------------------------------------------------------|

Graphics ax,ay,fx,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()

;Laden der Ressourcen
Global schiff  = LoadImage("gfx\schiff.png")

;Vorbereitung der Ressourcen zur Nutzung
MaskImage schiff,255,255,255

ClsColor 0,0,0

;--------------------------------------------------------------------------------------------|

gegner_erstellen()

;--------------------------------------------------------------------------------------------|

Repeat
      
   Cls         
   
   
   Bewegen()
   Sterne()
   GegUpdate()
   
   
   If KeyHit(57) Then
      
      s.Schuss = New schuss
   
      s\x = sx
      s\y = sy
      
   EndIf
   
   For s.Schuss = Each Schuss
      
      s\y = s\y - speed
      
      Rect s\x,s\y,2,5
      
      If s\y < 10 Then Delete s.Schuss
      
   Next
         
   
   If px <2 Then px=2 sx=13
   If px >980 Then px=980 sx=991
   
   For g.Gegner = Each Gegner
   
      For s.Schuss = Each Schuss
      
         If ImageRectCollide(g\image,g\x,g\y,0,s\x,s\y,2,5) Then Delete g.Gegner
      
      Next
   
   Next
   
   DrawImage schiff,px,py
      
   Flip
   
Until KeyHit(1)
End

;--------------------------------------------------------------------------------------------|
;--------------------------------------------------------------------------------------------|


Function Bewegen()
   
   If KeyDown(30) Then px=px-1.5 sx=sx-1.5
   If KeyDown(32) Then px=px+1.5 sx=sx+1.5
   
End Function





Function gegner_erstellen()
   
   For a = 0 To geganzahl

      g.gegner = New gegner
      g\x         = Rnd(0,1000)
      g\y         = Rnd(0,500)
      g\image  = LoadImage("gfx\gegner.png")
      MaskImage g\image,255,255,255

   Next
   
End Function





Function GegUpdate()
   
   For upd.gegner = Each gegner

      DrawImage upd\image, upd\x, upd\y
   
      MaskImage upd\image,255,255,255
         
   Next
   
End Function




Function Sterne()

   For i=0 To 100
      
      Plot Rnd(0,1024),Rnd(0,768)
   
   Next
   
End Function


Mfg,
N0X

Thorsten

BeitragMo, Dez 29, 2008 3:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   For g.Gegner = Each Gegner
   
      For s.Schuss = Each Schuss
     
         If ImageRectCollide(g\image,g\x,g\y,0,s\x,s\y,2,5) Then Delete g.Gegner
     
      Next
   
   Next


Code: [AUSKLAPPEN]
   For g.Gegner = Each Gegner
   
      For s.Schuss = Each Schuss
     
         If ImageRectCollide(g\image,g\x,g\y,0,s\x,s\y,2,5) Then
             Delete g.Gegner
             Exit
         EndIf
     
      Next
   
   Next


Ein Exit um nicht noch einen Schuss beim bereits gelöschten Gegner abzufragen.

N0X

BeitragMo, Dez 29, 2008 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, hab's getestet

aber der "Memory Violation Error" (bei immer einem Gegner) ist immer noch da ...
und jetzt wird kein Gegner mehr gelöscht wenn mehrere Schüsse auf dem Bildschirm sind ... Confused

Mfg,
N0X

Der Eisvogel

BeitragMo, Dez 29, 2008 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
For s.Schuss = Each Schuss
   For g.Gegner = Each Gegner
      If ImageRectCollide(g\image,g\x,g\y,0,s\x,s\y,2,5) Then
         Delete g.Gegner
         Exit
      Endif
   Next
Next


So müsste es gehen, aber der Error komm wahrscheinlich von dem ImageRectCollide. Ich würde den schuss auch noch löschen, wenn er einen Gegner trifft.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

N0X

BeitragMo, Dez 29, 2008 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, schon viel besser ! Jetzt kann man auch mehrere Schüsse abfeuern ohne das dann kein Gegner gelöscht wird !

Danke !

Aber der "Memory Acess Violation" Error kommt immernoch ...

Wie du schon sagtest liegts wahrscheinlich am ImageRectCollide, weiß dafür vielleicht noch jemand eine Lösung ?

Das seltsame ist ja, dass es immer nur EIN Gegner ist bei dem der Error kommt !

Confused

Mfg,
N0X

Der Eisvogel

BeitragMo, Dez 29, 2008 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja probier mal RectsOverlap das ist zwar nicht mehr so genau, reicht aber völlig aus.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

N0X

BeitragMo, Dez 29, 2008 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, es hat bestens geklappt !
Vielen, Vielen Dank !

Jetzt muss ich nur noch die Gegner bewegen ...

Mfg,
N0X

Edit:

Wie schaffe ich es das wenn alle Gegner deletet sind wieder neue entstehen ?

Hier der Code: [AUSKLAPPEN]
AppTitle "Weltraumshooter"

;Auflösung
Const  ax       = 1024
Const  ay       = 768

;Farben
Const  fx       = 32

;Variablen
Global px       = 512
Global py       = 700

Global speed    = 5
Global gegspeed = 2

Global sx       = 523
Global sy       = 740

Global points   = 0
Global lives    = 3

Global geganzahl= 10

;--------------------------------------------------------------------------------------------|

Type schuss
   
   Field x
   Field y
   
End Type

Type gegner
   
   Field x
   Field y
   Field image
   
End Type

;--------------------------------------------------------------------------------------------|

Graphics ax,ay,fx,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

;Laden der Ressourcen
Global schiff  = LoadImage("gfx\schiff.png")
Global side    = LoadImage("gfx\sidebar.png")
Global shot    = LoadSound("sound\shot.wav")
Global treffer = LoadSound("sound\treffer.wav")

;Vorbereitung der Ressourcen zur Nutzung
MaskImage schiff,255,255,255

ClsColor 0,0,0

;--------------------------------------------------------------------------------------------|

gegner_erstellen()

;--------------------------------------------------------------------------------------------|

Repeat
      
   Cls         
   
   
   Bewegen()
   Sterne()
   GegUpdate()
   PlyUpdate()
   
   
   If KeyHit(57) Then
      
      s.Schuss = New schuss
      
      s\x = sx
      
      s\y = sy
      
      PlaySound shot
      
   EndIf
   
   For s.Schuss = Each Schuss
      
      s\y = s\y - speed

      Rect s\x,s\y,2,5
      
      If s\y < 10 Then Delete s.Schuss
      
   Next
   
   For s.Schuss = Each Schuss
         For g.Gegner = Each Gegner
            If RectsOverlap(g\x,g\y,40,40,s\x,s\y,2,5) Then
               Delete s.Schuss
            Delete g.Gegner
            PlaySound treffer
            points=points+10
               Exit
            EndIf
      Next
   Next
   
   DrawImage schiff,px,py
   DrawImage side,824,0   
   
   Texte()
   
   Flip
   
Until KeyHit(1)
End

;--------------------------------------------------------------------------------------------|
;--------------------------------------------------------------------------------------------|


Function Bewegen()
   
   If KeyDown(30) Then px=px-1.5 sx=sx-1.5
   If KeyDown(32) Then px=px+1.5 sx=sx+1.5
   
End Function





Function gegner_erstellen()
   
   For a = 0 To geganzahl

      g.gegner = New gegner
      g\x         = Rnd(0,760)
      g\y         = Rnd(-900,-20)
      g\image  = LoadImage("gfx\gegner.png")
      MaskImage g\image,255,255,255

   Next
   
End Function





Function GegUpdate()
   
   For upd.gegner = Each gegner

      DrawImage upd\image, upd\x, upd\y
   
      MaskImage upd\image,255,255,255
         
   Next
   
   For g.Gegner = Each Gegner
      
      g\y = g\y +gegspeed
      
      If g\y > 770 Then g\y=Rnd(-900,-20) Exit
      
   Next
   
End Function




Function PlyUpdate()
   
   If px <2 Then px=2 sx=13
   If px >770 Then px=770 sx=781
   
End Function




Function Sterne()

   For i=0 To 100
      
      Plot Rnd(0,1024),Rnd(0,768)
   
   Next
   
End Function




Function Texte()
   
   If KeyHit(41) Then
      GetKey()
   EndIf
   
   Text 920,165,+lives
   Text 920,290,+points
   
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group