Objekt auf einer Linie bewegen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Objekt auf einer Linie bewegen?

BeitragFr, Feb 17, 2012 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Diese Woche habe ich nur Probleme mit BlitzMax Embarassed
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

Xeres

Moderator

BeitragFr, Feb 17, 2012 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

CO2

ehemals "SirMO"

BeitragSa, Feb 18, 2012 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 18, 2012 1:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

Edit: Die Koordinaten auf der Flugbahn ist einfach gegeben durch den Ortsvektor + Vielfache des Richtungsvektors, also s = v0 + t*v
 

CO2

ehemals "SirMO"

BeitragSa, Feb 18, 2012 1:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 18, 2012 2:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Feb 18, 2012 2:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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
BallY=100
Xadd=4
Yadd=1
Repeat
.....
BallX = BallX + Xadd
BallY = BallY + Yadd

If BallX<0 Or BallX>800
Xadd=-Xadd
EndIf

If BallY<0 Or BallY>600
Yadd=-Yadd
EndIf

DrawImage Ball, BallX , BallY
Until....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group