Problem beim flüssigen Scrollen - Quadratische Funktionen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

BigMaexle

Betreff: Problem beim flüssigen Scrollen - Quadratische Funktionen

BeitragMi, Jul 16, 2008 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Moinsen Leutz,

Ich hätt da gern mal ein Mathe Problem.

Also ich habe ein Jump'n'Run und möchte ein flüssiges Scrollen haben, wenn man die Blickrichtung wechselt. Also dass Der Bildschirmbereich sich von rechts von der Spielfigur nach Links von der Spielfigur verschiebt.

DAs Problem ist die Geschwindigkeit des Scrollen. Der WEchsel soll so ~1/2 Sekunde dauern (30 Frames bei meinen Einstellungen), damit man gleich weitermachen kann und nciht durch den Richtungswechsel aufgehalten wird.

Wenn ich eine kontinuierliche Geschwindigkeit nehme, sieht das so "abgehakt" aus, nicht schön. Also hab ich mir gedacht, sollte die GEschwindigkeit die Form einer Parabel haben, also f(x) = a(x-b)²+c (Scheitelpunktform)

Also f(x) ist die Scrollgeschwindigkeit. b ist 15, die Hälfte zwischen 0 und 30, die ja die Nullstellen sind. Nur wie ich a und c rausbekommen soll ist mir nicht klar. a ist auf jeden Fall <0, denn die Parabel ist logischweise nach unten geöffnet.

Mit den Infos lässt sich das auch nicht rausbekommen, deshalb kommt noch eine weitere. Die gesamte Scroll-Entfernung beträgt 450 (Hängt von der Auflösung ab, aber das ist jetz erstmal egal)

Um das Mathematisch auszudürcken: Wenn diese Funktion, die ich suche, eine Ableitungsfunktion einer anderen wäre, gähe diese durch P (30|450)

Tja, und ich bin mir sicher, mit den Werten kann man die Funktionsgleichung aufstellen, ich hab nur keine Ahnung wie. Razz
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 16, 2008 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ein paar Beispiele:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(30)
Local A#=200
Local B#=200
Local C#=200
Local D#=200

While Not KeyHit(1)
   Text 20,120,"sofort"
   Text 20,220,"speed"
   Text 20,320,"abstand"
   Text 20,420,"abstand+speed"
   
   A=MouseX()
;   If KeyHit(203) Then A=A-100
;   If KeyHit(205) Then A=A+100
   
   B=B+Sgn(A-B)
   C=C+(A-C)/10.0
   D=D+((A-D)/20.0)+Sgn(Int(A-D))
   
   Rect A,100,20,60,1
   Rect B,200,20,60,1
   Rect C,300,20,60,1
   Rect D,400,20,60,1
   
   WaitTimer(Timer)
   Flip 0
   Cls
Wend
End


Ansonsten wüsste ich nicht genau was du meinst, wenn ich falsch liege.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

BigMaexle

BeitragMi, Jul 16, 2008 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Thx hectic, dass sind schöne flüssige Bewegungen, lösen mein Problem aber leider nicht Wink

der 3. und 4. sind ja im Prinzip nicht gross unterschiedlich, außer dass beimn 4. noch 1 addiert/subtrahiert wird.

DAs Problem liegt aber am Folgenden: Wenn du jetzt die Maus von 200 nach 400 vershciebst, ist die Geschwindigkeit, mit der sich die beiden unteren REchtecke verschieben, sofort sehr schnell und wird ann langsamer. Ich möchte, dass es beschleundigt und wieder abbremst. Ich mach mal ne Skizze:

Es ist die Funktionsgleichung zu folgenden Graph gesucht:

user posted image

Die Schwarze Linie soll die Geschwindigkeit des Scrollen sein. Die Nullstellen sind 0 und 30 (nach 30 Frames, einer halben Sekunde, solle raufhören zu scrollen)

Und die schraffierte Fläche ist 450 gross.
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber
 

Darren

