Gambit_Grey Neuling
Anmeldedatum: 28.04.2012 Beiträge: 9
|
Verfasst am: 28.04.2012, 16:08 Titel: Merkwürdiger Sprungbug |
|
Hallo zusammen,
bin auf ein merkwürdiges Problem bei meinem Jumpcode gestoßen, ich habe schon einiges probiert aber einfach keine lösung gefunden.
Der Code sieht so aus: (im internet gefunden, eigentlich perfekt für mein Spiel)
// jiffy heißt der player
| Code: |
if (jumping)
{
jumpspeed += 1;
jiffypos.Y += jumpspeed;
if (jiffypos.Y >= startY)
{
startY = jiffypos.Y;
if (falling == false)
{
jumping = false;
}
}
}
else
{
if (kstate.IsKeyDown(Keys.W) && kstate.IsKeyDown(Keys.Space))
{
jumpspeed = -14;//Give it upward thrust
jumping = true;
}
}
|
Das Problem ist jetzt, die spielfigur haut sich in den boden hinein, manchmal nicht sehr tief, aber manchmal fällt er sogar komplett durch, dabei dürfte das nicht sein.
Wäre echt froh wenn mir einer damit helfen könnte, hänge schon seit einem ganzen Tag an diesem Problem. |
|
| Nach oben |
|

|
JeReT Member
Anmeldedatum: 19.07.2007 Beiträge: 3248 Wohnort: µnchen
|
Verfasst am: 28.04.2012, 17:09 Titel: |
|
Das Problem lässt sich lösen, indem du herausfindest, wie tief dein opbjekt im anderen steckt ("penetration distance") und dann die spielfigur um diesen wert weiter nach oben setzt. _________________
Shapes |
|
| Nach oben |
|

|
Gambit_Grey Neuling
Anmeldedatum: 28.04.2012 Beiträge: 9
|
Verfasst am: 28.04.2012, 17:32 Titel: |
|
| das hatte ich schon versucht, es sieht aber merkwürdig aus wenn die figur nach dem sprung im boden steckt und dann wieder hochgesetzt wird. ich hab auch schon jede menge abfragen getestet, es dürfte einfach nicht passieren oder ich kann einfach nicht logisch denken. mh |
|
| Nach oben |
|

|
JeReT Member
Anmeldedatum: 19.07.2007 Beiträge: 3248 Wohnort: µnchen
|
Verfasst am: 28.04.2012, 18:06 Titel: |
|
man darf das ja auch nicht sehen, dass die figur überhaupt im boden steckt.
Du musst entweder sofort nach dem bewegungs-code (da schließe ich sämtliche arten von beweung ein. auch "freier fall") auf kollision prüfen und dann ggf. die figur sofort aus dem boden wieder raus schieben, oder du blickst in die zukunft, stellst so fest, ob eine kollision stattfinden wird und verringerst die geschwindigkeit deiner Figur damit sie gar nicht erst in das objekt hineingerät.
vom prinzip sehr ähnlich, allerdings ist erster ansatz wohl ein wenig einfacher umzusetzen. _________________
Shapes |
|
| Nach oben |
|

|
Gambit_Grey Neuling
Anmeldedatum: 28.04.2012 Beiträge: 9
|
Verfasst am: 28.04.2012, 18:58 Titel: |
|
vielen dank, werde ich später versuchen. wundert mich trotzdem noch warum die figur in den boden gerät.
guten abend. |
|
| Nach oben |
|

|
sorry Member
Anmeldedatum: 26.04.2011 Beiträge: 257
|
Verfasst am: 28.04.2012, 19:02 Titel: |
|
| Das ist ganz logisch. jumpspeed wird ja immer auf die Y-Position des Spielers addiert. Jetzt stell dir vor der Spieler befindet sich 1Pixel über dem Boden. Der Sprung wird korrekterweise noch nicht beendet. Da der Player schon recht weit gefallen ist, ist aber die Sprunggeschwindigkeit recht hoch, z.B. 20. Jetzt addierst Du auf die Y-Position 20 Pixel drauf, dadurch ist der Spieler dann 19Pixel im Boden "versunken". Jetzt hört der Sprung auch auf, aber der Player ist eben immer noch im Boden. |
|
| Nach oben |
|

|
Gambit_Grey Neuling
Anmeldedatum: 28.04.2012 Beiträge: 9
|
Verfasst am: 28.04.2012, 19:52 Titel: |
|
| danke, habs endlich hinbekommen, ne ganz einfach abfrage. er soll nur weiter zur spielerposition addieren wenn jumpspeed kleiner als ein bestimmter wert ist. |
|
| Nach oben |
|

|
sorry Member
Anmeldedatum: 26.04.2011 Beiträge: 257
|
Verfasst am: 28.04.2012, 21:13 Titel: |
|
| Versinken kann der Player dann aber immer noch. Wenn er nicht versinken soll, müsste man bei deiner Methode Jumpspeed auf 1 begrenzen und das macht ja überhaupt keinen Sinn. Versuch doch mal JeReT's Vorschlag umzusetzen. Dazu musst Du einfach nach dem if(jiffpos.Y >= startY) statt startY = jiffpos.Y jiffpos.Y = startY schreiben. Was das so wie Du das gemacht hast soll verstehe ich sowieso nicht so ganz. |
|
| Nach oben |
|

|
Gambit_Grey Neuling
Anmeldedatum: 28.04.2012 Beiträge: 9
|
Verfasst am: 29.04.2012, 10:09 Titel: |
|
Ich bin ja eigentlich der Designer im Team, jetzt starten wir eigene kleine Projekte zur Übung, damit wir uns gegenseitig unter die Arme greifen können.
Funktioniert jedenfalls jetzt soweit, is aber trotzallem eigentlich ne blöde Idee von mir, wegen der Gravitation. Ich bau das jetzt mal so um das die Gravitation den Fall flüssig ablaufen lässt. |
|
| Nach oben |
|

|
JacksAll Member
Anmeldedatum: 31.10.2011 Beiträge: 18
|
Verfasst am: 14.05.2012, 21:06 Titel: |
|
Naja ich kann dich beruhigen, du solltest die If-Abfrage nicht auf == false enden lassen sondern den Sprung ausschalten wenn er fällt, das klappt  |
|
| Nach oben |
|

|
KatoGrinsihara Member
Anmeldedatum: 27.10.2007 Beiträge: 897
|
Verfasst am: 15.05.2012, 07:08 Titel: |
|
Wobei
| Code: |
if (falling == false)
|
auch so nee Sache ist.
Besser wäre
_________________ Alles Komplizierte ist unnötig.
Alles Notwendige ist einfach - genau wie mein automatisches Gewehr.
(Michail Timofejewitsch Kalaschnikow, russischer Ingenieur) |
|
| Nach oben |
|

|
JacksAll Member
Anmeldedatum: 31.10.2011 Beiträge: 18
|
Verfasst am: 15.05.2012, 18:06 Titel: |
|
| allerdings ist das reine geschmackssache, würde ich doch mal behaupten, ob ich jetzt den boolean invertiere oder ihn mit false vergleiche, dürfte wohl kaum unterschiede hergeben. allerdings nutze ich auch die verneinungsmehtode mit ! |
|
| Nach oben |
|

|
|