Problem mit Kollision und Schwerkraft

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

PacMani

Betreff: Problem mit Kollision und Schwerkraft

BeitragSa, Dez 19, 2009 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes aber vielleicht unetrschätze ich euch auch.

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 Very Happy
  • Zuletzt bearbeitet von PacMani am Sa, Dez 19, 2009 23:50, insgesamt 3-mal bearbeitet

Midimaster

BeitragSa, Dez 19, 2009 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann sein, stehe völlig auf dem Schlauch Sad

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

BeitragSa, Dez 19, 2009 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wink

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

BeitragSa, Dez 19, 2009 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann kann es nur daran liegen, dass Gravity nicht GLOBAL ist?

Füg mal noch folgendes ein:

DEBUGLOG "Gravity=" + gravity
 

PacMani

BeitragSa, Dez 19, 2009 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt kapier ich auch grad erst, wie es eigentlich sein soll: Du willst, dass die Gravity in solchen Momenten bei 0 bleibt, oder?
 

PacMani

BeitragSa, Dez 19, 2009 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Wink
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 Very Happy aber das Problem gibt's immer noch Sad
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

BeitragSa, Dez 19, 2009 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Kein Problem Very Happy du meinst vermutlich - 0.01 sonst hupt er.
Aber leider bringt das nichts, hatte ich schon ausprobiert Sad er zittert dann zwischen 0.02 und -0.01 rum :S
  • Zuletzt bearbeitet von PacMani am So, Dez 20, 2009 14:28, insgesamt einmal bearbeitet

Midimaster

BeitragSa, Dez 19, 2009 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Und während dieses leichten Rutschens kommt nie die Meldung "Gravity erhöhen im Anfang"?
 

PacMani

BeitragSa, Dez 19, 2009 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich vermute einfach folgendes, damit sollte ich mich wohl tatsächlich ins B3D-Forum begeben. Very Happy habs jetzt raus. Bis hierhin schonmal ein kräftiges Dankeschön Smile

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 Smile das ist der Fehler, nur wie behebe ich den? Sad
  • Zuletzt bearbeitet von PacMani am So, Dez 20, 2009 14:28, insgesamt einmal bearbeitet

Midimaster

BeitragSa, Dez 19, 2009 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 19, 2009 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, hättest du da einen Codeansatz? Weiß nämlich nicht weiter. Wink

Midimaster

BeitragSo, Dez 20, 2009 0:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 20, 2009 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group