Veranschaulichung Winkelfunktionen beim coden
Übersicht

mpreuBetreff: Veranschaulichung Winkelfunktionen beim coden |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bestimmt gibts hier massig threads dazu, aber ich frag trotzdem mal.
Also ich weiß natürlich was sin/cos etc. ist, aber ich würde gern wissen wie man praktisch diese winkelfunktionen für spiele nutzen kann. Also ich weiß dass man damit bewegungen berechnen kann, aber ich würde gern wissen wie man sich das bildlich vorstellen muss. Sorry, aber ich bin schon ewig aus der Schule und mehr als sture winkelberechnungen gabs damals bei uns einfach nicht. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beispiel einer typischen Nutzung:
Eine Spielfigur bewegt sich von der Position X/Y in Richtung 30° über den Bildschirm. Bei jedem Step legt sie 5 Einheiten zurück. Um die neue Position der Figur zu errechnen benötigst Du aber ihre X und Y Veränderungen. Die Errechnet man mit SIN() und COS(): BlitzBasic: [AUSKLAPPEN] X = X + Sin(30) *5 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sagt dir das Umwandeln von Karthesischen Koordinaten in Polarkoordinaten und umgekehrt was?
Das ist im Grunde fast alles, was du mit den Winkelfunktionen machst. In Spielen hast du Positionen sowie Bewegungsgeschwindigkeiten entweder als Karthesische Koordinaten (X- und Y-Koordinaten) oder als Polarkoordinaten (Winkel plus Entfernung / Geschwindigkeit). Beide haben vor- und Nachteile. Die Karthesischen Koordinaten braucht man zum Zeichnen auf jeden Fall, weil alle Zeichenfunktionen von Blitz Karthesische Koordinaten verlangen (z.B. DrawImage $image, x, y). Außerdem ist es extrem einfach, Objekte mit Karthesischen Koordinaten zu verschieben: (x = x + 2, y = y + 3) Allerdings kommt es sehr häufig vor, dass man Winkel und Geschwindigkeit hat (Beispiel: 2D-Topdown-Rennspiel oder Spaceshooter). Das rennt dann unter Polarkoordinaten. Polarkoordinaten haben dabei dann auch einen riesigen Vorteil: willst du die Richtung oder Geschwindigkeit ändern (Lenken, Beschleunigen, Abbremsen), dann musst du nur zu den Werten addieren oder davon subtrahieren. Einfacher ginge es nicht. Wenn du sie aber gemeinsam verwenden willst, dann musst du von dem einen in das andere umrechnen. Das Umrechnen von Polar auf Karthesisch hat Midimaster schon gezeigt. In die andere Richtung umrechnen braucht man z.B. wenn man den Winkel von der Spielerfigur zur Maus haben will, oder den Winkel zwischen einem NPC und dem Spieler (damit der NPC weiß, in welche Richtung er fliegen muss, um den Spieler zu erwischen). Das geht auch nicht so arg schwer, man muss nur ein wenig aufpassen dabei: Die Distanz ist das einfachere auszurechnen, dafür braucht man nur den Pythagoras: BlitzBasic: [AUSKLAPPEN] distanz = Sqr(x^2+y^2) oder etwas performanter: BlitzBasic: [AUSKLAPPEN] distanz = Sqr(x*x+y*y) Die Grundformel für den Winkel basiert aus folgender Sache: Code: [AUSKLAPPEN] tan(winkel) = y / x
Das heißt, wenn man den Winkel will, dann schaut das so aus: BlitzBasic: [AUSKLAPPEN] winkel = ATan(y/x) Nur: Der Tangens funktioniert nur für Winkel im 1. und 4. Sektor so einfach (1. Sektor = von gerade Rechts bis Mitte oben, 4. Sektor = von Mitte unten bis gerade Rechts, also die rechte Hälfte). Für die linke Hälfte muss man 180 Grad zu dem Ergebniswinkel addieren und ggF. wieder auf den Bereich zwischen 0 und 360 normalisieren (370° = 10°, eh schon wissen). Das heißt, um den Winkel korrekt zu bekommen braucht man das hier: BlitzBasic: [AUSKLAPPEN] winkel = ATan(y/x) Es gibt aber auch eine Funktion, die das Ganze automatisch macht, nämlich diese hier: BlitzBasic: [AUSKLAPPEN] winkel = ATan2(y,x)(Pass auf, y kommt zuerst, dann erst x). ATan2 ist keine Standard-Winkelfunktion, Taschenrechner können sie also normalerweise nicht, viele Programmiersprachen und Frameworks unterstützen sie aber schon. Hoffe das hilft. Edit: Pass dazu noch auf, dass alle Variablen, die du im Zusammenhang mit WInkelfunktionen verwendest, als Float definiert sein sollten, da du sonst nix sinnvolles, sondern nur auf Ganzzahlen gerundete Werte raus bekommst. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
vielen lieben dank für die antworten..
ich werde mir das heut später mal in ruhe zu gemüte führen. |
||
mDave |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Grüße,
sin und cos können auch für kleinere ästethische Effekte hinzugezogen werden. Der Kurvenverlauf von sin ist dir sicherlich bekannt (falls nicht: Sinus Kurvenverlauf). Verbindet man Sin ![]() ![]() Beispiele für Anwendungsgebiete: Wellenbewegungen (nützlich für eine einfache Animation, wenn du den Mauszeiger über den Text hälst) Code: [AUSKLAPPEN] MS=MilliSecs()
Text 100, 200+Sin(MS*0.2)*5, "Hello World" Oder auch hier: einfacher Farbwechsel Code: [AUSKLAPPEN] MS=MilliSecs()
Color 255*Abs(Sin(MS*0.2)), 255*Abs(Sin(MS*0.2)), 255*Abs(Sin(MS*0.2)) Text 100, 200, "Hello World" Oder hier für eine simple Simulierung von Atmung bei Egoshootern o.ä.: Code: [AUSKLAPPEN] MS=MilliSecs()
PositionEntity Camera,PlayerX#,PlayerY#+Sin(MS*0.2)*5,PlayerZ# |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group