Kollision greift nicht (Sprite & Object)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

funkmaster5000

Betreff: Kollision greift nicht (Sprite & Object)

BeitragSo, Apr 06, 2014 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo an alle,

dank der genialen Onlinehilfe habe ich mich an das Thema Kollsionen heranwagen können. Leider funktioniert die Kollisionserkennung bei meinem Beispiel nicht so wirklich. Geprüft werden soll ein Sprite mit einem Object. Dem Sprite habe ich eine Box zugewiesen, dem Object eine Sphere und zwar so:

Code: [AUSKLAPPEN]
Global col_player = 1
Global col_world = 2

EntityType cube,col_world
EntityRadius cube,2,2

EntityType player\obj,col_player
EntityBox player\obj,player\x,player\y,player\z,5,5,5


Cube ist in diesem Fall mein Object und player\obj mein Spieler-Sprite. Positioniert sind sie so:

Code: [AUSKLAPPEN]
PositionEntity cube,10,0,0
PositionEntity player\obj,0,1,0
ScaleEntity cube,2,2,2



Das ist meine Hauptschleife (in der Onlinehilfe wird Collisions nur einmal vor der Schleife ausgeführt, in einem Youtube Tutorial in der Schleife. Egal wie ich es anordne...es funktioniert trotzdem nicht).

Code: [AUSKLAPPEN]
While Not KeyHit(key_escape)
   Collisions col_world,col_player,3,2
   PlayerInput()
   MovePlayer()

   WaitTimer(takt)   
   UpdateWorld()
   RenderWorld()

   Flip
   
Wend


Erkennt ihr vielleicht einen Noob-Fehler? Tausend Dank im Voraus!

Dottakopf

BeitragSo, Apr 06, 2014 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine erste Reaktion ist das die das Objekt mit dem du die Kollision überprüfst entweder nicht erstellt wurde.. oder es evt. mit hideentity und nicht mit entityalpha ausgelbendet wurde

der befehlt collisions wird nicht in der Hauptschleife ausgeführt !
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

funkmaster5000

BeitragSo, Apr 06, 2014 2:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle Antwort. Die Objekte werden erstellt und nicht ausgeblendet, denn ich kann Sie sehen. Daran kanns also nicht liegen.

DAK

BeitragSo, Apr 06, 2014 8:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir noch auffällt: Der Collisions-Befehl gehört vor die Hauptschleife.

Code: [AUSKLAPPEN]
EntityBox player\obj,player\x,player\y,player\z,5,5,5

Hier gehört für die Position meines Erachtens nach nicht die Position in World Space sondern in Model Space, also von der Position und Rotation des Modells ausgehend. Also gehört hier nicht die Position des Spielers sondern entweder die Mitte oder das linke untere Eck des Objekts (bin mir nicht sicher) von Objekt aus gesehen.
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragSo, Apr 06, 2014 8:26
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK's aussage aufgreifend:

https://www.blitzforum.de/help/EntityBox

Hier wird im beispiel deutlich, das die untere, hintere, linke ecke genommen wird:
BlitzBasic: [AUSKLAPPEN]

EntityBox cube, - 10, - 10, - 10, 20, 20, 20

und das ganze mit einer größe von 20x20x20 einheiten.

Da ein Cube generell meines wissens 2x2x2 einheiten groß ist (
Zitat:
Der Würfel wird an der Position 0,0,0 erstellt und reicht von -1,-1,-1 bis +1,+1,+1.
)
erklärt folgendes auch:
BlitzBasic: [AUSKLAPPEN]

ScaleEntity cube, 10, 10, 10

Das die EntityBox _NICHT_ mit skaliert wird.

Heißt im klartext, das dein code in etwa so aussehen muss:
BlitzBasic: [AUSKLAPPEN]
EntityBox player\obj,-2.5,-2.5,-2.5,5,5,5
, und falls du deinen player skalierst, musst du die werte ebenfalls um den faktor/2 erhöhen.
Letztere aussage ist geraten, das muss ein echtzeittest zeigen Smile
 

funkmaster5000

BeitragSo, Apr 06, 2014 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
So funktioniert's, der Fehler ist dick markiert:

Code: [AUSKLAPPEN]
;++COLLISIONS++

Global col_player = 1
Global col_world = 2
EntityType cube,col_world
EntityType player\obj,col_player
EntityRadius cube,1,1
;ScaleEntity cube,2,2,2

COLLISIONS COL_PLAYER,COL_WORLD,3,2

;**MAIN GAME LOOP**

While Not KeyHit(key_escape)
   
   PlayerInput()
   MovePlayer()
   WaitTimer(takt)   
   
   CountFPS()
   UpdateWorld()
   RenderWorld()
   
   Text 0,0,fps
   Flip 1
   
Wend


Allerdings bewegt sich jetzt meine Kamera (Vogelperspektive) trotzdem weiter. Versuche ich sie so zu stoppen:

Code: [AUSKLAPPEN]
Function PlayerInput() ;controls the player input
   
   player.tplayer = First tplayer ;switch to the first player (the only one existing)
   
   Local kollision% = EntityCollided(player\obj,2)
   
   If KeyDown (walk_forward) And kollision = 0 Then ;if the forward key is pressed
      player\speed = 0.1 ;set the player speed to 0.1
      player\mx = player\speed * Cos(player\rotation) ;calculate the players x movement
      player\mz = player\speed *Sin(player\rotation) ;calculate the players z movement
      player\x = player\x + player\mx ;add the x movement to the players x position
      player\z = player\z + player\mz ;add the z movement to the players z position
   End If
   
End Function


Liefert mir kollision% natürlich eine 1. Das ändert sich aber nicht, also kann ich den Player nach einer Kollision nicht mehr bewegen. Gibt es hier vielleicht Abhilfe? Ich hab mich schon gefreut, dass ich gar nicht erst bestimmen muss, von welcher Richtung der Player kollidiert, da er bei einer Kollision ja automatisch verschiebbar ist (mit Modus 2 bei Collisions). Jetzt steckt er fest!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group