Wie berechne ich die Mausposition

Previous topic - Next topic

Derb

Hallo

Ich habe mir aus einem Codeschnipseln von hier und ein paar veränderungen meinerseits ein kleines Programm geschhrieben.

Ziel ist es eine große Karte zu zeichnen, auf der alle 64 Pixel sobald ich mit der maus drüber fahre, ein kleiner Rahmen in 64 x 64 Pixel erscheint. Das funktioniert mitlerweile sehr gut. Selbst wenn ich die Map um ein paar pixel verschiebe, wird der Rahmen korrekt abgeschnitten gezeichnet. Leider verändert sich ja beim scrollen die virtuelle Maus Position und ich komme einfach nicht drauf wie ich das dann abfange.

Bsp. Die Karte ist genau um 0 , 64 , 128 oder 192 Pixel verschoben, dann rastet die maus alle 64 Pixel korrekt ein und wirft mir den Rahmen über mein Quadrat. Sobald ich jedoch nur 32 Pixel gescrollt habe wird zwar der Rahmen immer über ein Quadrat geworfen aber die Maus reagiert um die 32 Pixel falsch.

Was tun???


Code (glbasic) Select


// --------------------------------- //
// Project: Map Ed
// Start: Sunday, May 08, 2011
// IDE Version: 10.159



// Globale Variablen

GLOBAL mainscreenx%,mainscreeny%
GLOBAL GraphX%,GraphY%
GLOBAL gox%,goy%                 // Wird für Mapscrolling benötigt
GLOBAL MaxTX%                // Tileanzahl in der Horizontalen
GLOBAL MaxTY%                // Tileanzahl in der Vertikalen
GLOBAL TS%                // Tilegrösse
GLOBAL level%[]
GLOBAL scroll_speed%    // Scrollspeed
GLOBAL x%,y%,startx%,starty%,endx%,endy% // Var für forschleife
GLOBAL posx%,posy%                         // Var für die scollposition
GLOBAL vposx%,vposy%                        // Virtuelle Karten Koordinaten



// Dimensionieren der Speicherfelder

DIM quad[100][100][50][50]


// Werte der Konfiguration auslesen

GOSUB Konfig



// Daten Auslesen

GOSUB Daten



// Screen und Fonts und Maus Konfigurieren

SETSCREEN mainscreenx, mainscreeny, mainscreenfull
LOADFONT "Grafik/fonts/smalfont.png", 1
SETFONT 0
SYSTEMPOINTER TRUE



// Laden der Grafiken in den Grafik Puffer
// RGB 255/0/128 <--- (Diese Farbe ist für GL Basic transparent)

LOADSPRITE "Grafik/map/64x64.bmp", 0 //Title Set
LOADSPRITE "Grafik/map/highlight.bmp",2     //Highligt


@Hauptschleife:
//-------------------------------------------------------------------------------------------------------------------------------------
// Hauptschleife Ende mit Esc ---------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------
REPEAT

updatefor()
scroll()
scrollmap(gox,goy)

FOR y = starty TO endy
    FOR x = startx TO endx
   DRAWSPRITE 0,posx+TS*x,posy+TS*y
   SETFONT 0
   PRINT "H:"+INTEGER(posx+TS*x),posx+TS*x,0+posy+TS*y // Nur zum austesten die Titles Beschriften
   PRINT "V:"+INTEGER(posy+TS*y),posx+TS*x,8+posy+TS*y // Nur zum austesten die Titles Beschriften
    NEXT
NEXT

virtualkoord()



SETFONT 1
MOUSESTATE mx, my, br, bl               // Aktuelle Mausposition speichern
mmx=mx ; mmy=my                         // Mausposition in zweitem Wert zwischenspeichern
vposx=INTEGER(ABS(posx)-TS*startx)      // Pixel Anzahl um die der Bildschirm verschoben ist in der X Achse
vposy=INTEGER(ABS(posy)-TS*starty)      // Pixel Anzahl um die der Bildschirm verschoben ist in der Y Achse
mx=mx-MOD(mx,TS);my=my-MOD(my,TS)       // Rasterung für die Markierung
PRINT "mmx"+mmx,100,30
PRINT "mx-vposx"+mx,100,42
mx=mx-vposx ; my=my-vposy               // Rasterung mit Korrigiertem Nullpunkt
PRINT "mx-vposx"+mx,100,54
DRAWSPRITE 2,mx,my



