Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

12.07.2011, 15:54

Danke nochmal für die ausführliche Erklärung ^^ Werde mich nochmal drann setzen und Versuchen das so umzusetzen . Erfolge / Misserfolge werd ich dann wieder posten^^

Gruß
AK

22

12.07.2011, 20:32


Du musst:
1. verticalVelocity in JEDEM Frame um, sagen wir mal 50*Frametime erhöhen. Den Wert kannst du später, je nach gewünschter Fallgeschwindigkeit anpassen. Das sorgt dafür, dass der Spieler im Freien fall immer schneller fällt. Bzw. beim Sprung langsamer steigt und wieder runter fällt.
2. Beim Tastendruck Prüfen ob der Spieler auf dem Boden steht und wenn ja verticalVelocity auf einen Negativen Wert SETZEN!
3. Bei Kontakt mit dem Boden verticalVelocity auf 0 setzen und den Spieler auf die höhe des Bodens stellen. Weil er sich ständig nach unten bewegt und er nicht durch den Boden fliegen soll ;)
4. verticalVelocity in jedem Frame verwenden. d.h. Position *= verticalVelocity*Frametime. Wenn der Spieler gerade nicht Springt oder Fällt ist der Wert sowieso auf 0 und bewirkt nichts ;)


1. Hab jetzt die zeile > verticalVelocity += 50.0f * g_pTimer->GetElapsed(); in meine Update-Methode geschrieben...Somit wird sie ja dann in jedem Frame aufgerufen bzw. um diesen bestimmten Wert erhöht

2. Die 2. und 3. verwirren mich ein wenig ?( Ich soll bei 2 prüfen, ob der CHar am Boden ist. Also verticalVelocity = -200 zB wenn m_yPos == 415....Und bei 3 soll ich bei der sleben Bedingung verticalVelocity auf 0 setzen...^^

4. Kann ja dann wieder in die Update-Methode?


Gruß
AK

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

23

12.07.2011, 21:00

2. Die 2. und 3. verwirren mich ein wenig ?( Ich soll bei 2 prüfen, ob der CHar am Boden ist. Also verticalVelocity = -200 zB wenn m_yPos == 415....Und bei 3 soll ich bei der sleben Bedingung verticalVelocity auf 0 setzen...^^

Du hast bei 2. noch eine weitere Bedingung ;)

Die ProcessMoving Methode stört doch nicht oder?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

24

12.07.2011, 21:14

Ah okay nach ein bisschen hin und her hats geklappt. Hab allerdings jetzt noch ein Problem.
Sobald der Spieler den Boden berührt, soll ja verticalVelocity auf 0 gesetzt werden. Sobald ich das mache springt er nicht mehr.
Wenn ich die Zeile auskommentiere funktionierts schon fast super mit dem Sprung... Komm jetzt nicht ganz dahinter wo mein Fehler liegt.
Zudem wackelt mein Figur nun wenn ich auf dem Boden stehe...Bekommt man das irgendwie weg?^^

Hier nochmal die Codezeilen die ich ergänzt habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void Spieler::Update()
{
    // Update- Bewegung des Spielers
    ProcessMoving();
    // Position und Animation überprüfen
    CheckPosition();

    // Wird jetzt in jedem Frame bearbeitet...
    verticalVelocity += 50 * g_pTimer->GetElapsed();
    m_yPos += verticalVelocity * g_pTimer->GetElapsed();

}

    // Springen (in der ProcessMove()-Methde
    else if (g_pFramework->KeyDown(SDLK_SPACE))
    {
        if (m_yPos >= 415.0f)
        {
            verticalVelocity = -200;
        }
    }

// In der checkPosition()-Methode
    // Verhindert das Figur nach unten hin "durchfällt"

    if (m_yPos >= 415.0f)
    {
        m_yPos = 415.0f;

    }

    // Kontakt mit Boden?
    if (m_yPos == 415.0f)
    {
        // verticalVelocity = 0.0f;   <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^
    }

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

25

12.07.2011, 21:25

C-/C++-Quelltext

1
2
3
4
if (m_yPos >= 415.0f)
 {
    m_yPos = 415.0f;
 }


Müsste das nicht

C-/C++-Quelltext

1
2
3
4
if (m_yPos <= 415.0f)
 {
    m_yPos = 415.0f;
 }

sein? Ansonten wird die Figur ja immer auf den Boden zurück gesetzt, wenn sie in der Luft ist und der Code diese Stelle erreicht. Fällt sie unter den Boden, muss sie wieder auf 415 zurück gesetzt werden.
Ansonsten:

C-/C++-Quelltext

1
2
3
4
5
// Kontakt mit Boden?
    if (m_yPos == 415.0f)
    {
        // verticalVelocity = 0.0f;   <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^
    }


Wenn Du die Leertaste drückst und die verticalVelocity geändert wird, musst Du aufpassen das der Spieler erst bewegt wird, bevor diese Codestelle erreicht wird. Ansonsten wird die verticalVelocity auf 0 zurück gesetzt, bevor der Sprung angefangen hat und es passiert nichts.

26

12.07.2011, 21:34

C-/C++-Quelltext

1
2
3
4
if (m_yPos >= 415.0f)
 {
    m_yPos = 415.0f;
 }


Müsste das nicht

C-/C++-Quelltext

1
2
3
4
if (m_yPos <= 415.0f)
 {
    m_yPos = 415.0f;
 }

sein? Ansonten wird die Figur ja immer auf den Boden zurück gesetzt, wenn sie in der Luft ist und der Code diese Stelle erreicht. Fällt sie unter den Boden, muss sie wieder auf 415 zurück gesetzt werden.
Ansonsten:

C-/C++-Quelltext

1
2
3
4
5
// Kontakt mit Boden?
    if (m_yPos == 415.0f)
    {
        // verticalVelocity = 0.0f;   <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^
    }


Wenn Du die Leertaste drückst und die verticalVelocity geändert wird, musst Du aufpassen das der Spieler erst bewegt wird, bevor diese Codestelle erreicht wird. Ansonsten wird die verticalVelocity auf 0 zurück gesetzt, bevor der Sprung angefangen hat und es passiert nichts.



Also glaub jetzt gehts. Habe die 2 Zeilen aus der Update()-Methode in die ProcessMoving gesetzt und das flackern ist auch weg. Jetzt kann ich auch

C-/C++-Quelltext

1
2
3
m_yPos <= 415.0f;
EDIT: Wenn ich das so mache kann ich aus der Luft herraus erneut springen und schwebe nach oben hin weg.
geht also doch nciht^^


und

C-/C++-Quelltext

1
verticalVelocity = 0.0f;


setzen. Also scheint jetzt alles richtig zu funktionieren. Nur eine Frage habe ich noch, weil glaube nicht das du dich vllt vertan hattest. Nicht da sich da nochn riesen Bug drinn habe xD

Du hast ja geschrieben:

Zitat


4. verticalVelocity in jedem Frame verwenden. d.h. Position *= verticalVelocity*Frametime. Wenn der Spieler gerade nicht Springt oder Fällt ist der Wert sowieso auf 0 und bewirkt nichts ;)


