schuss wird immer schneller

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

mafa

Betreff: schuss wird immer schneller

BeitragDo, Okt 13, 2011 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hi

ich bins nochmal. Die kollision habe ich jetzt zwischen schuss und gegner, aber jedesmal wenn ich schieße wird die nächste kugel schneller und wenn es mehr als 3 kugeln sind die gleichzeitig auf dem bildschirm sind bekomme ich die fehler meldung das das Object nicht existiert. Wie mache ich das jeder schuss gleich schnell bleibt und das es mehr als 3 schüsse sein können?
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()
frametimer = CreateTimer(30)

;//////////////////////////////////////////////////////////////////////////
;obj
;Karakter
Global spieler = LoadImage("obj\spieler.bmp")
MaskImage spieler, 255,255,255

Global zombie1 = LoadImage ("obj\zombie1.bmp")
MaskImage zombie1,255,0,255


;gegenstände
Global grass = LoadImage("obj\grass.bmp")
MaskImage grass,255,0,255

Global flagge = LoadImage("obj\flagge.bmp")
MaskImage flagge,255,0,255

Global schuss = LoadImage ("obj\kugel.bmp")
MaskImage schuss,255,0,255


;/////////////////////////////////////////////////////////////////////////////
;var,const
Const rauf = 200, runter = 208, rechts = 205, links = 203

Global playerx = 300
Global playery = 300

Global info.schuss
Global info1.zombie1

Global ja = 0

Global kill = 0

flagge_x = 700
flagge_y = 500

Global spawn = 0

;/////////////////
;zombie1


;//////////////////////////////////////////////////////////////////////
;array,type

Type schuss
Field img
Field x
Field y
End Type

Type zombie1
Field img
Field x
Field y
Field leben
End Type

Dim map(30,20)

Restore mapdata
For y = 0 To 19
For x = 0 To 29
Read map(x,y)
Next
Next
;//////////////////////////////////////////////////////////////////////////
;hauptschleife
Repeat
Cls
WaitTimer(frametimer)








drawmap()
steuerung()
drawzombie()
movezombie()
schuss()






If schuss = 0 Then DebugLog "schuss nicht da"
If zombie1 = 0 Then DebugLog "zombie nicht da"

Text 0,0, "kill:" + kill
Text 0,10, "spawn" + spawn

DrawImage spieler, playerx,playery

Flip

Until KeyHit(1)
End

;/////////////////////////////////////////////////////////////////////////////
;functionen

Function drawmap()
For y = 0 To 19
For x = 0 To 29
If map(x,y) = 0 Then
DrawImage grass, x*32,y*32
EndIf
If map(x,y) = 1 Then
DrawImage flagge, x*32,y*32
EndIf
Next
Next
End Function



Function steuerung()
If KeyDown(rauf) Then
playery = playery-2
EndIf
If KeyDown(runter) Then
playery = playery+2
EndIf
If KeyDown(links) Then
playerx = playerx -2
EndIf
If KeyDown(rechts) Then
playerx = playerx +2
EndIf
End Function


Function drawzombie()
;If KeyHit(links) Or KeyHit(rechts) Or KeyHit(rauf) Or KeyHit(runter) Then
spawn = spawn+1
If spawn = 15 Then
spawn = 0
info1.zombie1 = New zombie1
info1\img = zombie
info1\x = Rnd(0,800)
info1\y = 0
info1\leben = 50

EndIf
End Function


Function movezombie()
For info1.zombie1 = Each zombie1
DrawImage zombie1,info1\x,info1\y
If info1\x < playerx Then
info1\x = info1\x +1
ElseIf info1\x > playerx Then
info1\x = info1\x -1
EndIf
If info1\y < playery Then
info1\y = info1\y +1
ElseIf info1\y > playery Then
info1\y = info1\y -1
EndIf

For info.schuss = Each schuss
DrawImage info\img,info\x,info\y
info\y = info\y -2

If info\y < 5 Then
Delete info

ElseIf ImagesCollide(schuss,info\x,info\y,0,zombie1,info1\x,info1\y,0) Then
Delete info
Delete info1
kill = kill +1
EndIf

Next
Next

End Function


Function schuss()
If KeyHit(57) Then
info.schuss = New schuss
info\img = schuss
info\x = playerx
info\y = playery
EndIf
End Function










.mapdata
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Nicdel

