AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Rechtsklick-Scrolling
Thema durchsuchen
Ansicht
Themen-Optionen

Rechtsklick-Scrolling

Ein Thema von Codewalker · begonnen am 21. Jun 2008 · letzter Beitrag vom 22. Jun 2008
Antwort Antwort
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

Rechtsklick-Scrolling

  Alt 21. Jun 2008, 15:42
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
Thomas
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#2

Re: Rechtsklick-Scrolling

  Alt 21. Jun 2008, 16:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Rechtsklick-Scrolling

  Alt 21. Jun 2008, 16:42
Zitat von Real_Thunder:
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..
Okay, bis hierhin war mir schon klar

Zitat von Real_Thunder:
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.
Tja, an der Aktion hapert es. Ich muss irgendwie den Versatz o.ä. ermitteln und gleichzeitig die Richtung und (wenn es schön werden soll) noch in eine Beschleunigung umsetzen. Ich hatte es schon mit zurücksetzen der Position, aber ich bekomme habe immer nur Abstände in 1 Pixel bis zum nächsten Event zurück.
Thomas
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#4

Re: Rechtsklick-Scrolling

  Alt 22. Jun 2008, 16:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Rechtsklick-Scrolling

  Alt 22. Jun 2008, 17:47
So, endlich hinbekommen. Auch wenn es etwas schwer aus dem Zusammenhang zu bekommen ist - hier ist die Lösung:

Delphi-Quellcode:
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;
Kann man sicherlich noch verschönern, aber sollte für den Anfang reichen
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz