Kollisionsabfrage greift nicht
Übersicht BlitzBasic Blitz3D
funkmaster5000Betreff: Kollisionsabfrage greift nicht |
Fr, Aug 22, 2014 12:18 Antworten mit Zitat |
|
---|---|---|
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] |
||
XeresModerator |
Fr, Aug 22, 2014 20:25 Antworten mit Zitat |
|
---|---|---|
Das erste Objekt (oder kollisionsgruppe) bei Collisions ist das sich bewegende, das zweite die still stehende.
Bei EntityCollided ist der zweite Parameter keine Kollisionsgruppe 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() 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
funkmaster5000 |
Sa, Aug 23, 2014 10:41 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Aug 26, 2014 17:51 Antworten mit Zitat |
|
---|---|---|
Hat leider nicht funktioniert | ||
CO2ehemals "SirMO" |
Di, Aug 26, 2014 18:00 Antworten mit Zitat |
|
---|---|---|
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() |
||
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 |
Di, Aug 26, 2014 18:10 Antworten mit Zitat |
|
---|---|---|
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 |
||
CO2ehemals "SirMO" |
Di, Aug 26, 2014 18:20 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Aug 26, 2014 18:31 Antworten mit Zitat |
|
---|---|---|
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. | ||
XeresModerator |
Di, Aug 26, 2014 20:33 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
DAK |
Mi, Aug 27, 2014 9:57 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Aug 28, 2014 15:29 Antworten mit Zitat |
|
---|---|---|
Ich hab sie einfach mal durch Spheres ersetzt. Funktioniert trotzdem nicht! Das gibts doch nicht, ich werd wahnsinnig
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 |
||
CO2ehemals "SirMO" |
Do, Aug 28, 2014 18:25 Antworten mit Zitat |
|
---|---|---|
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 ). 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 |
Sa, Sep 06, 2014 14:57 Antworten mit Zitat |
|
---|---|---|
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. | ||
Übersicht BlitzBasic Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group