SHOWSCREEN



UNTIL KEY (01)
END
//-------------------------------------------------------------------------------------------------------------------------------------
// Hauptschleife Ende mit Esc ---------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------



// Variablen für Forschleife updaten, enthält Globale variablen
FUNCTION updatefor:
//Startwert für die forschleife
startx = ABS(posx/TS)
starty = ABS(posy/TS)

//endwerte für die forschleife
endx = startx +(GraphX/TS)
IF endx > MaxTX THEN endx = MaxTX

endy = starty +(GraphY/TS)+1   //+1 da man hier in einen Kommabereich reinkommt!
IF endy > MaxTY THEN endy = MaxTY


ENDFUNCTION



FUNCTION virtualkoord:

// MOUSESTATE mx, my, br, bl
// mx=mx-MOD(mx,64);my=my-MOD(my,64)

// vposx=INTEGER(ABS(posx)-TS*startx) // Virtueller Nullpunkt Multiplikator in der X Achse
// vposy=INTEGER(ABS(posy)-TS*starty) // Virtueller Nullpunkt Multiplikator in der Y Achse

// vposx=mx-vposx
// vposy=my-vposy

ENDFUNCTION



// Für das scrolling mit der Maus und mit den Pfeiltasten
FUNCTION scroll:

MOUSESTATE mx, my, br, bl

IF mx < 1  AND posx < 0 // Nach Links mit der Maus
    gox = 1
ENDIF

IF mx > mainscreenx - 2 AND posx > GraphX-(TS*MaxTX) // Nach Rechts mit der Maus
    gox = 2
ENDIF

IF my > mainscreeny - 2 AND posy > GraphY-(TS*MaxTY) // Nach Unten mit der Maus
    goy = 2
ENDIF

IF my < 1 AND posy < 0 // Nach Oben mit der Maus
    goy = 1
ENDIF



IF KEY(203) // Links mit Pfeiltasten
    gox = 1
ENDIF

IF KEY(205) // Rechts mit Pfeiltasten
    gox = 2
ENDIF

IF KEY(208) // Runter mit Pfeiltasten
    goy = 2
ENDIF

IF KEY(200) // Hoch mit den Pfeiltasten
    goy = 1
ENDIF



ENDFUNCTION



FUNCTION scrollmap:l_x%,l_y%
IF l_x = 1 THEN INC posx,scroll_speed
IF l_x = 2 THEN DEC posx,scroll_speed
IF l_y = 1 THEN INC posy,scroll_speed
IF l_y = 2 THEN DEC posy,scroll_speed


IF posx > 0 THEN posx = 0
IF posy > 0 THEN posy = 0
IF posx < (0-(TS*MaxTX)) + GraphX THEN posx = (0-(TS*MaxTX)) + GraphX

IF posy < (0-(TS*MaxTY)) + GraphY THEN posy = (0-(TS*MaxTY)) + GraphY

gox = 0
goy = 0
ENDFUNCTION


FUNCTION getfps:

STATIC fps_time%,fps_counter%,fps%,fps_temp%
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

RETURN fps
ENDFUNCTION

SUB Konfig:

mainscreenx=1280               // breite des Bildschirms
mainscreeny=800                // höhe des Bildschirms
mainscreenfull=1               // Vollbild=1, Fenster=0
GraphX=1280                    // Bildschrim auflösung in die Variablen speichern
GraphY=800                     // Bildschrim auflösung in die Variablen speichern
LIMITFPS -1                    // Max Bildwiederholungsrate
MaxTX = 40                     // Title Anzahl (also Karten Größe) in der X Achse
MaxTY = 40                     // Title Anzahl (also Karten Größe) in der Y Achse
scroll_speed = 1               // Scroll Geschwindigkeit (1 = Weich)
TS = 64                        // Größe der Titles (Quads)

