Probleme mit der Kollision

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Schnäggli92

Betreff: Probleme mit der Kollision

BeitragDo, Dez 11, 2008 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
tach allerseits
ich habe ein kleines multiplayer game gemacht aber habe keine gescheite kollision hingebracht. gibt es da eine andere möglichkeit als mit speed = speedp -1 möglichkeit? vielen dank für eure antworten

Code: [AUSKLAPPEN]
AppTitle "mexico_shooter"
Graphics 800,600,0,1
SetBuffer BackBuffer()

Global boden = LoadImage ("boden.jpg")
Global lv1 = LoadImage ("lv1_600mal800.bmp")
Global speed = 10
Global speed2 =10
Global laser = LoadImage("shot.bmp")
Global shot_counter = 0
Global shot_counter2 = 0
Global x= 0
Global y = 0
Global gegnerx = 400
Global gegnery = 300
Global leben1 = 50
Global leben2 = 50
posx#=400
posy#=300
posx2#=600
posy2#=500
winkel=0
Dim ImPlayer(359)
TFormFilter 0
Dim ImPlayer2(359)
TFormFilter 0

;Laden des Spielers
AutoMidHandle True
ImPlayer(0)=LoadImage("b_pistolek.bmp")
MaskImage ImPlayer(n),255,0,255
For n=1 To 359
ImPlayer(n)=CopyImage(ImPlayer(0))
MaskImage lv1,255,0,255
MaskImage ImPlayer(n),255,0,255
RotateImage ImPlayer(n),-n
Next

Type shot ;erstellt den Type "shot"
Field shot_x ;x Koordinate
Field shot_y ;y Koordinate
Field w
End Type


;Laden des Spielers
AutoMidHandle True
ImPlayer2(0)=LoadImage("b_pistolek.bmp")
MaskImage ImPlayer2(t),255,0,255
For t=1 To 359
ImPlayer2(t)=CopyImage(ImPlayer2(0))
MaskImage ImPlayer2(t),255,0,255
RotateImage ImPlayer2(t),-t
Next

Type shot2 ;erstellt den Type "shot"
Field shot2_x ;x Koordina
Field shot2_y ;y Koordinate
Field w
End Type
 
Local s.shot2


Color 0,0,0
ClsColor 255,255,255

;Hauptschleife/Mainloop
Repeat
Cls

If KeyDown(75) Then winkel=winkel+10
If KeyDown(77) Then winkel=winkel-10

If KeyDown(72)
posx#=posx#+Cos(winkel) * speed
posy#=posy#-Sin(winkel) * speed
EndIf

If winkel>359 Then winkel=0
If winkel<0 Then winkel=359

If KeyDown(30) Then winkel2=winkel2+10
If KeyDown(32) Then winkel2=winkel2-10

If KeyDown(17)
posx2#=posx2#+Cos(winkel2) * speed2
posy2#=posy2#-Sin(winkel2) * speed2
EndIf

If winkel2>359 Then winkel2=0
If winkel2<0 Then winkel2=359

DrawImage boden,0,0
DrawImage lv1,0,0
DrawImage ImPlayer(winkel),posx#,posy#
DrawImage ImPlayer2(winkel2),posx2#,posy2#

If ImagesCollide(ImPlayer(winkel), posx, posy,frame1, lv1, x, y,frame2 ) Then
speed = speed-1
Else speed = 10
EndIf

If ImagesCollide(ImPlayer2(winkel2), posx2, posy2,frame1, lv1, x, y,frame2 ) Then
speed2 = speed2-1
Else speed2 = 10
EndIf


If KeyDown(208) Then
shot_counter = shot_counter +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter = 2 Then

info.shot = New shot ;hier wird der schuss erstellt
info\shot_x = posx# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
info\shot_y = posy# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
info\w = winkel
shot_counter = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For info.shot = Each shot ; so wird jeder einzelne Schuss angesprochen
info\shot_y = info\shot_y + Cos(info\w+90) * 20
info\shot_x = info\shot_x + Sin(info\w+90) * 20 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,info\shot_x,info\shot_y ; jetzt noch jeden schuss malen
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1, lv1, 0, 0,frame2 ) Then Delete info.shot
Next


If KeyDown(57) Then
shot_counter2 = shot_counter2 +1
End If

;sollte der Zähler 5 erreicht haben, erstelle einen neuen schuss
If shot_counter2 = 5 Then

s.shot2 = New shot2 ;hier wird der schuss erstellt
s\shot2_x = posx2# ;da er ja beim Spieler erstellt werden soll : wird die Schusskoordinate(shot_X) auf hero_x und +5 rüber gelegt
s\shot2_y = posy2# ;beim Y wert ist es nicht anders, da der Hero ja auch rauf und runter fahren kann
s\w = winkel2
shot_counter2 = 0 ; den Zähler auf 0 damit es wieder von vorne losgehen kann
End If

; so nachdem der Schuss/laser erstellt wurde, müssen wir ja sagen das JEDER schuss sich nach oben bewegen soll

For s.shot2 = Each shot2 ; so wird jeder einzelne Schuss angesprochen
s\shot2_y = s\shot2_y + Cos(s\w+90) * 20
s\shot2_x = s\shot2_x + Sin(s\w+90) * 20 ; die Schüsse werden um -8 nach oben bewegt
DrawImage laser,s\shot2_x,s\shot2_y ; jetzt noch jeden schuss malen
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1, lv1, 0, 0,frame2 ) Then Delete s.shot2
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1,ImPlayer(winkel),posx#,posy#,frame2 ) Then leben1 = leben1-1
Next

For s.shot2 = Each shot2
If ImagesCollide(laser,s\shot2_x,s\shot2_y,frame1,ImPlayer(winkel),posx#,posy#,frame2 ) Then Delete s.shot2
Next

If leben1 = 0 Then posx = 450 posy = 60 leben1 = 50



For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1,ImPlayer2(winkel),posx2#,posy2#,frame2 ) Then leben2 = leben2-1
Next

For info.shot = Each shot
If ImagesCollide(laser,info\shot_x,info\shot_y,frame1,ImPlayer2(winkel),posx2#,posy2#,frame2 ) Then Delete info.shot
Next

If leben2 = 0 Then posx2 = 350 posy2 = 60 leben2 = 50



Locate 450,30
Print leben1

Locate 550,30
Print leben2

Delay 20
Flip
Until KeyHit(1)
End

Xeres

Moderator

BeitragDo, Dez 11, 2008 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal ein paar Grundsätzliche Tipps:
TFormFilter gilt für alle Bilder, einmal Ein- oder Ausschalten genügt.
Die Types Shot und Shot2 haben den Selben inhalt. Als Unterscheidungsmöglichkeit benutzt man eher ein zusätzliches Field.
Drehungen um 360 benötigen das Maximum an Speicher, wenn man keine 1° Drehung erkennen kann, reichen größere Drehschritte.
Locate und Print kannst du dir zu gunsten von Text abgewöhnen.
Statt Delay und Flip ist ein Timer und Flip 0 zu empfehlen.

Den ganze Wust an Schüssen kann man in eine For...Each Schleife packen, momentan gehst du die Typeliste für so ziemlich jede einzelne Aktion durch, dass zieht unglaublich an der Performance.
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)

Schnäggli92

BeitragDo, Dez 11, 2008 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die antwort ich kümmere mich später um die performance aber kenn niemand eine andere lösung um eine kollision zu realisieren??
vielen dank für die antwort

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group