![]() |
Rechtsklick-Scrolling
Ich gebe zu, der Titel ist etwas unglücklich gewählt, aber ich weiß nicht, wie ich es besser bezeichnen soll. Viele kenne aus diversen Strategiespielen das Verhalten, das man bei gedrückter rechter Maustaste mit der Kamera, den Mausbewegungen folgend, scrollen kann. Das ganze ist dann auch noch sanft beschleunigt und abgebremst.
Meine Frage: Wie lässt sich das sauber umsetzen? Die Maus darf sich ja eigentlich nicht von der Stelle bewegen und mann muss alle Bewegungen mitbekommen und das ganze auch noch beschleunigen/abbremsen. Ich suche ein paar Ansätze, wie sich das umsetzen lässt. Grüße |
Re: Rechtsklick-Scrolling
Als ansatz...
Du mußt auf MouseDown reagieren, dann abfragen ob es die rechte Maustaste ist wenn ja.. boolean wert setzten. nun noch auf das MouseUp reagieren und dementsprechend wieder den boolean zurücksetzten.. nun nochmal auf das MouseMove Event reagieren.... und dabei sagen das die maus die positi9on halten soll.... und natürlich dem ganzen noch ieenen sinn geben.... also zusätzlich im MouseMove die gewünschte Aktion aufrufen. MfG Real Thunder |
Re: Rechtsklick-Scrolling
Zitat:
Zitat:
|
Re: Rechtsklick-Scrolling
du bekommst dann ja die Richtung....
also anhand der neuen position.... also x/y +- 1.. naja dann versuche einfach den mauszeger zu verstecken.. merke dir die position wo er gestanden ist... und von dort fragst du mit nem timer ab wo sich die maus befindet.. und reagierst drauf.. und je länger es in die selbe richtung geht.. desto kürzer werden die timerabstände. MfG Real Thunder |
Re: Rechtsklick-Scrolling
So, endlich hinbekommen. Auch wenn es etwas schwer aus dem Zusammenhang zu bekommen ist - hier ist die Lösung:
Delphi-Quellcode:
Kann man sicherlich noch verschönern, aber sollte für den Anfang reichen :mrgreen:
VScroll: TPoint;
TInputState = (isRightClickScroll); TInputStates = set of TInputState; {....} procedure TEngine.Mousedown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); var pt: TPoint; begin if Button = mbRight then // Nur bei rechter Maustaste begin InputState := InputState + [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling an ist pt := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2); SetCursorPos(pt.X, pt.Y); // Cursor auf Mitte zentrieren end; end; procedure TEngine.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); begin if Button = mbRight then begin InputState := InputState - [isRightClickScroll]; // Merken, dass Rechtklick-Scrolling aus ist VScroll := Point(0, 0); // Scrollingversatz zurücksetzen end; end; procedure TEngine.MouseMove(X, Y: integer); Center, RealPoint: TPoint; begin if isRightClickScroll in InputState then begin // Mitte ermitteln Center := Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2); // Tatsächliche Mausposition ermitteln RealPoint := Point(AParent.ClientOrigin.X+X,AParent.ClientOrigin.Y+Y); // Anstand in "Vektor" speichern (hier TPoint zweckentfremdet VScroll.x := VScroll.X + (Center.X - RealPoint.X); VScroll.y := VScroll.Y + (Center.Y - RealPoint.Y); end; procedure TEngine.DoScroll(TimeGap: double); var Center: TPoint; begin if isRightClickScroll in InputState then if (VScroll.X <> 0) or (VScroll.Y <> 0) then // Nur ausführen, wenn auch Versatz da ist begin // Entsprechend des Versatzes scrollen SpriteEngine.X := SpriteEngine.X + VScroll.X; SpriteEngine.Y := SpriteEngine.Y + VScroll.y; // Es wurde gescrollt, also Vektor zurücksetzen VScroll.x := 0; VScroll.Y := 0; // Cursor wieder auf Mitte festhalten Center:=Point(AParent.ClientOrigin.X+AParent.ClientWidth div 2,AParent.ClientOrigin.Y+AParent.ClientHeight div 2); SetCursorPos(Center.X, Center.Y); Exit; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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-2025 by Thomas Breitkreuz