Kniffliger Sprung-Code
Übersicht

![]() |
x-pressiveBetreff: Kniffliger Sprung-Code |
![]() Antworten mit Zitat ![]() |
---|---|---|
Folgendes Problem: eine Figur soll von einer Plattform zur nächsten springen. Das wäre noch einfach -allerdings befindet sich jede Plattform auf einer anderen Höhe. Der Höhenunterschied zwischen zwei Plattformen kann manchmal gering sein, manchmal schon extremer.
Das Problem ist nun, die Sprungbahn schön weich aussehen zu lassen -also nicht nur in einer geraden Linie von Plattform A nach Plattform B, sondern in einem Bogen. Ich habe das hier mal illustriert: ![]() Bei A) liegen Start- und Endpunkt z.B. auf der selben Höhe. Bei B) liegt der Endpunkt etwas höher. Bei C) und D) ist der Höhenunterschied z.B. recht hoch. Dennoch sollte die Sprungbahn aber schön rund sein -also auch, wenn der Zielpunkt niedriger liegt, müsste die Figur erst etwas hoch springen. Weil die Höhen der Plattformen zufällig sind -und auch deren Abstände!-, bin ich auf der Suche nach einer Formel, die das mehr oder weniger zuverlässig hinkriegt. Ich grüble schon eine Weile darüber, komme aber nicht auf die Lösung. Mir fehlt der richtige Denkansatz. Kann mich jemand erleuchten? |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
- Zuletzt bearbeitet von x-pressive am Fr, Aug 05, 2005 14:18, insgesamt 2-mal bearbeitet
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
->Forensuche
z.B. https://www.blitzforum.de/view...ght=sprung |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
-> Andere Leute nicht prinzipiell für dumm und faul halten.
Es soll nämlich auch User geben, die erst mal stundenlang die alles andere als optimale Suchfunktion des Boards hier benutzen, bevor sie überhaupt erst mal ein Wort posten. Und wenn man diesen Usern dann eine Forensuche vorschlägt, müssen sie sich zurückhalten, damit sie dir nicht an die Gurgel springen! ![]() Und jetzt erklär mir doch mal, was besagter Thread mit meinem Problem zu tun hat, ausser, daß das Wort "Sprung" drin vorkommt. Du Nase. EDIT: Lösung gefunden - eine Bezier-Spline-Kurve mit zwei Ablenkpunkten, die richtig zwischen beiden Punkten plaziert werden. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Lumne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bezier-Spline-Kurve??? Man kann's sich auch echt schwer machen...
Brauchst du nicht eigentlich nur eine Variable für die vertikale Geschwindigkeit deiner Figur, die bei jedem Schleifendurchlauf zu der y-Koordinate deiner Figur dazuaddiert wird? Wenn du dann springst, wird diese dann auf einen negativen Wert gesetzt. Wenn dann diese "ySpeed"-Variable ständig erhöht wird, ensteht automatisch eine physikalisch korrekte Kurve. Wie im Physikunterricht... nun ja, das ist bei mir schon ein bisschen her, aber so funktioniert es doch auch in der Realität... dadurch simulierst du automatisch die Trägheit und die Erdanziehungskraft. So in etwa: BlitzBasic: [AUSKLAPPEN]
|
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hilft mir nicht weiter - ich erkläre noch mal eben, warum. Vielleicht hab' ich das vergessen, zu erwähnen.
Also, mir geht es NICHT darum, einfach nur jedesmal exakt die gleiche Weite und Höhe zu springen, wie in einem normalen Jump'n'Run. Sobald meine Figur springen muß, sind zwei exakte Koordinaten bekannt: - Die momentane Position der Figur - Die Position des Zielpunkt (der höher, tiefer, näher oder weiter weg sein kann) Jetzt geht es darum, diesen Zielpunkt durch einen Sprung automatisch exakt zu treffen -und nebenbei noch eine schöne, runde Flugbahn hinzulegen. Ein normaler Sprungcode hilft hier nicht, denn man muß ja für jeden Sprung erneut den korrekten Winkel, den Bogen, die Weite berechnen. Und ein Bezier-Spline scheint hier genau das richtige: Start- und Endpunkt des Splines legt man auf Start- und Endpunkt des Sprungs. Die beiden Ablenkpunkte verteilt man über und gleichförmig zwischen Start und Ende. Und schon hat man eine nette Kurve. Ein Bezier-Spline ist nicht schwer: Code: [AUSKLAPPEN] Function bezier(x1,y1,x2,y2,x3,y3,x4,y4)
cx#=3*(x2-x1) bx#=3*(x3-x2)-cx# ax#=x4-x1-cx#-bx# cy#=3*(y2-y1) by#=3*(y3-y2)-cy# ay#=y4-y1-cy#-by# For i#=0 To 1 Step .02 x=((ax#*i#+bx#)*i#+cx#)*i#+x1 y=((ay#*i#+by#)*i#+cy#)*i#+y1 If i#>0 Then Line oldx,oldy,x,y oldx=x oldy=y Next End Function |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, ein "normaler" Sprungcode hätte es auch getan, denke ich.
Ich meine mit normal hierbei etwas wie Code: [AUSKLAPPEN] x = x + 1
Habe mir das jetzt gerade beim posten ausgedacht, garantiere also nicht für praxistauglichkeit. Sollte aber hinhauen ^^.
y = y + ys ys = ys + grav ; ys = vertikale geschwindigkeit. grav = die fallbeschleunigung If KeyHit(KEY_JUMP) Then xdist = Abs(x-NewX) ; bei mir kann man gerade nur nach rechts ^^ ydist = (NewY-y) ; y-abstand zwischen position und zielpunkt ys = xdist * grav + ydist/xdist ; zuerst wird die fallbeschleunigung getilgt, dann noch eine eine y-geschwindigkeit zum überwinden des höhenunterchieds während der gesamten strecke addiert. EndIf Sooo: Code: [AUSKLAPPEN] Graphics 640,480,32,2
SetBuffer BackBuffer() grav# = .5 newy = 400 Repeat Cls x# = x# + xs# y# = y# + ys# ys# = ys# + grav# If Sqr((NewX-x)^2+(NewY-y)^2)<5+Abs(ys) ys = 0 xs = 0 x = newx y = newy Rect x-10,y-10,20,20 If MouseHit(1) newx = MouseX() newy = MouseY() xdist# = NewX-x ydist# = NewY-y ; y-abstand zwischen position und zielpunkt xs# = Sgn(xdist)*5 ys# = -xdist/xs * grav / 2 + ydist/(xdist/xs) ; zuerst wird die fallbeschleunigung getilgt, dann noch eine eine y-geschwindigkeit zum überwinden des höhenunterchieds während der gesamten strecke addiert. EndIf Text 0,0,x+","+y Flip Until KeyHit(1) |
||
MrKeks.net |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, mit Bezier-Formel funktioniert das wirklich hervorragend -und ist total simpel umzusetzen!
Die perfekte Lösung für Sprünge mit festgelegtem Start- und Zielpunkt. So geht's: Eine Bezierkurve hat ja zwei Ablenkpunkte, die die "Verbiegung" der Linie von A nach B beeinflussen. Der Einfachheit halber benutze ich nur einen Ablenkpunkt, den ich genau in der Mitte zwischen Start und Ende und ein gutes Stück über diesen beiden plaziere. Der Ablenkpunkt ist quasi die höchste Stelle des Sprungs. Eine Bezierformel errechnet dann ganz einfach aus diesen drei Punkten (Start, höchster Punkt, Ende) eine weiche Kurve. In X-Richtung verschiebe ich die Figur nun ganz normal in konstanter Geschwindigkeit (x=x+xspeed). Es geht also nur noch darum, die aktuelle Höhe herauszufinden, damit ein weicher Sprung entsteht. Und diese findet man dann mit folgender simpler Funktion: Code: [AUSKLAPPEN] Function BezierY#(startY#,maxY#,endY#, fortschritt#) c#=3*(maxY-startY) b#=3*(maxY-maxY)-c# a#=endY-startY-c#-b# Return ((a#*fortschritt#+b#)*fortschritt#+c#)*fortschritt#+startY End Function startY = Y-Koordinate des Sprung-Startpunkts maxY = Y-Koordinate des Ablenkpunkts (höchste Stelle des Sprungs) endY = Y-Koordinate des Sprung-Zielpunkts fortschritt = Wert zwischen 0.0 (Anfang des Sprungs) und 1.0 (Ende des Sprungs). Das kann man errechnen, in dem man die aktuell zurückgelegte Distanz zum Startpunkt misst. Mit obiger Funktion kann man also jede mögliche Höhe der Sprungbahn zwischen Anfang und Ende finden, je nach dem, welchen Wert man als fortschritt angibt. Das ist simpel, das ist toll -und verdammt effizient! Man braucht nur mit dem Ablenkpunkt herumspielen (höher oder tiefer setzen) und kann so den Sprung flacher oder steiler machen. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann freue ich mich, dir mit meinem "sinnlosen" Link geholfen zu haben.
Übrigens halte ich andere nicht prinzipiell für dumm. Allerdings muss ich dir zustimmen, dass die Forensuche in manchen Fällen wirklich sehr ineffizient ist. |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, der Link hat mir in keinster Weise geholfen, hatte ja auch nicht das geringste mit meinem Problem zu tun. Sprung ist eben NICHT Sprung.
Die Idee mit dem Bezier-Spline ist mir nur gekommen, weil ich damals öfter damit gewerkelt habe. Alleine die Zeit, die du für zwei "sinnlose" Postings verbraucht hast, hättest du ja besser nutzen können, wenn du mein erstes Posting einmal RICHTIG durchgelesen hättest. Normalerweise nehme ich das nicht so ernst, aber mir fällt immer deutlicher auf, daß viele hier gar nicht mehr ins Detail gehen können und nur wischi-waschi mal schnell einen Text überfliegen. Das führt immer wieder zu Missverständnissen und den Leuten kann so einfach nicht geholfen werden. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
ZorroZ.ch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi zusammen,
ich bin nun schon lange aus der Suche nach einem geeigenten Sprungcode. Somit habe ich schon sehr vieles gesehen, diese hier übertrifft jedoch alles, was die Sprung-Finesses angeht. Nun habe ich aber doch noch eine Frage: Könntest du einmal zeigen, wie es möglich wäre eine Figur der Bezierkurve entlange "wandern" zu lassen?! Blicke noch nicht ganz durch, wie ich dann die X- und Y-Koorinaten wieder rausbekommen. ![]() |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier noch mal eben das Prinzip. Das Wichtigste sind zwei Dinge:
1. Eine Bezier-Kurve hat vier Punkte: Startpunkt, Zielpunkt -und zwei Ablenkpunkte. Wir benutzen aber nur einen, das reicht. Der Ablenkpunkt gibt an, wie hoch oder steil die Sprungkurve zwischen Start und Ende ist. Also nimmt man als Ablenkpunkt einen Punkt in der Mitte zwischen Start und Ende. Je höher man nun den Ablenkpunkt setzt, desto steiler wird die Sprungbahn. 2. Die Bezier-Formel braucht einen Wert zwischen 0.0 und 1.0 um die momentante Sprunghöhe zu errechnen. 0.0 ist quasi der Anfang des Sprungs und 1.0 das Ende. 0.5 wäre also genau in der Mitte des Sprungs. Soweit alles klar? Hier mal ein schneller Beispielcode zur Demonstration. Sieht wegen der Kommentare länger aus, als es ist. Ohne Kommentare sind das nur ein paar Zeilen Code, die man braucht: BlitzBasic: [AUSKLAPPEN]
|
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich empfehle einen Versuch mit CatmulRomSpline (code gibts auf blitzbase - bezier - da ist mehreres drin)
so... der vorteil ist, dass das ding besser definierbar ist - 1. punkt ist startpunkt, 2 punkt irgendwo oben (wie du es am besten möchtest). und 3. punkt am ziel... du fliegst auf jeden fall durch alle 3 punkte durch. bezier ist etwas "unpräzise", weil du die linie irgendwohin ablenkst. - aber damit gehts auch... guck mal... |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Müsste man testen -bei Bezier ist halt relativ sicher, daß die Kurve nie zu eckig oder zu steil ist, wenn beide Punkte sehr nah beieinander liegen, da der Rundung hier eine größere Priorität gegeben wird, als dem genauen Erreichen des Ablenkpunkts. Wenn der Ablenkpunkt direkt angesteuert wird, kann die Sprungbahn u.U. recht steil wirken. Aber das muß man mal austesten. | ||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group