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???
// --------------------------------- //
// 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
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.
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
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]
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.
// --------------------------------- //
// 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
Ja der Code ist ein Schnipsel aus dem Forum. Warum das Rad zwei mal erfinden ;-)
Ich danke Dir 1000 mal. :nw:
Es funktioniert super. Habe es gerade getestet. Gerade noch rechzeitig denn ich war kurz vorm durchdrehen.
Nochmals vielen vielen Danke für deine Hilfe...
Gern geschehen.
Nicht deine Frage, aber:
LOADFONT "Grafik/fonts/smalfont.png", 1
SETFONT 0
Sollte doch ein Fehler sein?
passt schon