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

1

19.04.2011, 23:56

Bewegungsrichtung

Hallo Spieleprogrammierer.de,

Mein Charakter steht bei 10, 20 und der soll sich zu 50, 50 bewegen also 40 auf X - Achse und 30 auf der Y - Achse mit einer Bewegungsgeschwindigkeit von 5 Pixeln pro Sekunde. Allerdings verzweifle ich bei der mathematischen Umsetzung(Ich vermute, dass man hierfür Winkelfunktionen wie cos, sin, tan braucht die ich allerdings alle nicht behersche das wir das in der Schule noch nicht hatten).
Der einzige Mathematische Ansatz den ich hatte war:
40/5 = 8
und
30:5 = 6
So bekomme ich aber nur heraus wie viele Sekunden er auf jeder Achse laufen müsste um ans Ziel zu kommen.
Könnt ihr mir also bitte bei der Berechnung der Bewegung des Charakters helfen(Und mir vielleicht auch erklären wie es funktioniert).

Ich bin für jede Hilfe dankbar.
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

2

20.04.2011, 00:07

nimm den anfangspunkt A gehe die entlang der x achse die x position und du kommst zu einen zwischenpunkt B geh dann noch die y achse der y position entlang und du kommst zum endpunkt C.

diese drei punkte bilden ein dreieck mit einen rechten winkel (a=x position,b=y position,c= der weg, gamma=90°) da kannst du dann mit den satz des phytagoras dir den weg der zurückgelegt werden muss (c) ausrechnen (c²=a²+b²)

lange rede kurzer sin:

der weg der zurückgelegt werden muss beträgt die Wurzel aus (40²+30²)=Wurzel aus 1600+900= Wurzel aus 2500 = 50 pixel
bei einer geschwindigkeit von 5p/s macht das 50/5=10 sekunden

Zitat

Basically, there are only 10 types of people in the world. Those who know binary, and those who don't.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

20.04.2011, 00:15

Du willst einen Punkt von §(x1, y1)§ nach §(x2, y2)§ bewegen. Das entspricht einer Verschiebung von §x2-x1§ in x- und §y2-y1§ in y-Richtung. Die Länge dieser Verschiebung beträgt §\sqrt{(x2-x1)^2 + (y2-y1)^2}§. D.h. um etwas mit 1 Pixel/s in diese Richtung zu bewegen musst du pro Sekunde um

§dx = \frac{x2-x1}{\sqrt{(x2-x1)^2 + (y2-y1)^2}}§

in x-Richtung und um

§dy = \frac{y2-y1}{\sqrt{(x2-x1)^2 + (y2-y1)^2}}§

in y-Richtung verschieben. Wenn es 5 Pixel/s sein sollen dann eben um §5 \cdot dx§ bzw. §5 \cdot dy§.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

20.04.2011, 00:22

Ich gehe davon aus, dass es nicht das war was er wissen wollte, sondern viel mehr wie er nun bewegen soll. Sinus und Kosinus hilft da weiter das ist richtig. Guck einfach mal hier: http://de.wikipedia.org/wiki/Sinus_und_Kosinus Bei Definition am Rechtwinkligen Dreieck ist es sehr verständlich. Stell dir einfach vor der Punkt an dem dein Spieler ist ist A und der Punkt wo er hin will ist B. Alpha ist der Winkel um den der Spieler gedreht ist. So ist die Ankathete auf der X-Achse, die Gegenkathete auf der Y-Achse und die Hypotenuse ist der direkte weg, den der Spieler gehen soll. Du willst jetzt ja ausrechnen um wie viele Einheiten du auf der X-Achse bzw. y_Achse bewegen sollst. Also guckst du dir die Formeln an und Stellst um.
Sinus(Alpha)= Gegenkathete/Hypotenuse und Kosinus(Alpha)= Ankathete/Hypotenuse. Wie grad gesagt ist die Ankathete auf der X-Achse, also genau der Wert um den du deinen Spieler auf der X-Achse bewegen musst. Also stellst du die Formel um. Das solltest du aus der Schule können. Das gleiche machst du mit der anderen Formel auch. Für die Hypotenuse kannst du dann die Geschwindigkeit vom Spieler einsetzen. Der Winkel sollte vorher bekannt sein. Ich denke das ist das was du suchst, auch wenn es leicht von deiner Beschreibung abweicht;)
Ansonsten guck dir den Satz des Pythagoras mal an. Wenn du nicht weiter kommst kannst du ja hier weiter Fragen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

