Problem mit Kollision und Schwerkraft
Übersicht

PacManiBetreff: Problem mit Kollision und Schwerkraft |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also, ich programmiere gerade mein 3D-Jump'n'Run und habe jetzt ein Problem mit der Formulierung der If-Gruppe für Schwerkraftsberechnung, hier zu sehen unter "Gravity calculation". Ich habe mal wieder soviel rumgemurkst, dass keiner meine Fehlerbeschreibung unten wohl nachvollziehen kann ![]() Code: [AUSKLAPPEN] Graphics3D 800, 600, 32, 2
SetBuffer BackBuffer() Global FPSTimer = CreateTimer(60) Const PlayerCollisions = 1 ;ColCount Const LevelCollisions = 2 Const ToEllipsoid = 1 ;ColType Const ToPolygon = 2 Const ToBox = 3 Const SlidingNone = 1 ;ColResponse Const SlidingFull = 2 Const SlidingPrevent = 3 Global Player LoadLevel(1) While Not KeyHit(1) ;Check keys If KeyDown(203) Then TurnEntity Player, 0, 2, 0 If KeyDown(205) Then TurnEntity Player, 0, -2, 0 If KeyDown(208) Then MoveEntity Player, 0, 0, -.2 If KeyDown(200) Then MoveEntity Player, 0, 0, 0.2 ;Gravity calculations -------------------------------------------------------------guckst du hier :D If CountCollisions(Player) = 0 Then ;dämliche Formulierung fängt hier wohl schon an Gravity# = Gravity# + 0.01 ;verursacht den Fehler (s. unten) If Gravity# > 0.75 Then Gravity# = 0.75 Else If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 Else Gravity# = Gravity# + 0.01 If Gravity# > 0.75 Then Gravity# = 0.75 End If End If MoveEntity Player, 0, -Gravity#, 0 WaitTimer FPSTimer UpdateWorld 0.5 RenderWorld <offtopic code> Flip False Wend End Function LoadLevel(LevelNumber) <offtopic code> End Function Und zwar ergibt sich hier das Problem, dass die Schwerkraft immer zwischen 0 und 0.01 ruckelt, wenn man auf einer Plattform steht - verursacht ein ständiges leichtes Runterrutschen auf der schrägen Plattform, aber dass soll es nicht (wobei ich FullSliding respone schon haben möchte). Wer das Deiert zusammen mit dem Testlevel laden möchte, findet es hier: https://www.blitzforum.de/upload/file.php?id=7601 Zeigt auch schön die Macken an ![]() |
||
- Zuletzt bearbeitet von PacMani am Sa, Dez 19, 2009 23:50, insgesamt 3-mal bearbeitet
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das kann eigentlich nur an derZeile....
If CollisionNY(Player, 1) > 0.70 Then ....liegen. Denn dort wird das ganze immer wieder auf 0 gesetzt. Wahrscheinlich glaubst Du, dass diese IF gar nicht zutrifft und deshalb das 0-Setzen eigentlich nicht möglich sein sollte, aber irgendwie passiert es doch. Du kannst es testen mit einem DEBUGLOG-Eintrag oder PRINT Code: [AUSKLAPPEN] If CountCollisions(Player) = 0 Then ;dämliche Formulierung fängt hier wohl schon an
Gravity# = Gravity# + 0.01 ;verursacht den Fehler (s. unten) DEBUGLOG "Gravity erhöhen" If Gravity# > 0.75 Then Gravity# = 0.75 Else If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 DEBUGLOG "Gravity wieder zurücksetzen" Else Gravity# = Gravity# + 0.01 DEBUGLOG "Gravity erhöhen" If Gravity# > 0.75 Then Gravity# = 0.75 End If End If |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kann sein, stehe völlig auf dem Schlauch ![]() Kann dir nur sagen, wieso ich die Zeile reingesetzt habe, damit vielleicht ein besserer Lösungsansatz dafür gefunden werden kann; Sobald man halt auf leicht schrägen Plattformen steht, soll man nicht mehr runterrutschen. Wenn die Plattform aber schon schräger wird (und damit CollisionNY ja einen kleineren Wert ausgibt), soll man rutschen, und von daher lass ich der Schwerkraft dann freien Lauf. Könnte man nicht einfach die FullSliding-Response 2 mit dem 3er-response austauschen (der Abrutschen verhindern soll)? EDIT: Hast recht, die Gravity wird ständig zurückgesetzt und wieder aufgenommen :S |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
teste doch bitte erst mal, ob es überhaupt so is, wie ich behaupte....
EDIT: ah! EDIT #2: Dann ist vielleicht der Grenzwert 0.70 für CollisionNY(Player, 1) falsch gewählt? Is' CollisionNY eine BB-Funktion, oder was von Dir? Ich kann das nur im Befehlsumfang von B3D finden... |
||
- Zuletzt bearbeitet von Midimaster am Sa, Dez 19, 2009 20:19, insgesamt einmal bearbeitet
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() Habe es so eingefügt Code: [AUSKLAPPEN] If CountCollisions(Player) = 0 Then ;dämliche Formulierung fängt hier wohl schon an
Gravity# = Gravity# + 0.01 ;verursacht den Fehler (s. unten) DebugLog "Gravity erhöhen im Anfang" If Gravity# > 0.75 Then Gravity# = 0.75 Else If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 DebugLog "Gravity wieder zurücksetzen" Else Gravity# = Gravity# + 0.01 DebugLog "Gravity erhöhen in der Else Gruppe" If Gravity# > 0.75 Then Gravity# = 0.75 End If End If Verursacht wird die Gravity-Macke mit "Erhöhen im Anfang", das "in der Else-Gruppe" tritt nur auf, wenn man auf zu schrägen Plattformen steht und dann runterrutscht, was ja auch ok ist. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann kann es nur daran liegen, dass Gravity nicht GLOBAL ist?
Füg mal noch folgendes ein: DEBUGLOG "Gravity=" + gravity |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Habs jetzt oben mit Global initialisiert, aber rutschen tu' ich trotzdem.
Folgendes habe ich auch schonmal angeguckt, ändert aber nix (falsche Herangehensweise von mir?): Code: [AUSKLAPPEN] If CountCollisions(Player) = 0 Then
Collisions PlayerCollisions, LevelCollisions, ToPolygon, SlidingPrevent ;soll ja angeblich den Spieler vom Runterrutschen bewahren, tuts aber nicht Gravity# = Gravity# + 0.01 If Gravity# > 0.75 Then Gravity# = 0.75 Else If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 DebugLog "Gravity wieder zurücksetzen" Else Gravity# = Gravity# + 0.01 DebugLog "Gravity erhöhen in der Else Gruppe" If Gravity# > 0.75 Then Gravity# = 0.75 End If End If EDIT: Ja, das Debuglog bestätigt das Hin- und Herruckeln zwischen 0 und 0.01. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetzt kapier ich auch grad erst, wie es eigentlich sein soll: Du willst, dass die Gravity in solchen Momenten bei 0 bleibt, oder? | ||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja ![]() Also ich fasse nochmal zusammen, weil ich mich selbst ein wenig ordnen muss: Das Level besteht aus verschieden schrägen Flächen, manche sind stärker schräg und manche weniger. Dann ist da der Spieler, der einige Flächen hochkrackseln kann die weniger schräg sind und zu schräge wieder nicht. Also dachte ich mir dass so: Spieler in der Luft: Gravity wird erhöht damit er nach unten auf den Boden fällt Spieler auf gerader Fläche: Garnichts passiert Spieler auf leicht schräger Fläche: Garnichts passiert (hier liegt das Problem: Er rutscht ja doch) Spieler auf zu schräger Fläche: Er soll herunterrutschen EDIT: Habe den Code STARK vereinfachen können ![]() ![]() Code: [AUSKLAPPEN] ;Gravity calculations
Gravity# = Gravity# + 0.01 If Gravity# > 0.75 Then Gravity# = 0.75 If CountCollisions(Player) > 0 Then If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 End If |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
probier mal:
Code: [AUSKLAPPEN] ;Gravity calculations
Gravity# = Gravity# + 0.01 If Gravity# > 0.75 Then Gravity# = 0.75 If CountCollisions(Player) > 0 Then If CollisionNY(Player, 1) > 0.70 Then Gravity# = -0.1 End If nur so ne idee... sorry für die lange Pause ... ich war grad Glühwein aufnehmen auf dem Weihnachtsmarkt vor der Haustüre. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kein Problem ![]() Aber leider bringt das nichts, hatte ich schon ausprobiert ![]() |
||
- Zuletzt bearbeitet von PacMani am So, Dez 20, 2009 14:28, insgesamt einmal bearbeitet
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und während dieses leichten Rutschens kommt nie die Meldung "Gravity erhöhen im Anfang"? | ||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wo soll ich den DebugLog-Befehl testweise einfügen? Ist jetzt gerade garnicht drin, aber in
Code: [AUSKLAPPEN] Gravity# = Gravity# + 0.01 : DebugLog "Gravity hoch"
If Gravity# > 1 Then Gravity# = 1 If CountCollisions(Player) > 0 Then If CollisionNY(Player, 1) > 0.70 Then Gravity# = 0 End If kommt sie natürlich ständig. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
sorry, ich geben auf...
... vielleicht kann Dir jemand aus dem B3D Forum helfen. Dort werden ja öfter sehr seltsame Verhalten der Collisionen gemeldet. Vielleicht liegt es ja wirklich nicht an Deinem Code. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, ich vermute einfach folgendes, damit sollte ich mich wohl tatsächlich ins B3D-Forum begeben. ![]() ![]() Sobald ich die Gravity auf 0 setze, bestehen keine Kollisionen mehr, welche dann den Code innerhalb der If-Gruppe nicht mehr ausführen, d.h. die Gravity wird wieder angehoben! Es erfolgt sofort eine Kollision mit dem Boden, und im nächsten Frame wird wieder die If-Gruppe ausgeführt ![]() ![]() |
||
- Zuletzt bearbeitet von PacMani am So, Dez 20, 2009 14:28, insgesamt einmal bearbeitet
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hatte ich ja von Anfang an vermutet. Deshalb auch die DEBUGLOGs, die sollten das zeigen, dass das Ganze so zwischen den beiden IFs hin und her pendelt. Scheinbar war es hier vorhin in unserer Kommunikation schief gelaufen. Ich verstand das so, dass Du keinen Wechsel zwischen beiden IFs beochten konntest.
Ich war jetzt schon ganz ratlos deshalb.... Die Lösung wäre, dass Du verhindern musst, Gravitiy um 0.01 zu erhöhen, wenn es vorher zu einer CollisionNY<0.70 gekommen war. Merk Dir doch die Position der Spielfigur und setze sie einfach frech zurück, wenn Collision sie Dir leicht versetzt hat, oder lass die Gravity langsamer ansteigen 0.0001 nach so einen Zwischenfall, dann wäre das versehentliche Rutschen kaum zu bemerken. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm, hättest du da einen Codeansatz? Weiß nämlich nicht weiter. ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich denke, da muss man ganz schön rumprobieren....
Probier doch mal testhalber , ob mit gravity=gravity+ 0.0001 das versehentliche rutschen weniger wird. ich weiss schon, dass damit das Fallen endlos dauert, aber das ist ja nur für den test jetzt.... |
||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich würde in diesem Fall zwei seperate Levelkörper erstellen. Einmal einen mit den waargerechten und leicht geneigten Oberflächen, und einen mit denen die steil sind und wo der Spieler rutschen soll.
Dann lädst du einfach beide für die steilen Flächen: Code: [AUSKLAPPEN] Colisions(?,?,?,2)
für die leicht geneigten und ebenen Flächen: Code: [AUSKLAPPEN] Colisions(?,?,?,3)
Du hast das Level doch sicher mit einem anderen Program erstellt, lösche da einfach für den einen Levelkörper alle steilen Flächen und für den anderen alle flache Flächen, wenn du sie dann beide lädst und an der selben Stelle platzierst, dann sollte es eigendlich klappen. |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe sowieso an das komplett "modulare" Levelsystem gedacht. Aber ich fürchte mich noch vor dem Programmieren eines Leveleditors (ich weiß kaum, wie man mit B3D Dateien schreibt und liest / parst, da brauchte ich noch Hilfe), sodass ich zum Beispiel einen Hügel des öfteren platziere, bzw. einen Baum. Nur haben diese Objekte ja auch mal mehr oder weniger stark schräge Flächen, da wäre es dann doch nur kompliziert, immer zwei auseinandergenommene Objekte zusammenzufügen?
Sonst dachte ich noch, dass man vielleicht die Kollisionsantwort (Response) ändert, sobald man auf einer bestimmten Fläche steht, aber das klappt ja auch nicht, weil ich die Schwerkraft immer wieder zurücksetze :'-( |
||
- Zuletzt bearbeitet von PacMani am So, Dez 20, 2009 14:28, insgesamt einmal bearbeitet
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group