Wenn ich

C-/C++-Quelltext

1
m_yPos [b]*[/b]= verticalVelocity*Frametime;


berechne...hängt mein Charakter dauerhaft auf Position y=0 rumm^^ Kann es sein das du vllt Position += ... meintest? Weil dann funktioniert es

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

27

12.07.2011, 21:59

Ja das war ein klassischer Tippfehler.^^
Habs oben editiert.

C-/C++-Quelltext

1
m_yPos == 415.0f

das ist eine ziemlich schlechte Idee. Denk dran, dass du mit Kommazahlen arbeitest und es ziemlich unwahrscheinlich ist, dass dein Spieler sich genau an dieser Position befindet.

C-/C++-Quelltext

1
m_yPos <= 415.0f

Das ist besser.

Es funktioniert bei dir nur zufällig weil du die Position vorher Manuell genau auf diesen Wert setzt.
Hier kannst du beide Anweisungen in einen if-block schreiben.
also:

C-/C++-Quelltext

1
2
3
4
5
if (m_yPos <= 415.0f)
{
   m_yPos = 415.0f;
   verticalVelocity = 0.0f;
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

28

12.07.2011, 22:03

Das war zwar nicht von mir, macht aber Sinn.
Wenn Du die Position 415 mit 0 (verticalVelocity ist 0 * Frametime) multiplizierst kommt 0 bei raus. ;) Und wenn es mit+= funktioniert, und die Logik passt (sieht gut aus), sollte es stimmen.

29

12.07.2011, 22:23

Jup habs jetzt auch mit >= gemacht^^ Funktioniert jetzt auch super ... Geschwindigkeit und so müsste man halt noch anpassen^^ Aber wahrscheinlich muss ich das eh alles nochmal überdenken sobald ich auch mal irgendwo drauf springen will xD Und alles ein bisschen variabler halten.
Danke aufjedenfall für eure Hilfe. Hat mir super geholfen :thumbup:

Wo wir aber noch dabei sind...und ich dann nicht extra wieder einen Kompletten Thread eröffnen muss (Hat ja auch eigendlich mit dem Sprung noch zu tun) ..Wenn ich nach Rechts/Links laufe und nun die Leertaste drücke, stoppt meine Figur, springt und man muss erneut zum lenken die Pfeiltasten drücken...Habs jetzt so gemacht:

else if (g_pFramework->KeyDown(SDLK_RIGHT) && g_pFramework->KeyDown(SDLK_SPACE))
{
// Springen und laufen zusammen ausführen
}

bringt aber leider keine verbesserung^^

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

30

12.07.2011, 22:35

Wenn Du einzelne Tasten abfragst, dann brauchst Du dafür doch kein else if.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
if(g_pFramework->KeyDown(SDLK_RIGHT))
{
    //nach rechts bewegen
}
if(g_pFramework->KeyDown(SDLK_SPACE))
 {
    //Sprung auslösen, wenn am Boden
 }

Das kannst Du doch unabhängig davon machen, ob Du in der Luft oder am Boden bist.
Die Leertaste sollte den Sprung ja nur auslösen.

Werbeanzeige