BeitragDo, Okt 13, 2011 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bewegst die Schüsse mehrmals, in der for-Schleife, in der auch die Zombies getested werden. Mach eine seperate Schleife für die Bewegung der Schüsse.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

mafa

BeitragDo, Okt 13, 2011 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hatte ich vorher gemacht und da hatte die kollision nicht funktioniert.

Xeres

Moderator

BeitragDo, Okt 13, 2011 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Nicdel schon schrieb: du benutzt eine extra Schleife. Die hat dann nichts mit Kollision zu tun.
Und besser du nennst deine Type-Variablen nicht "info" - da wäre z für Zombie und s für Schuss sogar noch aussagekräftiger.
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)
 

mafa

BeitragDo, Okt 13, 2011 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die 2 schleifen jetzt wieder getrennt und jede jeweils eine eigene funtion gesteckt. jetzt sind die schüsse immer gleich schnell, aber wenn es zu viele schüsse werden und einer dieser schüsse eine kollision hat dann sagt er das es das object nicht gibt.
BlitzBasic: [AUSKLAPPEN]

For s.schuss = Each schuss
If s\y < 5 Then
Delete s
ElseIf ImagesCollide(schuss,s\x,s\y,0,zombie1,z\x,z\y,0) Then ;die hier markiert er dann
Delete s
Delete z
kill = kill +1
EndIf
Next


der ganze code sieht jetzt so aus:
BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()
frametimer = CreateTimer(30)

;//////////////////////////////////////////////////////////////////////////
;obj
;Karakter
Global spieler = LoadImage("obj\spieler.bmp")
MaskImage spieler, 255,255,255

Global zombie1 = LoadImage ("obj\zombie1.bmp")
MaskImage zombie1,255,0,255


;gegenstände
Global grass = LoadImage("obj\grass.bmp")
MaskImage grass,255,0,255

Global flagge = LoadImage("obj\flagge.bmp")
MaskImage flagge,255,0,255

Global schuss = LoadImage ("obj\kugel.bmp")
MaskImage schuss,255,0,255


;/////////////////////////////////////////////////////////////////////////////
;var,const
Const rauf = 200, runter = 208, rechts = 205, links = 203

Global playerx = 300
Global playery = 300

Global s.schuss
Global z.zombie1

Global ja = 0

Global kill = 0

flagge_x = 700
flagge_y = 500

Global spawn = 0



;//////////////////////////////////////////////////////////////////////
;array,type

Type schuss
Field img
Field x
Field y
End Type

Type zombie1
Field img
Field x
Field y
Field leben
End Type

Dim map(30,20)

Restore mapdata
For y = 0 To 19
For x = 0 To 29
Read map(x,y)
Next
Next
;//////////////////////////////////////////////////////////////////////////
;hauptschleife
Repeat
Cls
WaitTimer(frametimer)








drawmap()
steuerung()
drawzombie()
movezombie()
schuss()
moveschuss()






If schuss = 0 Then DebugLog "schuss nicht da"
If zombie1 = 0 Then DebugLog "zombie nicht da"

Text 0,0, "kill:" + kill
Text 0,10, "spawn" + spawn

DrawImage spieler, playerx,playery

Flip

Until KeyHit(1)
End

;/////////////////////////////////////////////////////////////////////////////
;functionen

Function drawmap()
For y = 0 To 19
For x = 0 To 29
If map(x,y) = 0 Then
DrawImage grass, x*32,y*32
EndIf
If map(x,y) = 1 Then
DrawImage flagge, x*32,y*32
EndIf
Next
Next
End Function



Function steuerung()
If KeyDown(rauf) Then
playery = playery-2
EndIf
If KeyDown(runter) Then
playery = playery+2
EndIf
If KeyDown(links) Then
playerx = playerx -2
EndIf
If KeyDown(rechts) Then
playerx = playerx +2
EndIf
End Function


Function drawzombie()
;If KeyHit(links) Or KeyHit(rechts) Or KeyHit(rauf) Or KeyHit(runter) Then
spawn = spawn+1
If spawn = 15 Then
spawn = 0
z.zombie1 = New zombie1
z\img = zombie
z\x = Rnd(0,800)
z\y = 0
z\leben = 50

EndIf
End Function


Function movezombie()
For z.zombie1 = Each zombie1
DrawImage zombie1,z\x,z\y
If z\x < playerx Then
z\x = z\x +1
ElseIf z\x > playerx Then
z\x = z\x -1
EndIf
If z\y < playery Then
z\y = z\y +1
ElseIf z\y > playery Then
z\y = z\y -1
EndIf


