Hilfe bei Kollision von Schuss mit Gegner

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Razor1994

Betreff: Hilfe bei Kollision von Schuss mit Gegner

BeitragDo, Jul 09, 2009 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mein Programm und ich möchte das wenn eine Kugel den Gegner trifft das kollision erscheint. Wenn ich es starte funktioniert alles und auch Gegner kommen aber wenn ich will schiessen kommt zuerst nichts und beim zweiten mal drücken kommt die fehlermeldung "object does not exist" was mache ich falsch?
Code: [AUSKLAPPEN]
Global xmax=1024
Global ymax=768
Graphics xmax,ymax,0,1
SetBuffer BackBuffer()

; Bilder laden
Global player = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\player.bmp")
Global wand = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\block3.bmp")
Global bullet = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\bullet.bmp")
Global gegner = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\alien.bmp")



; Variablen
Global player_x=250
Global player_y=300
Global shot_counter=0
Global frame = 0
Global counter

MidHandle player
;
Dim spielerbild(3)

; Schuss Type
Type shot
 Field shot_x
 Field shot_y
End Type

; Gegner Type
Type enemie
 Field speed
 Field enemie_x
 Field enemie_y
End Type

; Haupschleife
Repeat
Cls

; Wand zeichnen
 For z2=0 To 1
  If z2=1 Then x=xmax-38 Else x=0
  For z=0 To ymax/38
   DrawImage wand,x,z*38
  Next
 Next

; Spielerbewegung
 If KeyDown(203) Then player_x=player_x-5
 If KeyDown(205) Then player_x=player_x+5
 If KeyDown(208) Then player_y=player_y+5
 If KeyDown(200) Then player_y=player_y-5


; Spielerbild in Gehrichtung
For i = 0 To 3
 spielerbild(i) = CopyImage (player)
 RotateImage spielerbild(i), i*90 ;Dreht das Bild
Next

 If KeyDown(203) Then frame=3
 If KeyDown(205) Then frame=1
 If KeyDown(208) Then frame=2
 If KeyDown(200) Then frame=0

DrawImage spielerbild(frame), player_x, player_y

; Wandstopp
If player_x <= 42 Then player_x=player_x+10
If player_x >= 968 Then player_x=player_x-10
If player_y >= 38 Then player_y=player_y-10
If player_y <= 710 Then player_y=player_y+10

; Zufällige Aliens
 counter = counter + 1
       If counter >= 100 Then
          counter = 0
            e.enemie = New enemie                   ;gegner erstellen,eigenschaften werte zuweisen
               e\speed = 1
                e\enemie_x = Rnd(28,772)
                e\enemie_y = -5
       EndIf

      For e.enemie = Each enemie                     ;alle Gegner ansprechen
           e\enemie_y = e\enemie_y + e\speed   ;alle Gegner nach unten
             DrawImage gegner,e\enemie_x,e\enemie_y ; Gegner erstellen       
               If e\enemie_y >600 Then Delete e.enemie ;unten angekommen gegner löschen
      Next 

; Kugelschuss
 If KeyDown(57) Then
   shot_counter=shot_counter+1
 End If
If shot_counter=5 Then
  schuss.shot=New shot
   schuss\shot_x=player_x ; vielleich mit 0 wenn von mittelpunk des bildes aus gesehen mit y Achse.
   schuss\shot_y=player_y
  shot_counter=0
End If

; Schussbewegung
For schuss.shot=Each shot
 schuss\shot_y=schuss\shot_y-8
 DrawImage bullet,schuss\shot_x,schuss\shot_y
If schuss\shot_y<1 Then Delete schuss
Next


; Kollision von Schuss mit Alien
For schuss.shot=Each shot
 If ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y) Then
Print "kollision"
EndIf
Next

Flip
Until KeyHit(1)
End

ozzi789

BeitragDo, Jul 09, 2009 7:45
Antworten mit Zitat
Benutzer-Profile anzeigen
1.
; Spielerbild in Gehrichtung
For i = 0 To 3
spielerbild(i) = CopyImage (player)
RotateImage spielerbild(i), i*90 ;Dreht das Bild
Next


Darf nicht in der Schleife stehn 1 mal genügt Smile


2.
object does not exist
Heisst das du ein Object ,also einen Eintrag mit Delete löscht, welchen du noch im gleichen Schleifendurchgang ansprichst.

Kann dir gerade nicht sagen wo weil ich kein BB zur Hand habe...


Welche Zeile markiert der Debugger?



mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Razor1994

BeitragDo, Jul 09, 2009 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry vielleicht stehe ich gerade auf dem Schlauch aber wie nicht in der Schleife?

und 2. bei Code: [AUSKLAPPEN]
If ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y) Then
 