BeitragMi, Jul 16, 2008 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
also. ganz simpel:

t=zeit
t -> y
y ist also wie weit nach einer bestimmten zeit gescrollt wurde

also deine funktion muss bei t=0 und t=0.5 ihre nullstellen haben. logischerweise liegt dein maximum bei 0.25. das heißt die erste ableitung hat bei 0.25 ihre einzige nullstelle, ist vorher positiv und danach negativ. wie weit du dann letztendlich scollst bestimmst du mit dem integral deiner quadratischen funktion(bin mir hier aber nicht wirklich sicher)

dein ansatz ist also

f(x) = a*((x - 0) * (x - 0.5)) = ax²-a0.5x (in wie weit deine funktion gestreckt werden soll, müssen wir erst mit dem integral rausfinden)
f'(x) = 2ax - a0.5 (f' können wir leider auch nicht für die bestimmung des parameters verwenden, da diese auch hier unabhängig von a sind)
F(x) = a/3*x³ - a*0.25*x² (während ich das hier tippe fällt mir auf, dass du zumindest eine maximale drehgeschwindigkeit angeben solltest) wenn du y = max_speed und x = 0.25 in irgendeine der funktionen einsetzt, solltest du dir a ausrechnen können, somit hast du dann deinen funktionsterm und kannst damit anstellen, was immer du auch willst.)

gut vielleicht wäre es auch einfacher gegangen, aber da ich analysis sehr mag, hat es mir mal spaß gemacht drüber nachzudenken xD

lg Darren

EDIT: hab deinen post grade gelesen. stelle ein bestimmtes integral von 0 bis 0.5 auf und setze das gleich 450. dann solltest du a ausrechnen können, das wir oben gesucht haben.
MFG Darren

Tobchen

BeitragMi, Jul 16, 2008 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist vielleicht blöde, den ersten Post zu überfliegen, die Antworten darauf gar nicht erst zu lesen und trotzdem helfen zu wollen, aber ich muss den Postcount erhöhen!

Code: [AUSKLAPPEN]
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Dim Kreis(39, 1)
For I = 0 To 19
   Kreis(I, 0) = Rand(-800, 800)
   Kreis(I, 1) = Rand(0, 480)
Next

ScrollX = 200
Winkel = 0
Plus = -5

Repeat
   If KeyHit(203) Then
      Plus = +5
   ElseIf KeyHit(205)
      Plus = -5
   EndIf
   
   If Timer < MilliSecs() Then
      Winkel = Winkel + Plus
      If Winkel < 0 Then Winkel = 0
      If Winkel > 180 Then Winkel = 180
      ScrollX = 200*(Cos(Winkel))
      Timer = MilliSecs()+25
   EndIf
   
   Cls
   
   Color 255, 255, 255
   For I = 0 To 19
      Oval Kreis(I, 0)-ScrollX, Kreis(I, 1), 10, 10
   Next
   Color 255, 0, 0
   Oval 310-ScrollX, 400, 20, 20
   
   Text 10, 10, Str$(Winkel)+", "+Str$(Cos(Winkel))+", "+Str$(ScrollX)
   
   Flip
Until KeyDown(1)

End


Ich habe das ganze einfach von Kosinus abhängig gemacht.
Ich mag Kosinus.

Könnte allerdings schließlich im Spiel hässlich aussehen, wenn man öfters in zehn Sekunden nach rechts und links gucken muss...
Tobchen - die Welt von Tobi!

BigMaexle

BeitragMi, Jul 16, 2008 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Darren hat Folgendes geschrieben:
also. ganz simpel:


Naja, nicht wirklich ^^

Also ich habe nicht alles verstanden. Vorallem wie du auf die 3. Funktion gekommen bist. Aber egal, das Problem ist , dass ich "max_Speed" nicht kenne Wink, also den Y-Achsenabschnitt. WEnn ich den kennen würde, könnte ich ja auflösen nach A.