20.04.2011, 00:23

Sehe grad dot hat den anderen Fall schon erklärt;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

20.04.2011, 10:23

Danke für eure Erklärungen ich werde später versuche das mal zu coden. Wenn ich Hilfe brauche Melde ich mich hier. Jop ich wollte eigentlich wissen wie viel ich auf jeder
Achse gehn muss damit ich bei beiden Achsen zur gleichen Zeit am Endpunkt bin.
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

7

20.04.2011, 11:59

Okay das mit dem bewegen funktioniert jetzt allerdings verschwindet manchmal einfach mein Charakter wenn dx= -1.#IND und dy = -1.#IND ist.
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

20.04.2011, 12:34

Naja, das passiert wohl weil dein Start- und Zielpunkt gleich waren, die Strecke also eine Länge von 0 hat und es zu einer Division durch 0 kommt...

9

20.04.2011, 12:57

Der Fehler kommt aber selbst wenn ich prüfe ob die Koordinaten übereinstimmen.

Hier mal die Funktion:

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
37
38
39
40
41
42
void Knight::onClick(sf::Mouse::Button ButtonID, sf::Vector2i Position)
{
    if (ButtonID == sf::Mouse::Left)
    {
        if (Position.x > this->getPosition().x &&
            Position.x < this->getPosition().x + this->getWidth() &&
            Position.y > this->getPosition().y &&
            Position.y < this->getPosition().y + this->getHeight())
        {
            this->m_bIsSelected = true;
        }
        else
        {
            this->m_bIsSelected = false;
        }
    }
    else if (ButtonID == sf::Mouse::Right)
    {
        if (this->m_bIsSelected)
        {
            this->m_MovingTarget = Position;
            if (this->getPosition().x != Position.x)
            {
                this->m_MovingDirection.x = (Position.x - this->getPosition().x) / (sqrt(((Position.x - this->getPosition().x) * (Position.x - this->getPosition().x)) + ((Position.x - this->getPosition().y) * (Position.y - this->getPosition().y))));
            }
            else 
            {
                this->m_MovingDirection.x = 0;
            }
            if (this->getPosition().y != Position.y)
            {
                this->m_MovingDirection.y = (Position.y - this->getPosition().y) / (sqrt(((Position.x - this->getPosition().x) * (Position.x - this->getPosition().x)) + ((Position.x - this->getPosition().y) * (Position.y - this->getPosition().y))));
            }
            else
            {
                this->m_MovingDirection.y = 0;
            }
            this->m_bIsMoving = true;
            std::cout << this->m_MovingDirection.x << "|" <<  this->m_MovingDirection.y << std::endl;
        }
    }
}
MfG Ninjasturm

----------------------------
System: Windows 7 x64
IDE: Visual Studio 2010 Ultimate
Engine: Ogre3D


Favorisierte Programmiersprache: C++
Sonstige Programmiersprachen: AutoIT, PHP, Javascript
Sonstige Auszeichnungsprachen: HTML, CSS
---------------------------

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

20.04.2011, 13:01

Das kann eigentlich nur bedeuten dass schon vor der Berechnung irgendeine Variable -1.#IND war. Einfach mal debuggen und anschauen was für Werte die Variablen alle haben in den Fällen wo das passiert...

Werbeanzeige