Objekt auf einer Linie bewegen?
Übersicht

CO2ehemals "SirMO"Betreff: Objekt auf einer Linie bewegen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Diese Woche habe ich nur Probleme mit BlitzMax ![]() Also, ich möchte mich mal ein wenig mit den Winkelfunktionen etc. auseinandersetzen und da dachte ich, was eignet sich dafür besser als ein Pong-Klon... Bis jetzt sieht auch alles gut aus, nur das wichtigste Fehlt: der Ball. Dieser bewegt sich keinen Millimeter, weil ich absolut nicht weiß wie ich das machen soll. 1.) Woher weiß ich in welche Richtung sich der Ball bewegen muss? 2.) Wenn der Ball auf ein anderes Objekt triff, dann soll der Austrittswinkel berechnet werden, und dann der Ball in diesem winkel bis zu einem anderen objekt bewegt werden. Wie funktioniert das? |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zwei Mögliche Ansätze:
1. Sin & Cos 2. Vektoren Siehe BPS #3 & #4. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Es geht mir mehr darum, die Punkte auf der Linie zu "errechnen", also mit welcher Rechnung mache ich das? Die Linie habe ich schon, jetzt fehlt es halt nur noch an der berechnung der Koordinaten auf dieser Linie... | ||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei Pong hast du für die Ballsimulation eigentlich nur die Bedingungen (sofern du keinen Drall hast):
Einfallswinkel=Ausfallwinkel D.h. einfach nur ein Vorzeichenwechsel bei Kollision. ![]() Edit: Die Koordinaten auf der Flugbahn ist einfach gegeben durch den Ortsvektor + Vielfache des Richtungsvektors, also s = v0 + t*v |
||
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wie bewege ich den ball an sich? Weil wenn ich einfach nur die Position immer um 1 oder so hochzähle bekomme ich ja nicht den einfallswinkel heraus. Im übrigen kann ich so auch nicht bestimmen, mit welchem winkel der ball wieder rauskommen soll. | ||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nun überleg dir mal, aus was sich eine lineare Bewegung zusammensetzt:
Du hast die Position vom Ball, einen Ortsvektor v0 mit z.B. der Koordinate 10,10 Und du hast einen Richtungsvektor r der in die Richtung (5,2) geht. Wenn du diese beiden jetzt addierst, dann hast du die Koordinaten 15,12. Dann kannst du im nächsten Frame wieder den Richtungsvektor addieren, dann bist du bei 20,14. Und schon hast du eine lineare Bewegung. Bei der Kollision spielt der Winkel an sich keine Rolle, da er ja gleich bleibt. Nur der Richtungsvektor wird gespiegelt. D.h. wenn der Ball jetzt nach rechts unten fliegt und mit dem unteren Spielfeldrand kollidiert, dann bleibt ja die Richtung nach rechts erhalten, nur die vertikale Richtung wechselt das Vorzeichen. Dann wird aus dem Richtungsvektor 5,2 -> 5, -2 Dann ist im nächsten Frame der Ball immer noch um 5 Pixel nach rechts verschoben, nur durch das Minus nun nach oben statt nach unten. So wie es physikalisch auch sein muss. Verstanden? So kannst du das auf alle 4 Wände übertragen. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tipp 1:
arbeite mit FLOAT-Variablen also X# und Y#, erst damit wird die Bewegung in alle 360° möglich. Tipp 2: Es gibt zwei verschiedene Betrachtungsweisen: Einmal mit Winkeln, so denkst Du gerade über das Problem nach! Zum anderen aber auch mit "Vektoren", das hört sich schlimm an, ist aber viel einfacher am Computer als Winkel: Da es auf dem Bildschirm nur zwei Dimensionen gibt (X und Y) kann man eine Bewegung eines Balls auch erzielen, indem man zu den aktuellen Koordinaten jeweils was bei X und Y dazuaddiert. Das ist schon alles. Beispiel. Der Ball ist bei 100/200. Nun addierst du vor jedem Zeichnen dies dazu: X=X+4 und ... Y=Y+1 Schon bewegt sich der Ball nach rechts unten: 104/201 dann 108/202 dann .... Dieses +4 und +1 nennt man einen Vektor. Der Witz ist nun, dass beim Auftreffen an Mauern oder Rändern nicht kompliziert errechnet werden muss, wie wohl der Abprallwinkel wäre. Sondern es muss einfach einer der Vektorenwerte negativ gemacht werden. Bei den linken und rechten Rändern kehrst Du die 4 um. Oben und unten wäre es die 1. Allgemein (Pseudocode): BlitzBasic: [AUSKLAPPEN] BallX=100 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group