Page 1 sur 1

problème coordonée du Tile sous le curseur [résolu]

Publié : ven. 10/juin/2011 11:46
par Thyphoon
Il y a des fois comme ça ou j'ai beau recommencer tout a zero 100 fois, j'y arrive pas je trouve pas ...
Voici un code tout bête avec une map dont le personnage sera toujours au centre de l’écran avec un scrolling classique
Hors j'ai besoin d'avoir les coordonnées du tile sous le curseur, jusqu’à présent j'avais pas eu de souci ... mais voilà j'ai besoin aussi des coordonnées négatif... et là ça se complique
tout ce qui est positif est bon, mais pas ce qui est négatif

mais rien ne vaut un code plutôt qu'un long discourt. passer le curseur sur les tiles au tour du center de l'ecran. les coordonées calculer sont marqué en haut de l'ecran (mouseX et mouseY)

le calcul des coordonnées du tile sous le curseur est a la ligne 59,60 ! si vous avez une idée je suis plus que preneur ... car ça fait 2 jours que je sèche là dessus.

Merci d'avance ...

Code : Tout sélectionner

screenPixelWidth=1024
screenPixelheight=600
spriteSize=64
backgroundColor=#White

If InitSprite() And InitSprite3D() And InitSound() And InitNetwork()
  If InitKeyboard() And InitMouse()
    winMain = OpenWindow(#PB_Any,0,0,screenPixelWidth,screenPixelHeight,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(winMain), 0, 0,screenPixelWidth,screenPixelHeight, 1, 0, 0)
    UsePNGImageDecoder()
    UseJPEGImageDecoder()
    SetFrameRate(60)
  EndIf
Else
  MessageRequester("","Unable to initsprite") :
EndIf

Repeat
  Delay(1)
  EventID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  tileWidth=Int(screenPixelWidth/spriteSize)+1
  tileHeight=Int(screenPixelWidth/spriteSize)+1
  
  If KeyboardPushed(#PB_Key_Left)
        rx=rx-1  
  EndIf
  If KeyboardPushed(#PB_Key_Right)
        rx=rx+1  
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
        ry=ry-1  
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
        ry=ry+1  
  EndIf
  
  focusTileX=Int(rx/spriteSize)
  focusTileY=Int(ry/spriteSize)
  deltaX=rx-focusTileX*spriteSize
  deltaY=ry-focusTileY*spriteSize
  ;coordonée du centre de l'ecran en pixel
  centerScreenX=screenPixelWidth/2
  centerScreenY=screenPixelHeight/2
  ;coordonée du centre d el'ecran en tile
  centerTileX=Int(centerScreenX/spriteSize)
  centerTileY=Int(centerScreenY/spriteSize)
  
  ;décalage qu'il y a du fait d'une position par rapport au centre de l'ecran
  GDeltaX=centerScreenX-Int(centerScreenX/spriteSize)*spriteSize
  GDeltaY=centerScreenY-Int(centerScreenY/spriteSize)*spriteSize
  
  ;Calcul du Tile sous le curseur
  cursX=focusTileX+Int((MouseX()-centerScreenX)/spritesize)
  cursY=focusTileY+Int((MouseY()-centerScreenY)/spritesize)
  
  For x=-1 To  tileWidth
    For y=-1 To tileHeight
      tx=x*spriteSize-deltaX+GDeltaX
      ty=y*spriteSize-deltaY+GDeltaY
      Box(tx,ty,spriteSize-1,spriteSize-1,#Green)
      DrawText(tx+2,ty+2,Str(x+focusTileX-centerTileX)+" "+Str(y+focusTileY-centerTileY))
    Next
  Next
  
   DrawText(20,20," MouseX:"+Str(cursX)+" MouseY:"+Str(cursY)+" cx:"+Str(focusTileX)+" cy:"+Str(focusTileY)+" size:"+Str(focusTileY))
   Circle(MouseX(),MouseY(),4,#Red)
   Circle(centerScreenX,centerScreenY,4,#Black)
   StopDrawing()
   FlipBuffers()
  Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow

Re: problème coordonée du Tile sous le curseur

Publié : ven. 10/juin/2011 12:02
par graph100
Réjouis toi, car ton problème est résolu : Tu utilises la fonction Int() pour arrondir, ce qui tronque la partie décimale.
Donc 0.5 donne 0, de même avec -0.5 !!!

Utilise plutôt Round(), avec l'option #pb_round_down :

Code : Tout sélectionner

screenPixelWidth=1024
screenPixelheight=600
spriteSize=64
backgroundColor=#White

If InitSprite() And InitSprite3D() And InitSound() And InitNetwork()
  If InitKeyboard() And InitMouse()
    winMain = OpenWindow(#PB_Any,0,0,screenPixelWidth,screenPixelHeight,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(winMain), 0, 0,screenPixelWidth,screenPixelHeight, 1, 0, 0)
    UsePNGImageDecoder()
    UseJPEGImageDecoder()
    SetFrameRate(60)
  EndIf
Else
  MessageRequester("","Unable to initsprite") :
EndIf

Repeat
  Delay(1)
  EventID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  tileWidth=Int(screenPixelWidth/spriteSize)+1
  tileHeight=Int(screenPixelWidth/spriteSize)+1
 
  If KeyboardPushed(#PB_Key_Left)
        rx=rx-1 
  EndIf
  If KeyboardPushed(#PB_Key_Right)
        rx=rx+1 
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
        ry=ry-1 
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
        ry=ry+1 
  EndIf
 
  focusTileX=Int(rx/spriteSize)
  focusTileY=Int(ry/spriteSize)
  deltaX=rx-focusTileX*spriteSize
  deltaY=ry-focusTileY*spriteSize
  ;coordonée du centre de l'ecran en pixel
  centerScreenX=screenPixelWidth/2
  centerScreenY=screenPixelHeight/2
  ;coordonée du centre d el'ecran en tile
  centerTileX=Int(centerScreenX/spriteSize)
  centerTileY=Int(centerScreenY/spriteSize)
 
  ;décalage qu'il y a du fait d'une position par rapport au centre de l'ecran
  GDeltaX=centerScreenX-Int(centerScreenX/spriteSize)*spriteSize
  GDeltaY=centerScreenY-Int(centerScreenY/spriteSize)*spriteSize
 
  ;Calcul du Tile sous le curseur
;   cursX=focusTileX+Int((MouseX()-centerScreenX)/spritesize)
;   cursY=focusTileY+Int((MouseY()-centerScreenY)/spritesize)
  cursX = focusTileX + Round((MouseX() - centerScreenX) / spritesize, #PB_Round_Down)
  cursY = focusTileY + Round((MouseY() - centerScreenY) / spritesize, #PB_Round_Down)
 
  For x=-1 To  tileWidth
    For y=-1 To tileHeight
      tx=x*spriteSize-deltaX+GDeltaX
      ty=y*spriteSize-deltaY+GDeltaY
      Box(tx,ty,spriteSize-1,spriteSize-1,#Green)
      DrawText(tx+2,ty+2,Str(x+focusTileX-centerTileX)+" "+Str(y+focusTileY-centerTileY))
    Next
  Next
 
   DrawText(20,20," MouseX:"+Str(cursX)+" MouseY:"+Str(cursY)+" cx:"+Str(focusTileX)+" cy:"+Str(focusTileY)+" size:"+Str(focusTileY))
   Circle(MouseX(),MouseY(),4,#Red)
   Circle(centerScreenX,centerScreenY,4,#Black)
   StopDrawing()
   FlipBuffers()
  Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow

Re: problème coordonée du Tile sous le curseur

Publié : ven. 10/juin/2011 12:15
par Thyphoon
merci beaucoup graph100... :)
effectivement ça marche bien ... tant que tu bouges pas trop la carte. :wink:
Si tu positionnes le curseur dans une une case négative (en X) et que tu bouges la carte avec les flèches...regarde bien quand change la valeur de MouseX(), c'est pas au bon moment .. :P

Re: problème coordonée du Tile sous le curseur

Publié : ven. 10/juin/2011 12:31
par Cool Dji
Salut Thyphon,

Effectivement, j'ai pas la solution mais j'ai observé que :
- sans bouger la carte, ya pas de décalage.
- tu bouges la carte sur les X et là il y a un décalage
- tu reviens à la position initiale (case O,O) au milieu, il y a encore le décalage...

Re: problème coordonée du Tile sous le curseur

Publié : ven. 10/juin/2011 12:44
par Thyphoon
Cool Dji a écrit :Salut Thyphon,

Effectivement, j'ai pas la solution mais j'ai observé que :
- sans bouger la carte, ya pas de décalage.
- tu bouges la carte sur les X et là il y a un décalage
- tu reviens à la position initiale (case O,O) au milieu, il y a encore le décalage...
oui c'est curieux ... merci d'avoir regarder ! je m'arrache les cheveux depuis 2 jours sur un truc qui me parait au premier abord super simple ...lolllll j'ai l'impression que plus le temps passe plus mes neurones ramollissent !

Re: problème coordonée du Tile sous le curseur

Publié : ven. 10/juin/2011 12:52
par Thyphoon
super c'est bon j'ai trouvé, et merci a graph100 qui a fait un peu plus que me mettre sur la voix

Code : Tout sélectionner

screenPixelWidth=1024
screenPixelheight=600
spriteSize=64
backgroundColor=#White

If InitSprite() And InitSprite3D() And InitSound() And InitNetwork()
  If InitKeyboard() And InitMouse()
    winMain = OpenWindow(#PB_Any,0,0,screenPixelWidth,screenPixelHeight,"Press [Esc] to close",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    OpenWindowedScreen(WindowID(winMain), 0, 0,screenPixelWidth,screenPixelHeight, 1, 0, 0)
    UsePNGImageDecoder()
    UseJPEGImageDecoder()
    SetFrameRate(60)
  EndIf
Else
  MessageRequester("","Unable to initsprite") :
EndIf

Repeat
  Delay(1)
  EventID = WindowEvent()
  ExamineKeyboard()
  ExamineMouse()
  ClearScreen(0)
  StartDrawing(ScreenOutput())
  tileWidth=Int(screenPixelWidth/spriteSize)+1
  tileHeight=Int(screenPixelWidth/spriteSize)+1
 
  If KeyboardPushed(#PB_Key_Left)
        rx=rx-1 
  EndIf
  If KeyboardPushed(#PB_Key_Right)
        rx=rx+1 
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
        ry=ry-1 
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
        ry=ry+1 
  EndIf
 
  focusTileX=Int(rx/spriteSize)
  focusTileY=Int(ry/spriteSize)
  deltaX=rx-focusTileX*spriteSize
  deltaY=ry-focusTileY*spriteSize
  ;coordonée du centre de l'ecran en pixel
  centerScreenX=screenPixelWidth/2
  centerScreenY=screenPixelHeight/2
  ;coordonée du centre d el'ecran en tile
  centerTileX=Int(centerScreenX/spriteSize)
  centerTileY=Int(centerScreenY/spriteSize)
 
  ;décalage qu'il y a du fait d'une position par rapport au centre de l'ecran
  GDeltaX=centerScreenX-Int(centerScreenX/spriteSize)*spriteSize
  GDeltaY=centerScreenY-Int(centerScreenY/spriteSize)*spriteSize
 
  ;Calcul du Tile sous le curseur
  cursX=focusTileX+Round((MouseX()-centerScreenX+deltaX)/spritesize,#PB_Round_Down)
  cursY=focusTileY+Round((MouseY()-centerScreenY+deltaY)/spritesize,#PB_Round_Down)
 
  For x=-1 To  tileWidth
    For y=-1 To tileHeight
      tx=x*spriteSize-deltaX+GDeltaX
      ty=y*spriteSize-deltaY+GDeltaY
      Box(tx,ty,spriteSize-1,spriteSize-1,#Green)
      DrawText(tx+2,ty+2,Str(x+focusTileX-centerTileX)+" "+Str(y+focusTileY-centerTileY))
    Next
  Next
 
   DrawText(20,20," MouseX:"+Str(cursX)+" MouseY:"+Str(cursY)+" cx:"+Str(focusTileX)+" cy:"+Str(focusTileY)+" size:"+Str(focusTileY))
   Circle(MouseX(),MouseY(),4,#Red)
   Circle(centerScreenX,centerScreenY,4,#Black)
   StopDrawing()
   FlipBuffers()
  Until KeyboardReleased(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow

Re: problème coordonée du Tile sous le curseur [résolu]

Publié : ven. 10/juin/2011 14:06
par graph100
Je n'avais pas vu qu'on pouvais bouger avec les flèches :oops:

Re: problème coordonée du Tile sous le curseur [résolu]

Publié : ven. 10/juin/2011 14:31
par Thyphoon
graph100 a écrit :Je n'avais pas vu qu'on pouvais bouger avec les flèches :oops:
lollllll je crois que tu es pardonné ! :wink:
Merci pour le coup de main !

Re: problème coordonée du Tile sous le curseur [résolu]

Publié : ven. 10/juin/2011 16:09
par Cool Dji
Alors au final c'était quoi ?
Vendredi => trop fatigué pour comparer les 2 codes :mrgreen:

Re: problème coordonée du Tile sous le curseur [résolu]

Publié : ven. 10/juin/2011 17:23
par graph100
bah il avait oublié de soustraire l'offset ajouté par le déplacement au clavier ^^
Thyphoon a écrit : cursX=focusTileX+Round((MouseX()-centerScreenX+deltaX)/spritesize,#PB_Round_Down)
cursY=focusTileY+Round((MouseY()-centerScreenY+deltaY)/spritesize,#PB_Round_Down)