ENDSUB

SUB Daten:



ENDSUB








D2O

Hallo,
hier mal ein einfaches beispiel, fals ich Dich richtig verstanden habe.

Es wird ein einfaches Gitter gezeichnet das sich auf der X-Achse hin und her bewegt.
Die Mouse wird mit einem Roten Punkt gezeichnet.
Wenn nun dieser punkt innerhalb eines Gitters ist wird dort ein Kästchen gezeichnet.

Schau es Dir einfach mal an.

Code (glbasic) Select
GLOBAL mx,my,b1,b2,k,i,j,x,y

WHILE TRUE



MOUSESTATE mx,my,b1,b2

// bewegt das gitter

IF x <= 0 THEN k = 1
IF x >= 300 THEN k = -1

INC x,k

FOR i = 0 TO 5

FOR j = 0 TO 5

// zeichnet ein einfache gitter
DRAWLINE x+j * 32,y+i*32,x+j * 32 + 32,y+i*32 ,RGB(0x00, 0x80, 0xc0) // Horizontallinie
DRAWLINE x+j * 32,y+i*32,x+j * 32 ,y+i*32 + 32,RGB(0x00, 0x80, 0xc0) // Vertikallinie

// Ich denke der Teil hier ist für Dich Interessant fasl ich es richtig verstanden habe
/////////////////////////////////////////////////////////////////////////////////////////////////////
// zeichnet ein Rect wenn die mouse innerhalb des Gitter liegt
IF mx >= x+j * 32  AND mx <= x+j * 32 +32 AND my >= y+i * 32 AND my <= y+i * 32+32
DRAWRECT  x+j * 32,y+i*32,32,32 ,RGB(0x00, 0x80, 0xc0)
ENDIF
/////////////////////////////////////////////////////////////////////////////////////////////////////
NEXT
NEXT

DRAWRECT mx,my,3,3, RGB(0xff, 0x00, 0x00)  // Mouse



SHOWSCREEN
WEND



END
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Derb

Nicht so ganz aber des Pudels Kern wurde getroffen. Am besten verstehst du mich wenn du das Prog mal bei Dir laufen lassen würdest.

Ich habe mal ein Bildschirmfoto beigefügt.

Es stellt die Map dar die um ein paar pixel bewegt worden ist. Da wo du das rote Kreuz siehst ist mein Mauspfeil. In diesem Qadranten muss jetzt eigenlich das gelbe Kastel liegen. Ist es aber nicht weil meine Maus immer nur das 64 er Raster auf dem Schirm abfängt. Nicht aber das was real auf der Karte ist.



Danke für deine Antwort...

[attachment deleted by admin]

D2O

Hoffentlich liege ich nicht schon wieder etwas daneben :)

Oops , da kommt mir doch einiges an Code bekannt vor ;)
Ok. ich hab jetzt einfachmal das was ich meine in Deiner FOR NEXT anweisung eingesetzt.
Hier musste ich aber wieder ein RECT zeichnen, da ich ja keine Sprites von Dir habe. Einfach mit einem Draw befehl austauschen und anpassen.
Soll das ein Map Editor werden?
Dann sollte ja das Array auch mit laufen?

Hier Dein Code mit der Anpassung.

Code (glbasic) Select

// --------------------------------- //
// Project: Map Ed
// Start: Sunday, May 08, 2011
// IDE Version: 10.159



// Globale Variablen

GLOBAL mainscreenx%,mainscreeny%
GLOBAL GraphX%,GraphY%
GLOBAL gox%,goy%                         // Wird für Mapscrolling benötigt
GLOBAL MaxTX%                            // Tileanzahl in der Horizontalen
GLOBAL MaxTY%                           // Tileanzahl in der Vertikalen
GLOBAL TS%                              // Tilegrösse
GLOBAL level%[]
GLOBAL scroll_speed%                   // Scrollspeed
GLOBAL x%,y%,startx%,starty%,endx%,endy%   // Var für forschleife
GLOBAL posx%,posy%                           // Var für die scollposition
GLOBAL vposx%,vposy%                        // Virtuelle Karten Koordinaten



