Kollisionsabfrage greift nicht

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

funkmaster5000

Betreff: Kollisionsabfrage greift nicht

BeitragFr, Aug 22, 2014 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo an alle,

die Kollisionsabfrage macht mich schon seit Tagen verrückt! Könnten die Profis mal einen Blick drauf werfen, bitte?

Meine Fragen betreffen den Block:
Code: [AUSKLAPPEN]
Collisions coll_plane,coll_ufo,1,1
Collisions coll_ufo,coll_plane,1,1


Dazu erst mal: müssen beide Varianten abgedeckt sein, oder reicht eine?

Ich habe diesen so eingerichtet, weil ich in der Function CheckCollisions() prüfen möchte
Code: [AUSKLAPPEN]

Function CheckCollisions()
   For enemy.tenemy = Each tenemy
      If EntityCollided(enemy\obj,coll_plane) <> 0 Then
         End
      End If
   Next
End Function


Aber das funktioniert einfach nicht, der Spieler fliegt durch den Gegner.

Wenn ich aber schreibe:
Code: [AUSKLAPPEN]

Function CheckCollisions()
   player.tplayer = First tplayer
   
   For enemy.tenemy = Each tenemy
      If EntityCollided(player\obj,coll_ufo) <> 0 Then
         End
      End If
   Next
   
End Function


Dann funktioniert's!

Hier der ganze Code:
Code: [AUSKLAPPEN]
[code]; ------------------------------------
; ----------
; COLLISION
; ----------
Const coll_plane% = 1
Const coll_plane_bullet% = 2
Const coll_ufo% = 3

; ------------------
; CREATE PLAYER TYPE
; ------------------
Type tplayer
   Field x#
   Field y#
   Field z#
   Field ay#
   Field dx#
   Field dy#
   Field dz#
   Field day#
   Field obj%
   Field climbspeed%
   Field turnspeed%
   Field speed#
   Field maxspeed%
End Type

player.tplayer = New tplayer
player\obj = LoadMesh("media/plane.x")
EntityType player\obj,coll_plane
EntityRadius player\obj,10,5

; -----------------
; CREATE ENEMY TYPE
; -----------------
Type tenemy
   Field x#
   Field y#
   Field z#
   Field obj%
End Type

enemy.tenemy = New tenemy
enemy\x = 0
enemy\y = 10
enemy\z = 0
enemy\obj = LoadMesh("media/invader1.3ds")
EntityType enemy\obj,coll_ufo
EntityRadius enemy\obj,50
PositionEntity enemy\obj,enemy\x,enemy\y,enemy\z

Collisions coll_plane,coll_ufo,1,1
Collisions coll_ufo,coll_plane,1,1

; --------------
; MAIN GAME LOOP
; --------------

While Not KeyHit(1)
   PlayerInput()
   UpdatePlane1()
   CheckCollisions()
   UpdateWorld
   RenderWorld
   
   WaitTimer(takt)
   Flip
Wend

EndGraphics
End


Function CheckCollisions()
   For enemy.tenemy = Each tenemy
      If EntityCollided(enemy\obj,coll_plane) <> 0 Then
         End
      End If
   Next
   
End Function

[/code]

Xeres

Moderator

BeitragFr, Aug 22, 2014 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das erste Objekt (oder kollisionsgruppe) bei Collisions ist das sich bewegende, das zweite die still stehende.
Bei EntityCollided ist der zweite Parameter keine Kollisionsgruppe Exclamation
Wie im Beispiel in der Hilfe zu sehen ist, geht der wert von 1 bis CountCollisions und liefert dir das (still stehende) Objekt in das das bewegte reingekracht ist.

Es sollte also so in der Art funktionieren:
BlitzBasic: [AUSKLAPPEN]
Function CheckCollisions()
For enemy.tenemy = Each tenemy
For i = 1 To CountCollisions(enemy\obj)
If EntityCollided(enemy\obj, i) <> 0 Then
End
End If
Next
Next
End Function


Kann mich täuschen, ist lang her das ich mit den Befehlen aktiv was gemacht habe...
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)
 

funkmaster5000

BeitragSa, Aug 23, 2014 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir für die Antwort. Werde ich sofort ausprobieren, bin leider gerade nicht zu Hause und hab kein B3D zur Verfügung.

Ich habe mir den Code zu wing_ring angesehen und darauf wollte ich meine Kollisionsabfrage aufbauen. Entweder habe ich den Block mit CountCollisions dort übersehen oder ich habe die falschen Schlüsse aus dem Code gezogen. Das war ein Beispiel im B3D Ordner.

Ich sage auf jeden Fall Bescheid.
 

funkmaster5000

BeitragDi, Aug 26, 2014 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat leider nicht funktioniert Sad
 

CO2

ehemals "SirMO"

BeitragDi, Aug 26, 2014 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab auch schon Ewigkeiten nicht mehr mit Blitz3D gearbeitet, aber wenn ich den Code aus der Hilfe richtig ableite, müsste Folgendes funktionieren BlitzBasic: [AUSKLAPPEN]
Function CheckCollisions()
For enemy.tenemy = Each tenemy
For i = 1 To CountCollisions(enemy\obj)
If CollisionEntity(enemy\obj, i) <> 0 Then ; CollisionEntity mit Index, EntityCollided mit Entity...
End
End If
Next
Next
End Function
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

funkmaster5000

BeitragDi, Aug 26, 2014 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe die Funktion genau so umgearbeitet, wie von euch bzw. in der Hilfe dargestellt. Prüfe ich CountCollisions(player\obj) dann funktioniert alles tadellos. Prüfe ich CountCollisions(enemy\obj) erhalte ich trotz Kollision als Wert 0. Die Kollision wird nicht ermittelt. Alles ist meines Erachtens vernünftig eingestellt. Hier mal wirklich der komplette Code. Die Bewegung basiert auf dem Spiel wing_ring, das bietet nämlich eine spaßige Flugzeug Arcade-Steuerung. Xeres hat oben erwähnt, dass bei der Initialisierung von Collisons der erste Wert das sich bewegende Objekt kennzeichnet. Mein enemy\obj bewegt sich allerdings noch nicht, da noch keine AI implementiert wurde. Daran kann es doch aber nicht liegen, oder?

Code: [AUSKLAPPEN]
;

; ------------
; SET INI PATH
; ------------
Global inipath$ = "config.ini"

; ---------
; INIT GFX
; ---------
Global width = GetIniItem(inipath,"gfx","resx")
Global height  = GetIniItem(inipath,"gfx","resy")
Global depth = GetIniItem(inipath,"gfx","depth")
Global mode = GetIniItem(inipath,"gfx","fullscreen")

Graphics3D width,height,depth,mode
SetBuffer BackBuffer()

; -------------
; RND & TIMING
; -------------
SeedRnd MilliSecs()
Global takt% = CreateTimer(60)

; ----------
; COLLISION
; ----------
Const coll_plane% = 1
Const coll_plane_bullet% = 2
Const coll_ufo% = 3
Const coll_ufo_bullet% = 4

; --------------------
; HANDLE INPUT DEVICES
; --------------------
Global joy_use = GetIniItem(inipath,"input","joystick")

Global key_up% = GetIniItem(inipath,"input","key_up")
Global key_down% = GetIniItem(inipath,"input","key_down")
Global key_right% = GetIniItem(inipath,"input","key_right")
Global key_left% = GetIniItem(inipath,"input","key_left")
Global key_throttle% = GetIniItem(inipath,"input","key_throttle")
Global key_break% = GetIniItem(inipath,"input","key_break")
Global key_fire% = GetIniItem(inipath,"input","key_fire")

Global joy_throttle% = GetIniItem(inipath,"input","joy_throttle") ;A Button
Global joy_break% = GetIniItem(inipath,"input","joy_break") ;B Button
Global joy_fire% = GetIniItem(inipath,"input","joy_fire") ;X Button


; ------------------
; CREATE PLAYER TYPE
; ------------------
Type tplayer
   Field x#
   Field y#
   Field z#
   Field ay#
   Field dx#
   Field dy#
   Field dz#
   Field day#
   Field obj%
   Field climbspeed%
   Field turnspeed%
   Field speed#
   Field maxspeed%
End Type

player.tplayer = New tplayer
player\obj = LoadMesh("media/plane.x")
EntityType player\obj,coll_plane
EntityRadius player\obj,10,5
player\climbspeed = 2
player\turnspeed = 2
player\speed = 0
player\maxspeed = 10

player\y = 100
player\ay = 180
player\day = 180
player\dx = 0
player\dy = 100
player\dz = 0

; -----------------
; CREATE ENEMY TYPE
; -----------------
Type tenemy
   Field x#
   Field y#
   Field z#
   Field obj%
End Type

enemy.tenemy = New tenemy
enemy\x = 0
enemy\y = 10
enemy\z = 0
enemy\obj = LoadMesh("media/invader1.x")
EntityType enemy\obj,coll_ufo
EntityRadius enemy\obj,15
PositionEntity enemy\obj,enemy\x,enemy\y,enemy\z

; -----------------------------
; LIGHTING AND CAMERA VARIABLES
; -----------------------------

AmbientLight 255,255,255

;create main_cam1
Global main_cam1 = CreateCamera()
CameraRange main_cam1,1,9995
CameraFogRange main_cam1,5000,9995
CameraFogMode main_cam1,False
CameraClsColor main_cam1,0,0,90

;camera position values
Global cam1_x#,cam1_y#=100,cam1_z#,cam1_ay#=180      ; Current values
Global cam1_dx#,cam1_dy#=100,cam1_dz#,cam1_day#=180   ; Destination values

; -------
; LEVEL
; -------
Global ground = CreatePlane()
EntityColor ground,0,120,0

; Plane + camera curve values
Const curve_plane# = 10
Const curve_cam# = 15

Collisions coll_plane,coll_ufo,1,1
Collisions coll_ufo,coll_plane,1,1

; --------------
; MAIN GAME LOOP
; --------------
StartGame()

While KeyHit(1)<>True
   
   PlayerInput()
   UpdatePlane1()
   CheckCollisions()
   UpdateWorld
   RenderWorld
   
   WaitTimer(takt)
   Text 0,0,"Y :" + player\y
   Text 0,2 * FontHeight(),"Speed " + player\speed
   Text 0,3 * FontHeight(),"COL Plane: " + EntityCollided(player\obj,coll_ufo)
   Text 0,4 * FontHeight(),CountCollisions(player\obj)
   Flip
Wend

EndGraphics
End


Function CheckCollisions()
   Local i%
   
   For enemy.tenemy = Each tenemy
      For i = 1 To CountCollisions(enemy\obj)
         If CollisionEntity(enemy\obj, i) <> 0 Then   ; CollisionEntity mit Index, EntityCollided mit Entity...
            End
         End If
      Next
   Next
   
End Function


; -------------------
; Start game function
; -------------------

Function StartGame()
   player.tplayer = First tplayer
   
   player\x = 0
   player\z = 0
   player\ay = 180
   
   player\dx = 0
   player\dz = 0
   player\day = 180
   
   cam1_x# = player\x
   cam1_z# = player\z
   cam1_ay# = player\ay
   
   cam1_dx# = player\dx
   cam1_dz# = player\dz
   cam1_day# = player\day
   
   PositionEntity player\obj,0,player\y,0
   
End Function

; --------------
; PLAYER INPUT
; --------------