For s.schuss = Each schuss
If s\y < 5 Then
Delete s
ElseIf ImagesCollide(schuss,s\x,s\y,0,zombie1,z\x,z\y,0) Then
Delete s
Delete z
kill = kill +1
EndIf
Next
Next
End Function


Function schuss()
If KeyHit(57) Then
s.schuss = New schuss
s\img = schuss
s\x = playerx
s\y = playery
EndIf
End Function

Function moveschuss()
For s.schuss = Each schuss
DrawImage schuss,s\x,s\y
s\y = s\y -2

Next

End Function







.mapdata
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Nicdel

BeitragDo, Okt 13, 2011 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann teste zuerst ob alle Objekte vorhanden sind. (If obj <> Null)
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Xeres

Moderator

BeitragDo, Okt 13, 2011 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Der eine Zombie wird gegen alle Schüsse getestet. Wenn der Erste Schuss trifft, und du das Objekt löschst, kommt im nächsten Schleifendurchlauf der Fehler, weil z=NULL ist.
Entweder auf Existenz prüfen, oder markieren und löschen, wenn sicher nicht mehr darauf zugegriffen wird.
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)
 

mafa

BeitragDo, Okt 13, 2011 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sind sie, werden auch alle angezeigt. Aber sobalt dann halt eine kollision stattfindet wo mehr als 3 kugeln aufm Bildschirm sind, bekomme ich die fehlermeldung(object does not exist) und er markiert die stelle wo ich die kollision abfrage.


edit: also heist das das ich alle schüsse löschen soll bei der kollision?
 

PhillipK

BeitragDo, Okt 13, 2011 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim groben überfliegen würde ich den Fehler an dieser stelle vermuten:

BlitzBasic: [AUSKLAPPEN]
For s.schuss = Each schuss
If s\y < 5 Then
Delete s
ElseIf ImagesCollide(schuss,s\x,s\y,0,zombie1,z\x,z\y,0) Then
Delete s
Delete z
kill = kill +1
EndIf
Next
Next
End Function


Sagt aus:

Für jeden Schuss - wenn schuss-y kleiner als 5 ist, dann schuss löschen.
Ansonsten, wenn die bilder Kollidieren, dann zombie UND schuss löschen.

Du hast also einen Zombie und prüfst für diesen jeden Schuss.
In dem moment wo ein Zombie getroffen und gelöscht wird, können aber noch weitere schüsse abgefragt werden, die eben genau den eben gelöschten zombie überprüfen wollen.

Somit versucht dein programm etwas abzufragen, was nichtmehr Existiert und protestiert.

Du könntest es zb so ganz leicht umbauen:
BlitzBasic: [AUSKLAPPEN]
For s.schuss = Each schuss
If s\y < 5 Then
Delete s
ElseIf ImagesCollide(schuss,s\x,s\y,0,zombie1,z\x,z\y,0) Then ;kollisionsfall
Delete s ;lösche Schuss
Delete z ;lösche zombie
kill = kill +1
Exit ;neu hinzugekommen: Aus der schuss-überprüfung springen. Das programm landet hinter dem folgenden NEXT.
EndIf
Next ;-> Ende schussschleife
;Punkt, wohin er aufgrund von EXIT springt
;da hier keine weitere abfrage für den Aktuellen Zombie vorgenommen wird, ist das soweit okay.
Next ;-> Ende zombieschleife
End Function


Natürlich nur, sofern ich mich nicht beim überfliegen verguckt habe Smile

Ansonsten gibt es noch die möglichkeit, pro schuss zu fragen, ob z existiert.

BlitzBasic: [AUSKLAPPEN]
For s.schuss = Each schuss
If s\y < 5 Then ; wenn, dann...
Delete s
Else ;ansonsten:
If z <> Null Then ; wenn Zombie <> null (dh er existiert)
If ImagesCollide(schuss,s\x,s\y,0,zombie1,z\x,z\y,0) Then ; wenn Kollision
Delete s ;dann schuss löschen
Delete z ;dann zombie löschen
kill = kill +1
EndIf ;->Kollisionsabfrage
EndIf ;-> Zombie-existiert frage
Next ; -> Schuss-schleife
Next
End Function
 

mafa

BeitragFr, Okt 14, 2011 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Es klappt jetzt alles. Danke für eure Hilfe Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group