tobias12

BeitragDo, Jul 09, 2009 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
lade es einfach am anfang
Mein Projekteforum
 

Razor1994

BeitragDo, Jul 09, 2009 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep habs grade selbst gelöst.
dank dem hinweis aufs delete
 

Razor1994

BeitragDo, Jul 09, 2009 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt hab ich aber trotzdem noch eine andere Frage. es kommt immer Variable must be a type wenn ich das
Code: [AUSKLAPPEN]
If e\enemie_y >600 Or ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)Then
  Delete e.enemie ;unten angekommen gegner löschen
 EndIf

einfüge
Code: [AUSKLAPPEN]
Global xmax=1024
Global ymax=768
Graphics xmax,ymax,0,1
SetBuffer BackBuffer()
; Bilder laden
Global player = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\player.bmp")
Global wand = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\block3.bmp")
Global bullet = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\bullet.bmp")
Global gegner = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\alien.bmp")



; Variablen
Global player_x=250
Global player_y=300
Global shot_counter=0
Global frame = 0
Global counter

MidHandle player
;
Dim spielerbild(3)

; Schuss Type
Type shot
 Field shot_x
 Field shot_y
End Type

; Gegner Type
Type enemie
 Field speed
 Field enemie_x
 Field enemie_y
End Type

For i = 0 To 3
 spielerbild(i) = CopyImage (player)
 RotateImage spielerbild(i), i*90 ;Dreht das Bild
Next

; Haupschleife
Repeat
Cls

; Wand zeichnen
For z2=0 To 1
 If z2=1 Then x=xmax-38 Else x=0
 For z=0 To ymax/38
  DrawImage wand,x,z*38
 Next
Next

; Spielerbewegung
 If KeyDown(203) Then player_x=player_x-5
 If KeyDown(205) Then player_x=player_x+5
 If KeyDown(208) Then player_y=player_y+5
 If KeyDown(200) Then player_y=player_y-5


; Spielerbild in Gehrichtung

 If KeyDown(203) Then frame=3
 If KeyDown(205) Then frame=1
 If KeyDown(208) Then frame=2
 If KeyDown(200) Then frame=0

DrawImage spielerbild(frame), player_x, player_y

; Wandstopp
If player_x <= 42 Then player_x=player_x+10
If player_x >= 968 Then player_x=player_x-10
If player_y >= 38 Then player_y=player_y-10
If player_y <= 710 Then player_y=player_y+10



; Zufällige Aliens
counter = counter + 1
 If counter >= 100 Then
  counter = 0
   e.enemie = New enemie                   ;gegner erstellen,eigenschaften werte zuweisen
    e\speed = 1
    e\enemie_x = Rnd(28,772)
    e\enemie_y = -5
 EndIf

For e.enemie = Each enemie                     ;alle Gegner ansprechen
 e\enemie_y = e\enemie_y + e\speed   ;alle Gegner nach unten
  DrawImage gegner,e\enemie_x,e\enemie_y ; Gegner erstellen
If e\enemie_y >600 Or ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)Then
  Delete e.enemie ;unten angekommen gegner löschen
 EndIf
Next
; Kugelschuss
 If KeyDown(57) Then
   shot_counter=shot_counter+1
 End If
If shot_counter=5 Then
  schuss.shot=New shot
   schuss\shot_x=player_x ; vielleich mit 0 wenn von mittelpunk des bildes aus gesehen mit y Achse.
   schuss\shot_y=player_y-20
  shot_counter=0
End If


; Schussbewegung
For schuss.shot=Each shot
 schuss\shot_y=schuss\shot_y-8
 DrawImage bullet,schuss\shot_x,schuss\shot_y

If schuss\shot_y<1 Then Delete schuss
Next




Flip
Until KeyHit(1)
End

count-doku

BeitragDo, Jul 09, 2009 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

du musst bevor du die Schuesse auf Kollision pruefts natuerlich auch mit for next durchgehen.

Also so:
Code: [AUSKLAPPEN]
For schuss.shot=each shot
If e\enemie_y >600 Or ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)Then
  Delete e.enemie ;unten angekommen gegner löschen
 EndIf
next


Mfg,
count-doku Very Happy
  • Zuletzt bearbeitet von count-doku am Sa, Jul 11, 2009 3:43, insgesamt einmal bearbeitet
 

Razor1994

BeitragDo, Jul 09, 2009 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt haben wir wieder das ganz oben genannte problem. Dabei habe ich vor dieser Zeile Code: [AUSKLAPPEN]
If ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)
kein delete eingebaut. (Übrigens ich habe noch ein paar Sachen verändert.)Code: [AUSKLAPPEN]
Global xmax=1024
Global ymax=768
Graphics xmax,ymax,0,1
SetBuffer BackBuffer()
; Bilder laden
Global player = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\player.bmp")
Global wand = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\block3.bmp")
Global bullet = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\bullet.bmp")
Global gegner = LoadImage("C:\Programme\Blitz2DDemo\help\resources\samples\Graphics\alien.bmp")