Function PlayerInput()
   player.tplayer = First tplayer
   
   If joy_use = 0 Then
      If KeyDown(key_up) Then
         player\dy = player\dy + player\climbspeed
         cam1_dy=cam1_dy + player\climbspeed
      End If
      
   
      If KeyDown(key_down) Then
         player\dy = player\dy - player\climbspeed
         cam1_dy=cam1_dy - player\climbspeed
      End If
      
      If KeyDown(key_right) Then
         player\day = player\day + player\turnspeed
         cam1_day=cam1_day + player\turnspeed
      End If
      
   
      If KeyDown(key_left) Then
         player\day = player\day - player\turnspeed
         cam1_day=cam1_day - player\turnspeed
      End If
      
      If KeyDown(key_throttle) Then
         player\speed = player\speed + 0.1
         If player\speed > player\maxspeed Then player\speed = player\maxspeed
      End If
      
   
      If KeyDown(key_break) Then
         player\speed = player\speed - 0.1
         If player\speed <0 Then player\speed = 0
      End If
      
      
      If KeyHit(key_fire) Then
         p1.plane1_bullet=New plane1_bullet
         p1\entity=CopyEntity(bullet,player\obj)
         EntityParent p1\entity,0
         TurnEntity p1\entity,0,270,0
         MoveEntity p1\entity,0,0,10
         p1\alpha=0
      End If
   End If
   

   If joy_use = 1 Then
      If JoyYDir() = -1 Then
         player\dy = player\dy + player\climbspeed
         cam1_dy=cam1_dy + player\climbspeed
      End If
      
   
      If JoyYDir() = 1 Then
         player\dy = player\dy - player\climbspeed
         cam1_dy=cam1_dy - player\climbspeed
      End If
      
   
      If JoyXDir() = -1 Then
         player\day = player\day + player\turnspeed
         cam1_day=cam1_day + player\turnspeed
      End If
      
   
      If JoyXDir() = 1 Then
         player\day = player\day - player\turnspeed
         cam1_day=cam1_day - player\turnspeed
      End If
      
   
      If JoyDown(joy_throttle) = 1 Then
         player\speed = player\speed + 0.1
         If player\speed > player\maxspeed Then player\speed = player\maxspeed
      End If
      
   
      If JoyDown(joy_break) = 1 Then
         player\speed = player\speed - 0.1
         If player\speed <0 Then player\speed = 0
      End If
      
   
      If JoyHit(joy_fire) Then
         p1.plane1_bullet=New plane1_bullet
         p1\entity=CopyEntity(bullet,player\obj)
         EntityParent p1\entity,0
         TurnEntity p1\entity,0,270,0
         MoveEntity p1\entity,0,0,10
         p1\alpha=0
      End If
   End If
End Function


; ----------------------
; Update plane1 function
; ----------------------

Function UpdatePlane1()
   player.tplayer = First tplayer

   ; Prevent plane1 and main cam from going too low/high
   If player\dy <2 Then player\dy = 2
   If player\dy >1000 Then player\dy = 1000
   If cam1_dy<2 Then cam1_dy=2
   If cam1_dy>1000 Then cam1_dy=1000

   ; Update plane1 position/angle values
   player\x = CurveValue#(player\x,player\dx,curve_plane)
   player\y = CurveValue#(player\y,player\dy,curve_plane)
   player\z = CurveValue#(player\z,player\dz,curve_plane)
   player\ay = CurveValue#(player\ay,player\day,curve_plane)

   PositionEntity player\obj,player\x,player\y,player\z
   RotateEntity player\obj,0,player\ay + 90,0

   ; Update camera1 position values
   cam1_x=CurveValue#(cam1_x,cam1_dx,curve_cam)
   cam1_y=CurveValue#(cam1_y,cam1_dy,curve_cam)
   cam1_z=CurveValue#(cam1_z,cam1_dz,curve_cam)
   cam1_ay=CurveValue#(cam1_ay,cam1_day,curve_cam)
   
   PositionEntity main_cam1,player\x+Sin(cam1_ay)*50,cam1_y,player\z - Cos(cam1_ay) * 50
   RotateEntity main_cam1,0,cam1_ay,0
   
   
   ; Update plane1 bullets
   For p1.plane1_bullet=Each plane1_bullet
      MoveEntity p1\entity,0,0,20
      If EntityDistance(p1\entity,player\obj)>2500 Then FreeEntity p1\entity : Delete p1
   Next
   
   
   player\dx = player\dx - Sin(player\ay) * player\speed
   player\dz = player\dz + Cos(player\ay) * player\speed
   cam1_dx=cam1_dx-Sin(cam1_ay) * player\speed
   cam1_dz=cam1_dz+Cos(cam1_ay) * player\speed

