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

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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
Dernière modification par Thyphoon le ven. 10/juin/2011 12:52, modifié 1 fois.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

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

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

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

Message 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...
Only PureBasic makes it possible
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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 !
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

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

Message par graph100 »

Je n'avais pas vu qu'on pouvais bouger avec les flèches :oops:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

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

Message 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 !
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

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

Message par Cool Dji »

Alors au final c'était quoi ?
Vendredi => trop fatigué pour comparer les 2 codes :mrgreen:
Only PureBasic makes it possible
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

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

Message 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)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre