Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
31.10.2002, 00:21
Retro



Nabend, ich knobele schon länger an nem richtig gut funktionierendem Rasterfang für eine grafische Oberfläche. Das ganze ist in Delphi geschrieben, aber da es eher um die Technik geht, ist dies nebensächlich...

Wie gesagt ist die Methode die ich benutze unzureichend... Sie beruht auf der Ganzzahldivison (sehr, sehr billig):Quellcode:procedure TForm2D.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  CursorPos: TPoint;
begin
  GetCursorPos(CursorPos);
  SetCursorPos((CursorPos.X div 10) * 10, (CursorPos.Y div 10) * 10);
end;
So, nun ist die Bewegung des Cursors unter aller Sau!
Nun hab ich schon eine andere Variante ausprobiert...
Die Mausposition wird in einer globlan Variable beim Event-Einstieg gespeichert. Ist die Variable gesetzt so wird geguckt ob die Maus weiter nach Links/Rechts/Oben/Unten gewandert ist und ggf. der Cursor um 10 Pixel in die dementsprechende Richtung versetzt, dannach die nun aktuelle Position wieder gespeichert. Auch das war mehr oder weniger (Das böse Wort mit Sch...).

Da muss es doch irgendeinen Algorithmus für geben bzw. eine gebräuchliche Technik die gut funktioniert?! (Google findet nichts in Sachen programmierung von Rasterfunktionen..)

Danke, Gn8 und Bye!

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
001
31.10.2002, 14:56
Prefect



Du mußt zwischen der "echten" und der "virtuellen" Mausposition unterscheiden. Die echte Mausposition ist diejenige, die durch die Mausbewegung vorgegeben wird. Die virtuelle Mausposition wird an das Gitter angepaßt.
Ich weiß nicht, ob diese Differenzierung mit dem normalen Cursor möglich ist. Im Zweifelsfall mußt du den normalen (echten) Cursor verstecken und einen eigenen zeichnen, der auf die virtuelle Mausposition gesetzt wird.

Übrigens solltest du die X/Y-Position vor der Division noch um Gitterabstand/2 erhöhen.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
03.11.2002, 22:43
Retro



Tja, wies scheint isses kein sonderlich ergibieges Thema. Ich hab jetzt etwas in nem alten Buch gefunden, aber sonderlich weiterhelfen tut es mir auch nicht.

Im Prinzip ist Prefects Ansatz ja gut, aber ob es sich so gut realisieren lässt?! MSDN sagt einen auch nicht wie man die "echte" Mausposition kriegt bzw. wie man den Cursor abnabelt...

Mal schaun was sich machen lässt, vielleicht kommt ja noch ein Geistesblitz. Danke!

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
003
03.11.2002, 23:17
Nicemice
Moderator


mach einfach noch überall ne +5 rein

--

www.d3opencoop.com - A Doom3 Cooperative Mod

zum Seitenanfang zum Seitenende Profil || Suche
004
04.11.2002, 12:54
Prefect



Die +5 braucht es natürlich, aber das reicht nicht. Das Problem bei dem einfachen Ansatz aus dem ersten Post sind langsame Mausbewegungen. Wenn die Maus bei jedem Aufruf der Funktion nur um ~3 Pixel bewegt wird, dann wird die Maus zurück an die Rasterposition verfrachtet, und beim nächsten Aufruf nach ~3 Pixeln ist sie wieder nicht weit genug entfernt usw.
Langsame Mausbewegungen werden durch den Code komplett ausgelöscht, deswegen muß man zwischen der realen und der virtuellen Mausposition unterscheiden.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
005
04.11.2002, 14:18
Nicemice
Moderator


Nö, muß man nicht.

Quellcode:procedure TForm2D.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  CursorPos: TPoint;
  Oldpos: TPoint;
  epsilon: Int;
begin
  // pseudocode, was für eine Sprache is das ?
  epsilon = 2; // zwischen 1,...,4
  OldPos = CursorPos;
  GetCursorPos(CursorPos);

  if (Oldpos.X > CursorPos.X + epsilon)
  {
  CursorPos.X+= 10;
  }
  else if (Oldpos.X + epsilon < CursorPos.X)
  {
  CursorPos.X-= 10;
  }
  if (Oldpos.Y > CursorPos.Y + epsilon)
  {
  CursorPos.Y+= 10;
  }
  else if (Oldpos.Y + epsilon < CursorPos.Y)
  {
  CursorPos.Y-= 10;
  }
  SetCursorPos((CursorPos.X div 10) * 10, (CursorPos.Y div 10) * 10);
end;

--

www.d3opencoop.com - A Doom3 Cooperative Mod


Dieser Beitrag wurde am 04.11.2002 um 14:23 von Nicemice bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
04.11.2002, 21:15
Prefect



Zeile 2 der Funktion hat einen Bug... CursorPos ist undefiniert (es sei denn es gibt da irgendeine Pascal-Magie, die ich inzwischen vergessen habe).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
007
04.11.2002, 22:02
Nicemice
Moderator


Dann muß man CursorPos halt global definieren, oder wie auch immer. Ich programmier kein Pascal, aber ich denke man weiß was gemeint ist...

--

www.d3opencoop.com - A Doom3 Cooperative Mod

zum Seitenanfang zum Seitenende Profil || Suche
008
04.11.2002, 22:07
Retro



Joa, moin...

Auch wieder nen guter Ansatz, aber auf all das Zeug bin ich schon selber gekommen. Schaut in der Theorie auch vollkommen logisch aus (ob nun mit deklariertem CursorPos oder ohne..), in der Praxis hüpft der Cursor bei betreten des Bildes allerdings nur wild umher oder ist nicht auf dem Bild zu halten.

Aufgeben möchte ich eigentlich noch nicht, aber wenns denn halt nicht anders geht muss ich meinen eigenen Cursor zeichnen.

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
009
05.11.2002, 13:58
Prefect



Hmm, also für mich sieht das leider gar nicht logisch aus...
Immerhin kann Nicemices Code dazu führen, daß winzige Cursorbewegungen (epsilon < bewegung < 10) in recht große Cursorbewegungen (bewegung >= 10) umgewandelt werden.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche