![]() |
Nicht-Lineare Bewegung eines Fensters
Moin Moin ...
Wer den ![]() Dabei wird das Fenster vom Bildschirm gezogen, entweder manuell oder nach einer festgelegten Zeit. Die Bewegung des Fensters ist nahezu linear, denn ich gebe eine Zeit in ms vor, in der sich der Launcher 'aus dem Staub' gemacht haben soll. Zu Verdeutlichung hier der entsprechende Source-Code:
Delphi-Quellcode:
Soweit so gut ... Das Ergebnis könnt Ihr Euch gerne mit der letzten
procedure TLauncher1.Slide;
var fw,fh,RPos: integer; Start,Step: Extended; begin SlideSpeed := 500; // eine halbe Sekunde für die Bewegung Start := GetTickCount + SlideSpeed; if not Slided then begin ExHeight := Height; ExWidth := Width; RPos := Left + ExWidth; repeat Step := (Start - GetTickCount) / SlideSpeed; //^^ Verkleinerungs-Faktor abhängig von der verstichenen Zeit fh := Round(ExHeight * Step); // reduzierte Fensterhöhe fw := Round(ExWidth * Step); // -"- Fensterbreite if Slided then begin // Werte umdrehen um Fenster wieder herzustellen fh := ExHeight - fh; fw := ExWidth - fw; end; case Richtung of 1: Height := fh; // ab nach oben 2: begin Left := Screen.Width - fw; Width := fw; end; // rechts 3: begin Top := Screen.Height - fh; Height := fh; end; // unten 4: Width := fw; // Fenster nach links schieben end; Application.ProcessMessages; until Start - GetTickCount < 0; end; end; ![]() Nun schwebt mir eine 'nicht-lineare' Fensterbewegung vor, ähnlich einer teueren Küchenschublade. Jeder kennt den Effekt, wenn so eine Schublade vor dem Schließen nochmal kurz abgebremst wird. Diesen Effekt würde ich gerne in eine entsprechende Formel pressen. :thumb: Ich schaffe es aber nicht meine Routine so abzuändern. Sämtliche Versuche sehen entweder ruckelig aus oder enden in total verkrampften Source-Code. Auch habe ich Zweifel am 'TimeBased Movement' meines Programms. Wahrscheinlich kann man den gesamten Code sowieso noch schwer optimieren. Für jeden Tipp dankbar, grüßt ... |
Re: Nicht-Lineare Bewegung eines Fensters
Du könntest das mit Sinus machen, indem du das Fenster mit 1-sin(degtorad(pos)) bewegst, wobei pos die aktuelle Position (Zahl zwischen 0 und 90) ist.
|
Re: Nicht-Lineare Bewegung eines Fensters
Moin Moin ...
@3_of_8: OK, diese Idee hatte ich auch schon, bekomme sie aber nicht sauber umgesetzt ... Vielleicht hat ja noch jemand einen Vorschlag ?!? Mit dem Kurvenlineal, winkt ... |
Re: Nicht-Lineare Bewegung eines Fensters
Hallo!
Wie wärs mit einer -(x^2) Funktion vielleicht? Die Nullstelle setzt du auf die Mitte deiner Leiste, dann beschleunigt sie langsam, wird an der Mitte am schnellsten und bremst am Rand wieder ab! mfG Markus |
Re: Nicht-Lineare Bewegung eines Fensters
Tach nochmal ...
@markusj: Auch keine schlechte Idee ... Ich bezweifele im Moment jedoch das ich mit meiner Funktion (siehe oben) so etwas überhaupt hinbekomme, denn diese Routine versucht ja immer eine bestimmte Strecke pro Zeit zurückzulegen ... :gruebel: oder liege ich da falsch ?!? Wie muss ich denn diese Zeile verändern, damit sich die Bewegung am Kurvenverlauf orientiert ?
Delphi-Quellcode:
Schön gleichmäßig, grüßt ...
Step := (Start - GetTickCount) / SlideSpeed;
|
Re: Nicht-Lineare Bewegung eines Fensters
Hi SittingDuck.
Kurzer Denkanstoß:
Delphi-Quellcode:
(Ungetestet)
Step := 20 - SlideSpeed * Power((Start - GetTickCount), 2);
Gruß, Waldteufel |
Re: Nicht-Lineare Bewegung eines Fensters
Du variierst deinen Slide-Speed ... der entspricht dem Verlauf einer -(x^2)+z Parabel, wobei z die Geschwindigkeit und die Nullstellen bestimmt.
mfG Markus |
Re: Nicht-Lineare Bewegung eines Fensters
Hi ...
@markusj: Dein Kurvenvorschlag würde ich gerne mal in Aktion sehen ! (ein lauffähiges Beispiel wäre natürlich der Hit ...) So wie der Waldteufel die Routine modifiziert hat, läuft es leider nicht. (steigt mit einem Bereichsprüfungsfehler aus ...) Beinahe aus der Kurve geflogen, grüßt ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz