Kollision greift nicht (Sprite & Object)
Übersicht BlitzBasic Blitz3D
funkmaster5000Betreff: Kollision greift nicht (Sprite & Object) |
So, Apr 06, 2014 1:19 Antworten mit Zitat |
|
---|---|---|
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 |
So, Apr 06, 2014 2:24 Antworten mit Zitat |
|
---|---|---|
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 |
So, Apr 06, 2014 2:51 Antworten mit Zitat |
|
---|---|---|
Danke für die schnelle Antwort. Die Objekte werden erstellt und nicht ausgeblendet, denn ich kann Sie sehen. Daran kanns also nicht liegen. | ||
DAK |
So, Apr 06, 2014 8:17 Antworten mit Zitat |
|
---|---|---|
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 |
So, Apr 06, 2014 8:26 Antworten mit Zitat |
|
---|---|---|
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]
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]
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 |
||
funkmaster5000 |
So, Apr 06, 2014 17:19 Antworten mit Zitat |
|
---|---|---|
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! |
||
Übersicht BlitzBasic Blitz3D
Powered by phpBB © 2001 - 2006, phpBB Group