Du bist nicht angemeldet.

Werbeanzeige

1

31.08.2013, 22:06

Rechnung für Movementspeed 2D

Hey, ganz Simpel ahbe eine Objekt das soll sich nach Tastendruck 40 Pixel/s in eine Richtung bewegen, aber wenn ich Diagonal laufe, dann würde es sich ja z.B. 40 Pixel/s nach links und 40 Pixel/s nach oben bewegen also insgesamt 80 Pixel/s bewegen deutlich zu schnell, halbieren geht ja auch nciht denn wenn wir diagonal alufen ist eine Pixels nach links und ein Pixel anch oben ja nciht 2 Pixel lang sondern 1.x Pixel. Das auch nciht wichtig denn ich ahb das Problem schon gelöst wüsste nur geren ob das vielleicht auch simpler geht als ich es gemacht habe

C-/C++-Quelltext

1
2
3
4
5
6
7
//Wenn die Figur Diagonal läuft wird der Satz des Pytagoras auf die zurück zu legende Strecke angewendet und das Ergebnis auf movement.x und .y aufgeteilt 
    //und mit der vorzeichen verrechnet
    if (movement.x != 0.f && movement.y != 0.f)
    {
        movement.x = movement.x / mfPlayerSpeed * 0.5f * sqrt((mfPlayerSpeed * mfPlayerSpeed)*2.f);
        movement.y = movement.y / mfPlayerSpeed * 0.5f * sqrt((mfPlayerSpeed * mfPlayerSpeed)*2.f);
    }


Edit: wer es noch nicht eraten hat. movement ist ein 2dvector und mfPlayerSpeed ein flaot Wert.

FSA

Community-Fossil

  • Private Nachricht senden

2

31.08.2013, 22:34

Vielleicht hilft dir das Stichwort: Satz des Pythagoras. ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

31.08.2013, 22:37

Hab ich doch benutzt, hast du wohl nicht genau geschaut ;). mich würde nur interessiern ob man das ganze noch verkürzen kann bzw. ob es eine Funktion für die quadrat zahl gibt (gegenteil von sqrt)

Sylence

Community-Fossil

Beiträge: 1 670

Beruf: Softwareentwickler

  • Private Nachricht senden

4

31.08.2013, 22:39

pow
Software documentation is like sex. If it's good you want more, if it's bad it's better than nothing.

FSA

Community-Fossil

  • Private Nachricht senden

5

31.08.2013, 22:42

Sorry habe nicht genau gelesen. Wie wäre es mit so etwas?

C-/C++-Quelltext

1
2
3
4
5
6
7
float mag2 = mfPlayerSpeed * mfPlayerSpeed + mfPlayerSideSpeed * mfPlayerSideSpeed;
if (mag2 > PLAYER_SPEED * PLAYER_SPEED)
{
        mag2 = PLAYER_SPEED * sqrtf (1.0f / mag2);
        mfPlayerSpeed *= mag2;
        mfPlayerSideSpeed *= mag2;
}

PLAYER_SPEED ist die maximale Geschwindigkeit und mfPlayerSpeed die aktuelle auf der Y achse. mfPlayerSideSpeed ist die Geschwindigkeit, die der Spieler bei Seitwärtsbewegungen hat (x Achse).

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

TGGC

1x Rätselkönig

Beiträge: 1 813

Beruf: Software Entwickler

  • Private Nachricht senden

6

31.08.2013, 22:52

Allgemeine Form:

Quellcode

1
2
speedx = cos(a) * maxspeed
speedy= -sin(a) * maxspeed

Und dann einfach z.b. bei schraeg laufen den Winkel a = 45° nehmen.

Satz des Pythagoras ist hier nicht so sinnvoll.

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

01.09.2013, 07:57

pow

pow für's Quadrieren zu benutzen ist kein guter Vorschlag.

8

01.09.2013, 12:58

Allgemeine Form:

Quellcode

1
2
speedx = cos(a) * maxspeed
speedy= -sin(a) * maxspeed

Und dann einfach z.b. bei schraeg laufen den Winkel a = 45° nehmen.

Satz des Pythagoras ist hier nicht so sinnvoll.

Ahh das ist es, ich wusste doch das muss einfacher gehen. Aber ich und meine alten Feinde sin, cos, tan :D


Edit: noch mal ganz kurz muss man nicht für y einfach sin(x) verwenden, zumindest klappt das bei mir so ^^

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »D4rwin« (01.09.2013, 13:14)


TGGC

1x Rätselkönig

Beiträge: 1 813

Beruf: Software Entwickler

  • Private Nachricht senden

9

01.09.2013, 17:10

Das kommt drauf an, was du unter "klappen" verstehst. Winkel sind in der Mathematik immer gegen den Uhrzeigersinn definiert. Laesst du das negieren weg, ist es ploetzlich im Uhrzeigersinn. Kann also gut passieren, das du irgendwelche Folgefehler bekommst und sich Dinge ploetzlich falsch rum drehen.

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

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

  • Private Nachricht senden

10

01.09.2013, 17:27

Du könntest das ganze (dein x und y, die ja beide entweder den Wert 1 oder -1 haben werden) auch mit §\sqrt[2]{0.5}§ also 0,7071 multiplizieren. Genau das gibt cos(a) und -sin(a) bei a = 45; 135; 225 und 315 zurück(entweder negativ oder positiv). Was du dort machst ist deinen MoveVektor zu normalisieren. Der hat ja eine Länge von §\sqrt[2]{1*1+1*1}§ also §\sqrt[2]{2}§ bzw. 1,4142135623730950488016887242097. Und dessen Kehrwert ist 0,7071 also §\sqrt[2]{0.5}§ oder §\sqrt[2]{1/2}§ :D Wie einfach die Mathematik doch sein kann, wenn man weiß wie man sie richtig nutzt :vain:

Wenn du Probleme hast das zu verstehen kannst du bescheid sagen :whistling:

40 Pixel/s nach links und 40 Pixel/s nach oben bewegen also insgesamt 80 Pixel/s bewegen

Demnach ist deine wahre Geschwindigkeit übrigens nicht 80 Pixel/s sondern ca. §40*\sqrt[2]{2}=56,5685§ Pixel/s.
"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?

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »NachoMan« (01.09.2013, 19:14)


Werbeanzeige