// Dimensionieren der Speicherfelder

DIM quad[100][100][50][50]


// Werte der Konfiguration auslesen

GOSUB Konfig



// Daten Auslesen

GOSUB Daten



// Screen und Fonts und Maus Konfigurieren

SETSCREEN mainscreenx, mainscreeny, mainscreenfull
LOADFONT "Grafik/fonts/smalfont.png", 1
SETFONT 0
SYSTEMPOINTER TRUE



// Laden der Grafiken in den Grafik Puffer
// RGB 255/0/128 <--- (Diese Farbe ist für GL Basic transparent)

LOADSPRITE "Grafik/map/64x64.bmp", 0      //Title Set
LOADSPRITE "Grafik/map/highlight.bmp",2     //Highligt


@Hauptschleife:
//-------------------------------------------------------------------------------------------------------------------------------------
// Hauptschleife Ende mit Esc ---------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------
REPEAT

updatefor()
scroll()
scrollmap(gox,goy)

FOR y = starty TO endy
    FOR x = startx TO endx
      DRAWSPRITE 0,posx+TS*x,posy+TS*y
     
     
     
/////////////////////////////////////////////////////////////////////////////////////////////////////
// zeichnet ein Rect wenn die mouse innerhalb des Gitter liegt

IF mx >= posx+x * 64 AND mx <= posx+x * 64 +64 AND my >= posy+y * 64 AND my <= posy+y * 64+64
DRAWRECT  posx+x * 64,posy+y*64,64,64 ,RGB(0x00, 0x80, 0xc0)
ENDIF     
    ///////////////////////////////////////////////////////////////////////////////////////////////////// 
     
     
      SETFONT 0
      PRINT "H:"+INTEGER(posx+TS*x),posx+TS*x,0+posy+TS*y // Nur zum austesten die Titles Beschriften
      PRINT "V:"+INTEGER(posy+TS*y),posx+TS*x,8+posy+TS*y // Nur zum austesten die Titles Beschriften
     
     
     
     
     
     
     
     
    NEXT
NEXT

virtualkoord()



SETFONT 1
MOUSESTATE mx, my, br, bl               // Aktuelle Mausposition speichern
mmx=mx ; mmy=my                         // Mausposition in zweitem Wert zwischenspeichern
vposx=INTEGER(ABS(posx)-TS*startx)      // Pixel Anzahl um die der Bildschirm verschoben ist in der X Achse
vposy=INTEGER(ABS(posy)-TS*starty)      // Pixel Anzahl um die der Bildschirm verschoben ist in der Y Achse
mx=mx-MOD(mx,TS);my=my-MOD(my,TS)       // Rasterung für die Markierung
PRINT "mmx"+mmx,100,30
PRINT "mx-vposx"+mx,100,42
mx=mx-vposx ; my=my-vposy               // Rasterung mit Korrigiertem Nullpunkt
PRINT "mx-vposx"+mx,100,54
DRAWSPRITE 2,mx,my



SHOWSCREEN



UNTIL KEY (01)
END
//-------------------------------------------------------------------------------------------------------------------------------------
// Hauptschleife Ende mit Esc ---------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------------



// Variablen für Forschleife updaten, enthält Globale variablen
FUNCTION updatefor:
   //Startwert für die forschleife
   startx = ABS(posx/TS)
   starty = ABS(posy/TS)

   //endwerte für die forschleife
   endx = startx +(GraphX/TS)
      IF endx > MaxTX THEN endx = MaxTX

   endy = starty +(GraphY/TS)+1   //+1 da man hier in einen Kommabereich reinkommt!
      IF endy > MaxTY THEN endy = MaxTY


ENDFUNCTION



FUNCTION virtualkoord:

