Pas sûr que ce soit le bon endroit pour poster ça, mais allons-y (gaiement) :
Code : Tout sélectionner
;- TODOLIST
; zoom on cursor
Structure s_map
x.i
y.i
zoom.i
EndStructure
Structure s_grid
w.i
h.i
nbW.i
nbH.i
offsetX.i
offsetY.i
EndStructure
;------------------
Procedure DefineConstants()
#resoW = 800
#resoH = 800
#mapSize = 1024
#sectorSize = 64
#zoomInc = 1
#moveInc = 4
EndProcedure
Procedure DefineGlobals()
Global i.i, mouse.i
Global mmap.s_map, grid.s_grid
EndProcedure
Procedure DrawMouse()
mouse = CreateSprite(#PB_Any, 2, 2)
StartDrawing(SpriteOutput(mouse))
Box(0, 0, OutputWidth(), OutputHeight(), #White)
StopDrawing()
EndProcedure
Procedure DrawGrid()
grid\w = CreateSprite(#PB_Any, #resoW, 1)
grid\h = CreateSprite(#PB_Any, 1, #resoH)
StartDrawing(SpriteOutput(grid\w))
Box(0, 0, OutputWidth(), OutputHeight(), #White)
StopDrawing()
StartDrawing(SpriteOutput(grid\h))
Box(0, 0, OutputWidth(), OutputHeight(), #White)
StopDrawing()
EndProcedure
Procedure RecalculateGrid()
; clamp zoom
If mmap\x + #resoW > (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)
mmap\x = ((#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)) - #resoW
EndIf
If mmap\y + #resoH > (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)
mmap\y = ((#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)) - #resoH
EndIf
; grid positioning
grid\nbW = (mmap\x + #resoW) / (#sectorSize + mmap\zoom)
grid\nbH = (mmap\y + #resoH) / (#sectorSize + mmap\zoom)
grid\offsetX = Mod(-mmap\x, #sectorSize + mmap\zoom)
grid\offsetY = Mod(-mmap\y, #sectorSize + mmap\zoom)
EndProcedure
Procedure DisplayGrid()
For i = 0 To grid\nbW
DisplaySprite(grid\h, i * (#sectorSize + mmap\zoom) + grid\offsetX, 0)
Next i
For i = 0 To grid\nbH
DisplaySprite(grid\w, 0, i * (#sectorSize + mmap\zoom) + grid\offsetY)
Next i
EndProcedure
Procedure DisplayDebug()
StartDrawing(ScreenOutput())
DrawText(5, 5, "x: " + Str(mmap\x), #White)
DrawText(5, 20, "y: " + Str(mmap\y), #White)
DrawText(5, 35, "zoom: " + Str(mmap\zoom), #White)
StopDrawing()
EndProcedure
Procedure ManageKeyboard()
If KeyboardPushed(#PB_Key_Q)
If mmap\x - #moveInc >= 0
mmap\x - #moveInc
RecalculateGrid()
EndIf
EndIf
If KeyboardPushed(#PB_Key_D)
If mmap\x + #moveInc + #resoW <= (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)
mmap\x + #moveInc
RecalculateGrid()
EndIf
EndIf
If KeyboardPushed(#PB_Key_Z)
If mmap\y - #moveInc >= 0
mmap\y - #moveInc
RecalculateGrid()
EndIf
EndIf
If KeyboardPushed(#PB_Key_S)
If mmap\y + #moveInc + #resoH <= (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom)
mmap\y + #moveInc
RecalculateGrid()
EndIf
EndIf
If KeyboardPushed(#PB_Key_A)
If mmap\zoom - #zoomInc >= 0
mmap\zoom - #zoomInc
RecalculateGrid()
EndIf
EndIf
If KeyboardPushed(#PB_Key_E)
mmap\zoom + #zoomInc
RecalculateGrid()
EndIf
EndProcedure
Procedure ManageMouse()
If MouseButton(#PB_MouseButton_Right) And MouseDeltaX() <> 0
If mmap\x + MouseDeltaX() + #resoW <= (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom) And mmap\x + MouseDeltaX() > 0
mmap\x + MouseDeltaX()
RecalculateGrid()
EndIf
EndIf
If MouseButton(#PB_MouseButton_Right) And MouseDeltaY() <> 0
If mmap\y + MouseDeltaY() + #resoH <= (#mapSize / #sectorSize) * (#sectorSize + mmap\zoom) And mmap\y + MouseDeltaY() > 0
mmap\y + MouseDeltaY()
RecalculateGrid()
EndIf
EndIf
If MouseWheel() > 0
mmap\zoom + #zoomInc
RecalculateGrid()
ElseIf MouseWheel() < 0
If mmap\zoom - #zoomInc >= 0
mmap\zoom - #zoomInc
RecalculateGrid()
EndIf
EndIf
EndProcedure
;------------------
DefineConstants() : DefineGlobals()
InitSprite() : InitKeyboard() : InitMouse()
OpenWindow(0, 0, 0, #resoW, #resoH, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, #resoW, #resoH)
KeyboardMode(#PB_Keyboard_International)
DrawMouse()
DrawGrid() : RecalculateGrid()
Repeat
While WindowEvent() : Wend
ExamineMouse() : ManageMouse()
ExamineKeyboard() : ManageKeyboard()
ClearScreen(0)
DisplayGrid()
DisplayDebug() ; perf
DisplaySprite(mouse, MouseX(), MouseY())
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
A priori, le résultat n'est pas trop mal, mais mon problème concerne le zoom. J'aimerais qu'il soit effectué sur le curseur de la souris, et comme d'habitude avec les caméras et autres scrolling, c'est la partie à laquelle je pige rien !
Donc la question est : kommen-kon-fait ?