; Variablen
Global player_x=250
Global player_y=300
Global shot_counter=0
Global frame = 0
Global counter

MidHandle player
;
Dim spielerbild(3)

; Schuss Type
Type shot
 Field shot_x
 Field shot_y
 Field tot
End Type

; Gegner Type
Type enemie
 Field speed
 Field enemie_x
 Field enemie_y
 Field tot
End Type

For i = 0 To 3
 spielerbild(i) = CopyImage (player)
 RotateImage spielerbild(i), i*90 ;Dreht das Bild
Next

; Haupschleife
Repeat
Cls

; Wand zeichnen
For z2=0 To 1
 If z2=1 Then x=xmax-38 Else x=0
 For z=0 To ymax/38
  DrawImage wand,x,z*38
 Next
Next

; Spielerbewegung
 If KeyDown(203) Then player_x=player_x-5
 If KeyDown(205) Then player_x=player_x+5
 If KeyDown(208) Then player_y=player_y+5
 If KeyDown(200) Then player_y=player_y-5


; Spielerbild in Gehrichtung

 If KeyDown(203) Then frame=3
 If KeyDown(205) Then frame=1
 If KeyDown(208) Then frame=2
 If KeyDown(200) Then frame=0

DrawImage spielerbild(frame), player_x, player_y

; Wandstopp
If player_x <= 42 Then player_x=player_x+10
If player_x >= 968 Then player_x=player_x-10
If player_y >= 38 Then player_y=player_y-10
If player_y <= 710 Then player_y=player_y+10



; Zufällige Aliens
counter = counter + 1
 If counter >= 100 Then
  counter = 0
   e.enemie = New enemie                   ;gegner erstellen,eigenschaften werte zuweisen
    e\speed = 1
    e\enemie_x = Rnd(28,772)
    e\enemie_y = -5
 EndIf

For e.enemie = Each enemie                     ;alle Gegner ansprechen
 e\enemie_y = e\enemie_y + e\speed   ;alle Gegner nach unten
  DrawImage gegner,e\enemie_x,e\enemie_y ; Gegner erstellen
 If e\enemie_y >600 Then
  e\tot = 1
 EndIf
Next

For schuss.shot=Each shot
 If ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)
  e\tot = 1 And schuss\tot = 1
 EndIf
Next
; Kugelschuss
 If KeyDown(57) Then
   shot_counter=shot_counter+1
 End If
If shot_counter=5 Then
  schuss.shot=New shot
   schuss\shot_x=player_x ; vielleich mit 0 wenn von mittelpunk des bildes aus gesehen mit y Achse.
   schuss\shot_y=player_y-20
  shot_counter=0
End If


; Schussbewegung
For schuss.shot=Each shot
 schuss\shot_y=schuss\shot_y-8
 DrawImage bullet,schuss\shot_x,schuss\shot_y
Next
For schuss.shot=Each shot
 If schuss\shot_y<1 Then
  schuss\tot = 1
 EndIf
Next

For schuss.shot=Each shot
 If schuss\tot Delete schuss.shot
Next
For e.enemie = Each enemie
 If e\tot Delete e.enemie
Next

Flip
Until KeyHit(1)
End
[/code]

count-doku

BeitragSa, Jul 11, 2009 3:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst das Durchgehen der Schuesse in der Schleife machen in der du auch die Gegner durchgest.

Code: [AUSKLAPPEN]
For e.enemie = Each enemie                     ;alle Gegner ansprechen
 e\enemie_y = e\enemie_y + e\speed   ;alle Gegner nach unten
 DrawImage gegner,e\enemie_x,e\enemie_y ; Gegner erstellen
 If e\enemie_y >600 Then
  e\tot = 1
 EndIf
 For schuss.shot=Each shot
  If ImagesOverlap(bullet,schuss\shot_x,schuss\shot_y,gegner,e\enemie_x,e\enemie_y)
   e\tot = 1 And schuss\tot = 1
  EndIf
 Next   
Next


Mfg,
count-doku

Xeres

Moderator

BeitragSa, Jul 11, 2009 8:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Was soll das hier bitte darstellen:
Code: [AUSKLAPPEN]
e\tot = 1 And schuss\tot = 1

...?
AND ist eine Logische Verknüpfung. Bei OR entscheidet BB sich ja auch nicht zufällig für einen von mehreren Befehlen. Mit dem Doppelpunkt werden mehrere Befehle in einer Zeile getrennt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group