Und man kann ja leicht sagen: Ja, Max_Speed kann alles sein, kanns aber nicht. Du hast ja eine Feste Fläche. Und wenn du eine Parabel mit festen Nullstellen und einer festen Fläche hast, muss der Scheitelpunkt auch feststehen.

Tobi: Dein Code funktioniert super, wies im SPiel aussieht weiß ich nicht, aber wenn ich beides hab, guck ich was schöner aussieht.
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber
 

Darren

BeitragMi, Jul 16, 2008 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
BigMaexle hat Folgendes geschrieben:
Darren hat Folgendes geschrieben:
also. ganz simpel:


Naja, nicht wirklich ^^

Also ich habe nicht alles verstanden. Vorallem wie du auf die 3. Funktion gekommen bist.


Mit der dritten Funktion lässt sich genau diese Fläche ausrechnen, die du. Integral ist die umkehrung der ableitung. wenn du F(x) ableitest erhälst du f(x) => F'(x) = f(x).

wenn du jetzt einmal rechnest: F(0.5) - F(0) = 450 und das nach dem parameter a auflöst, dann kannst du alle drei funktionen eindeutig definieren und kannst deinen kollegen drehen.
MFG Darren

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jul 17, 2008 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, jetzt verstehe ich was du meinst. Allerdings bewegt man sich in einer Tilemap z.B. Jump&Run ja nicht sprunghaft (beamen), sondern auch mit einer bestimmten Geschwindigkeit. Von daher kann man getrost so etwas einfaches wie meine C# -Variablenvariante nehmen, denn die Map wird sich dann nach deinen Vorstellungen bewegen. Ausser du baust auch Teleporter ins Game, dann gilt Darrens oder Tobis Variante die dafür etwas komplizierter sind.

Letztendlich wird aber bei einem Jump&Run in welchem man in beide Richtungen laufen muß, noch weiteres eingebaut werden müssen. Zum Beispiel, dass man sich immer eher in der Mitte der Map bzw. die Map sogar vorraus scrollt. Ansonsten läuft man so etwas gegen den Bildschirmrand, gerade bei hohen Geschwindigkeiten, wo man besonders viel vorraus sehen müsste es eben dann nicht kann.

Man kann also auch die Figur selbst beschleunigen und dafür immer in der Mitte des Bildschirmes anzeigen. Oder auch die Geschwindigkeit der Figur als vorrausscrollen der Map benutzen. Alles unterschiedliche Möglichkeiten.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

BigMaexle

BeitragDo, Jul 17, 2008 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja Hectic, du hasst ja vollkommen recht mit dem was du sagst, hilft mir bei meinem Problem aber nciht weiter.

Es ist ja so, dass es einen Scroll-Sprung gibt, wenn man die Blickrichtung ändert. Denn wie du richtig gesagt hast, man muss weiter in die Blickrichtung schauen können. Und ich will ncihts weiter, als dass der Übergang, wenn man die Blickrichtung wechselt, schön und flüssig aussieht. Es ist im Grunde nichts weiter als eine Schönheitsoperation.

Und SO ganz hab ich Darren immernoch nich verstanden.

Zitat:
während ich das hier tippe fällt mir auf, dass du zumindest eine maximale drehgeschwindigkeit angeben solltest


Diese maximale Drehgeschwindigkeit kenne ich doch nciht, genauso wie die Streckung A. Aber naja, ich werd erstmla ne Nacht drüber schlafen.

Edit heute Morgen: Tobi, ich hab deinen Code genommen, Man sollte nur den Timer rausnehmen, ohne den sieht das noch viel flüssiger udn schöner aus. Trotzdem: Die andere Möglichkeit will ich auch wissen Confused
--------------------------------------
Ich bin unfreiwillig ein Mitglied dieser kapitalistischen Gesellschaft, wo jeder Geldgeile Unternehmer an mein Geld will und ich selbst bei meinen Entscheidungen so gut wie willenlos bin...... und ich bin glücklich drüber

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group