// MOUSESTATE mx, my, br, bl
// mx=mx-MOD(mx,64);my=my-MOD(my,64)

// vposx=INTEGER(ABS(posx)-TS*startx) // Virtueller Nullpunkt Multiplikator in der X Achse
// vposy=INTEGER(ABS(posy)-TS*starty) // Virtueller Nullpunkt Multiplikator in der Y Achse

// vposx=mx-vposx
// vposy=my-vposy

ENDFUNCTION



// Für das scrolling mit der Maus und mit den Pfeiltasten
FUNCTION scroll:

MOUSESTATE mx, my, br, bl

IF mx < 1  AND posx < 0 // Nach Links mit der Maus
    gox = 1
ENDIF

IF mx > mainscreenx - 2 AND posx > GraphX-(TS*MaxTX) // Nach Rechts mit der Maus
    gox = 2
ENDIF

IF my > mainscreeny - 2 AND posy > GraphY-(TS*MaxTY) // Nach Unten mit der Maus
      goy = 2
ENDIF

IF my < 1 AND posy < 0 // Nach Oben mit der Maus
      goy = 1
ENDIF



IF KEY(203) // Links mit Pfeiltasten
    gox = 1
ENDIF

IF KEY(205) // Rechts mit Pfeiltasten
      gox = 2
ENDIF

IF KEY(208) // Runter mit Pfeiltasten
      goy = 2
ENDIF

IF KEY(200) // Hoch mit den Pfeiltasten
      goy = 1
ENDIF



ENDFUNCTION



FUNCTION scrollmap:l_x%,l_y%
   IF l_x = 1 THEN INC posx,scroll_speed
   IF l_x = 2 THEN DEC posx,scroll_speed
   IF l_y = 1 THEN INC posy,scroll_speed
   IF l_y = 2 THEN DEC posy,scroll_speed


   IF posx > 0 THEN posx = 0
   IF posy > 0 THEN posy = 0
   IF posx < (0-(TS*MaxTX)) + GraphX THEN posx = (0-(TS*MaxTX)) + GraphX

   IF posy < (0-(TS*MaxTY)) + GraphY THEN posy = (0-(TS*MaxTY)) + GraphY

   gox = 0
   goy = 0
ENDFUNCTION


FUNCTION getfps:

STATIC fps_time%,fps_counter%,fps%,fps_temp%
   fps_time = GETTIMERALL()
   fps_counter = fps_counter + 1
      IF (fps_time-fps_temp)>1000
            fps_temp = fps_time
            fps = fps_counter
            fps_counter = 0
      ENDIF

      RETURN fps
ENDFUNCTION

SUB Konfig:

mainscreenx=1280               // breite des Bildschirms
mainscreeny=800                // höhe des Bildschirms
mainscreenfull=1               // Vollbild=1, Fenster=0
GraphX=1280                    // Bildschrim auflösung in die Variablen speichern
GraphY=800                     // Bildschrim auflösung in die Variablen speichern
LIMITFPS -1                    // Max Bildwiederholungsrate
MaxTX = 40                     // Title Anzahl (also Karten Größe) in der X Achse
MaxTY = 40                     // Title Anzahl (also Karten Größe) in der Y Achse
scroll_speed = 1               // Scroll Geschwindigkeit (1 = Weich)
TS = 64                        // Größe der Titles (Quads)

ENDSUB

SUB Daten:



ENDSUB

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Derb

Ja der Code ist ein Schnipsel aus dem Forum. Warum das Rad zwei mal erfinden ;-)


Ich danke Dir 1000 mal.  :nw:

Derb

 Es funktioniert super. Habe es gerade getestet. Gerade noch rechzeitig denn ich war kurz vorm durchdrehen.

Nochmals vielen vielen Danke für deine Hilfe...


D2O

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kanonet

Nicht deine Frage, aber:
Code (glbasic) Select
LOADFONT "Grafik/fonts/smalfont.png", 1
SETFONT 0

Sollte doch ein Fehler sein?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Derb