End Function


;---------------------
; Curve value function
;---------------------

Function CurveValue#(current#,destination#,curve)
   current#=current#+((destination#-current#)/curve)
   Return current#
End Function
 

CO2

ehemals "SirMO"

BeitragDi, Aug 26, 2014 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Müsste nicht theoretisch einmal Collision reichen? Wenn du dem Flugzeug Collisions zurordnest, werden die doch auch aufgerufen, wenn das Ufo in das Flugzeug fiegt... Dann musst du in CheckCollisions nur alle Kollisionen des Flugzeugs prüfen...

Wie gesagt, hab schon lange nicht mehr mit Blitz3D gearbeitet, könnte mir aber vorstellen, dass das geht...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

funkmaster5000

BeitragDi, Aug 26, 2014 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte das Objekt des Gegners löschen, wenn das Flugzeug damit kollidiert. Daher muss ich prüfen, ob der Gegner mit dem Spieler kollidiert, damit ich in diesem Fall auch das richtige Objekt löschen kann.

Xeres

Moderator

BeitragDi, Aug 26, 2014 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
So weit ich es überblicken kann, sieht alles richtig aus.
Entweder du wirfst das ganze drum herum aus dem Code, bis nur noch das Problem übrig ist, oder du schreibst nur die nötigsten Befehle zusammen. Dann kann man das Problem lokalisieren.
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)

DAK

BeitragMi, Aug 27, 2014 9:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ersetz doch mal deine Grafiken durch Kugeln mit der Größe der Kollisions-Spheres. Vielleicht sind die einfach zu klein oder so.

Hab deinen Code so getestet (nur mit Kugeln), da ich ja deine Modelle nicht hab, bei mir funktioniert's.
Gewinner der 6. und der 68. BlitzCodeCompo
 

funkmaster5000

BeitragDo, Aug 28, 2014 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab sie einfach mal durch Spheres ersetzt. Funktioniert trotzdem nicht! Das gibts doch nicht, ich werd wahnsinnig Sad

Vlt. geht ja ein Workaround mit einer Prüfung von EntityDistance? Bei einer Kollision brauche ich nämlich nicht wirklich eine Aktion wie Stoppen oder Sliden. Denn da wird nur eine Explosion ausgelöst. Aber ich würde schon gerne die Kollisionsabfrage verstehen, praktisch und vor allem essenziell ist sie ja. Ich habe mir so viel Mühe mit dem Game gegeben und jetzt scheitert es an der Kollisionsabfrage. So schwer kann das doch nicht sein!

Hier gibt es ein etwas ausführlicheres Beispiel, aber soweit ich das überblicke ist das nichts anderes, als das, was wir hier schon hatten:

http://www.blitzbasic.com/code...?code=3141
 

CO2

ehemals "SirMO"

BeitragDo, Aug 28, 2014 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du das ausführliche Beispiel bei dir getestet? Funktioniert es? Wenn ja, gibt es einen Unterschied zwischen deinem Code und dem im Beispiel (Ich meine nicht oberflächlich, sondern prinzipiell Wink). Funktioniert auch das Beispiel bei dir nicht, liegt es an etwas anderem, wobei ich die Blitz3D Version vermuten würde.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

funkmaster5000

BeitragSa, Sep 06, 2014 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe das Beispiel der Website implementiert und es funktioniert. Lag bei mir an der Auswertung von EntityCollided. Dies wird in dem Beispiel einfach auf EntityCollided(ZuPrüfendesObjekt,1) gesetzt und es funktioniert. Ich hatte ja versucht, über eine Schleife mit CountCollisions auf EntityCollided zu prüfen. Das war anscheinend nicht notwendig. Die Arrays für die Kollisionstypen in dem Beispiel habe ich allerdings weggelassen, da ich mit Types arbeite.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group