Une simple map avec zoom

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Une simple map avec zoom

Message par Thyphoon »

Hello,

ça fait toujours du bien de revenir ici :P
Je débute mes vacances et j'éspère bien me remettre a programmer... Mais a pas pratiqué qu'est ce qu'on perd ... 8O

C'est pas la première fois que je developpe un moteur pour afficher une map a l'écran... mais là j'ai un bug et je n'arrive pas a trouver.

Normalement je devrais toujours avoir la map qui remplit l'ecran. mais dans certain cas, il manque une ligne...

Voici le code et j'ai directement le zoom et la position qui montre le bug. La ligne ne s'affiche pas en haut
Après vous pouvez zoomer, avec [+] et [-] et vous déplacer avec les flèches. Espace permet d'afficher dans le debugger les valeurs des variables...

ça doit être un truc tout con... :oops: Si quelqu'un a la solution voir même juste une piste je suis preneur ...

Merci d'avance :wink:

Thyphoon (de nouveau débutant :roll: )


Code : Tout sélectionner

EnableExplicit
#FRAME_RATE_RENDERING = 60

If InitKeyboard()=0 Or InitSprite() = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
  End
EndIf

Structure Game
  ScreenWidth_Pixel.l
  ScreenHeight_Pixel.l
  
  RealTileSize_Pixel.l
  Zoom.f
EndStructure

Global Game.Game
Game\ScreenWidth_Pixel=1024
Game\ScreenHeight_Pixel=768

Game\RealTileSize_Pixel=64

Define.l RealX,RealY
Game\Zoom=4
RealY=-56



If OpenWindow(0, 0, 0, Game\ScreenWidth_Pixel, Game\ScreenHeight_Pixel, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 0, 0, Game\ScreenWidth_Pixel, Game\ScreenHeight_Pixel,0,0,0,#PB_Screen_NoSynchronization)=#False
    MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
    End
  EndIf
EndIf


Define Event.i ;All Windows Event

Repeat
  ; Il est très important de traiter tous les évènements restants dans la file d'attente à chaque tour
  ;
  Repeat
    Event = WindowEvent()
    
    Select Event 
      Case #PB_Event_Gadget
        
      Case #PB_Event_CloseWindow
        End 
    EndSelect
  Until Event = 0
  
  ; Frame Rate
  Define.i LPS,LPS_C,LPS_T,CheckTime; = ElapsedMilliseconds()
  Define.l FPS,FPS_C
  If LPS_T < ElapsedMilliseconds()
    LPS_T = ElapsedMilliseconds() + 1000
    LPS = LPS_C
    FPS = FPS_C
    LPS_C = 0
    FPS_C = 0
  Else
    LPS_C + 1
  EndIf
  
  
 
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Add)
    Game\Zoom=Game\Zoom+0.125
  EndIf
  
  If KeyboardPushed(#PB_Key_Subtract)
    Game\Zoom=Game\Zoom-0.125
  EndIf
  

  If KeyboardPushed(#PB_Key_Left)
    RealX=RealX-1
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    RealX=RealX+1
  EndIf
  
  If KeyboardPushed(#PB_Key_Up)
    RealY=RealY-1
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)
    RealY=RealY+1
  EndIf
  ;Control Frame Rate
  If (ElapsedMilliseconds() > CheckTime + 1000 / #FRAME_RATE_RENDERING)
    CheckTime = ElapsedMilliseconds() 
    
     FPS_C + 1
     
     Define.l TileSize_Screen_Pixel
     Define.l ScreenWidth_Tile, ScreenHeight_Tile     
     Define.f TileDeltaH_Screen_Tile,TileDeltaV_Screen_Tile
     Define.f TileDeltaH_Screen_Pixel,TileDeltaV_Screen_Pixel
     Define.f CenterX_Screen_Pixel,CenterY_Screen_Pixel
     Define.f CenterX_Screen_Tile,CenterY_Screen_Tile
    ClearScreen(RGB(0, 0, 0))
    TileSize_Screen_Pixel=Game\RealTileSize_Pixel*Game\Zoom
    
    ScreenWidth_Tile=Round(Game\ScreenWidth_Pixel/TileSize_Screen_Pixel,#PB_Round_Up )+1
    ScreenHeight_Tile=Round(Game\ScreenHeight_Pixel/TileSize_Screen_Pixel,#PB_Round_Up )+1
    

    TileDeltaH_Screen_Tile=Int(RealX/Game\RealTileSize_Pixel)
    TileDeltaV_Screen_Tile=Int(RealY/Game\RealTileSize_Pixel)
    
    TileDeltaH_Screen_Pixel=(RealX-(TileDeltaH_Screen_Tile * Game\RealTileSize_Pixel))*Game\Zoom
    TileDeltaV_Screen_Pixel=(RealY-(TileDeltaV_Screen_Tile * Game\RealTileSize_Pixel))*Game\Zoom
    
    CenterX_Screen_Pixel=Int(Game\ScreenWidth_Pixel/2)
    CenterY_Screen_Pixel=Int(Game\ScreenHeight_Pixel/2)
    
    CenterX_Screen_Tile=Round(ScreenWidth_Tile/2,#PB_Round_Up)
    CenterY_Screen_Tile=Round(ScreenHeight_Tile/2,#PB_Round_Up)    
 
    
    
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
    Define.l TileV,TileH
    For TileV=0 To  ScreenHeight_Tile
      For TileH=0 To ScreenWidth_Tile
        Define.l TileX_Screen_Pixel,TileY_Screen_Pixel
        
        TileX_Screen_Pixel=CenterX_Screen_Pixel-CenterX_Screen_Tile*TileSize_Screen_Pixel-TileDeltaH_Screen_Pixel+(TileH*TileSize_Screen_Pixel)
        TileY_Screen_Pixel=CenterY_Screen_Pixel-CenterY_Screen_Tile*TileSize_Screen_Pixel-TileDeltaV_Screen_Pixel+(TileV*TileSize_Screen_Pixel)
        
        Define.l TileX_Real_Tile,TileY_Real_Tile
        TileX_Real_Tile=TileH+TileDeltaH_Screen_Tile-CenterX_Screen_Tile
        TileY_Real_Tile=TileV+TileDeltaV_Screen_Tile-CenterY_Screen_Tile
        Box(TileX_Screen_Pixel,TileY_Screen_Pixel,TileSize_Screen_Pixel,TileSize_Screen_Pixel,#Red)
        DrawText(TileX_Screen_Pixel,TileY_Screen_Pixel,Str(TileX_Real_Tile)+","+Str(TileY_Real_Tile),#White)
         DrawText(TileX_Screen_Pixel,TileY_Screen_Pixel+12,Str(TileH),#Red)
      Next
    Next
        If KeyboardReleased(#PB_Key_Space)
      Debug "-------"
      Debug "TileSize_Screen_Pixel:"+Str(TileSize_Screen_Pixel)
      Debug "ScreenWidth_Tile:"+Str(ScreenWidth_Tile)
      Debug "ScreenHeight_Tile:"+Str(ScreenHeight_Tile)
      Debug "TileDeltaH_Screen_Tile:"+Str(TileDeltaH_Screen_Tile)
      Debug "TileDeltaV_Screen_Tile:"+Str(TileDeltaV_Screen_Tile)
      Debug "Game\Zoom:"+StrF(Game\Zoom)
      Debug "RealX:"+Str(RealX)
      Debug "RealY:"+Str(RealY)
      Debug "CenterX_Screen_Pixel:"+CenterX_Screen_Pixel
      Debug "CenterX_Screen_Pixel:"+CenterY_Screen_Pixel
      Debug "CenterX_Screen_Tile"+StrF(CenterX_Screen_Tile)
      Debug "CenterY_Screen_Tile"+StrF(CenterY_Screen_Tile)
      Debug "ScreenWidth_Tile:"+Str(ScreenWidth_Tile)
      Debug "ScreenHeight_Tile:"+Str(ScreenHeight_Tile)
      Debug "TileDeltaH_Screen_Pixel:"+StrF(TileDeltaH_Screen_Pixel)
      Debug "TileDeltaV_Screen_Pixel:"+StrF(TileDeltaV_Screen_Pixel)
      TileH=0
      Debug "TileV=0 TileX_Screen_Pixel:"+Str(CenterX_Screen_Pixel-CenterX_Screen_Tile*TileSize_Screen_Pixel-TileDeltaH_Screen_Pixel+(TileH*TileSize_Screen_Pixel))
      TileV=0
       Debug "TileV=0 TileY_Screen_Pixel:"+Str(CenterY_Screen_Pixel-CenterY_Screen_Tile*TileSize_Screen_Pixel-TileDeltaV_Screen_Pixel+(TileV*TileSize_Screen_Pixel))
    EndIf  
    
    Circle(CenterX_Screen_Pixel,CenterY_Screen_Pixel,3,#Green)
    DrawText(10,90,"Loop per second : "+Str(LPS),$5A5A5A)
    DrawText(10,130,"Frame rate : "+Str(FPS),$5A5A5A)
    DrawText(10,10,"ScreenWidth_Tile:"+StrF(ScreenWidth_Tile),$eeeeee)
    DrawText(10,20,"ScreenHeight_Tile:"+StrF(ScreenHeight_Tile),$eeeeee)
    StopDrawing()
    FlipBuffers() 
  EndIf          
  Delay(1)
ForEver

boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Une simple map avec zoom

Message par boby »

Je me suis permis de sortir tes define de tes boucle repeat (que je me suis permis de réduire à une) par-ce que définir tes variables à chaque boucles c'est pas très utile.
J'ai trouvé ton bug mais pas sa cause car je t'avoue que j'ai un peut de mal à lire ton code, je t'ai placé les débug qu'il faut pour te montrer pourquoi ton bug.

Code : Tout sélectionner

EnableExplicit
#FRAME_RATE_RENDERING = 60

If InitKeyboard()=0 Or InitSprite() = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
  End
EndIf

Structure Game
  ScreenWidth_Pixel.l
  ScreenHeight_Pixel.l
 
  RealTileSize_Pixel.l
  Zoom.f
EndStructure

Global Game.Game
Game\ScreenWidth_Pixel=1024
Game\ScreenHeight_Pixel=768

Game\RealTileSize_Pixel=64

Define.l RealX,RealY
Game\Zoom=4
RealY=-56

 Define.l TileSize_Screen_Pixel
 Define.l ScreenWidth_Tile, ScreenHeight_Tile     
 Define.f TileDeltaH_Screen_Tile,TileDeltaV_Screen_Tile
 Define.f TileDeltaH_Screen_Pixel,TileDeltaV_Screen_Pixel
 Define.f CenterX_Screen_Pixel,CenterY_Screen_Pixel
 Define.f CenterX_Screen_Tile,CenterY_Screen_Tile
 Define.l TileX_Screen_Pixel,TileY_Screen_Pixel
 Define.l TileX_Real_Tile,TileY_Real_Tile
 Define.l TileV,TileH
If OpenWindow(0, 0, 0, Game\ScreenWidth_Pixel, Game\ScreenHeight_Pixel, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0), 0, 0, Game\ScreenWidth_Pixel, Game\ScreenHeight_Pixel,0,0,0,#PB_Screen_NoSynchronization)=#False
    MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
    End
  EndIf
EndIf


Define Event.i ;All Windows Event

Repeat
  ; Il est très important de traiter tous les évènements restants dans la file d'attente à chaque tour
  ;

 
  ; Frame Rate
  Define.i LPS,LPS_C,LPS_T,CheckTime; = ElapsedMilliseconds()
  Define.l FPS,FPS_C
  If LPS_T < ElapsedMilliseconds()
    LPS_T = ElapsedMilliseconds() + 1000
    LPS = LPS_C
    FPS = FPS_C
    LPS_C = 0
    FPS_C = 0
  Else
    LPS_C + 1
  EndIf
 
 

  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Add)
    Game\Zoom=Game\Zoom+0.125
  EndIf
 
  If KeyboardPushed(#PB_Key_Subtract)
    Game\Zoom=Game\Zoom-0.125
  EndIf
 

  If KeyboardPushed(#PB_Key_Left)
    RealX-1
  EndIf
 
  If KeyboardPushed(#PB_Key_Right)
    RealX+1
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
    RealY-1
  EndIf
 
  If KeyboardPushed(#PB_Key_Down)
    RealY+1
  EndIf
  ;Control Frame Rate
  If (ElapsedMilliseconds() > CheckTime + 1000 / #FRAME_RATE_RENDERING)
    CheckTime = ElapsedMilliseconds()
   
     FPS_C + 1
     

    ClearScreen(RGB(0, 0, 0))
    TileSize_Screen_Pixel=Game\RealTileSize_Pixel*Game\Zoom
   
    ScreenWidth_Tile=Round(Game\ScreenWidth_Pixel/TileSize_Screen_Pixel,#PB_Round_Up )+1
    ScreenHeight_Tile=Round(Game\ScreenHeight_Pixel/TileSize_Screen_Pixel,#PB_Round_Up )+1
   

    TileDeltaH_Screen_Tile=Int(RealX/Game\RealTileSize_Pixel)
    TileDeltaV_Screen_Tile=Int(RealY/Game\RealTileSize_Pixel)
   
    TileDeltaH_Screen_Pixel=(RealX-(TileDeltaH_Screen_Tile * Game\RealTileSize_Pixel))*Game\Zoom
    TileDeltaV_Screen_Pixel=(RealY-(TileDeltaV_Screen_Tile * Game\RealTileSize_Pixel))*Game\Zoom
   
    CenterX_Screen_Pixel=Int(Game\ScreenWidth_Pixel/2)
    CenterY_Screen_Pixel=Int(Game\ScreenHeight_Pixel/2)
   
    CenterX_Screen_Tile=Round(ScreenWidth_Tile/2,#PB_Round_Up)
    CenterY_Screen_Tile=Round(ScreenHeight_Tile/2,#PB_Round_Up)   

   
   
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_Transparent)
    
    For TileV=0 To  ScreenHeight_Tile
      For TileH=0 To ScreenWidth_Tile
       
        TileX_Screen_Pixel=CenterX_Screen_Pixel- CenterX_Screen_Tile * TileSize_Screen_Pixel- TileDeltaH_Screen_Pixel+(TileH*TileSize_Screen_Pixel)
        TileY_Screen_Pixel=CenterY_Screen_Pixel-CenterY_Screen_Tile*TileSize_Screen_Pixel-TileDeltaV_Screen_Pixel+(TileV*TileSize_Screen_Pixel)
        If TileX_Screen_Pixel = -256 : Debug "1:"+CenterX_Screen_Pixel : Debug "2:"+CenterX_Screen_Tile : Debug "3:"+TileSize_Screen_Pixel
          Debug "4:"+TileDeltaH_Screen_Pixel : Debug "5:"+Str(TileH*TileSize_Screen_Pixel) : EndIf
        
        TileX_Real_Tile=TileH+TileDeltaH_Screen_Tile-CenterX_Screen_Tile
        TileY_Real_Tile=TileV+TileDeltaV_Screen_Tile-CenterY_Screen_Tile
        Box(TileX_Screen_Pixel,TileY_Screen_Pixel,TileSize_Screen_Pixel,TileSize_Screen_Pixel,#Red)
        DrawText(TileX_Screen_Pixel,TileY_Screen_Pixel,Str(TileX_Real_Tile)+","+Str(TileY_Real_Tile),#White)
         DrawText(TileX_Screen_Pixel,TileY_Screen_Pixel+12,Str(TileH),#Red)
      Next
    Next
        If KeyboardReleased(#PB_Key_Space)
      Debug "-------"
      Debug "TileSize_Screen_Pixel:"+Str(TileSize_Screen_Pixel)
      Debug "ScreenWidth_Tile:"+Str(ScreenWidth_Tile)
      Debug "ScreenHeight_Tile:"+Str(ScreenHeight_Tile)
      Debug "TileDeltaH_Screen_Tile:"+Str(TileDeltaH_Screen_Tile)
      Debug "TileDeltaV_Screen_Tile:"+Str(TileDeltaV_Screen_Tile)
      Debug "Game\Zoom:"+StrF(Game\Zoom)
      Debug "RealX:"+Str(RealX)
      Debug "RealY:"+Str(RealY)
      Debug "CenterX_Screen_Pixel:"+CenterX_Screen_Pixel
      Debug "CenterX_Screen_Pixel:"+CenterY_Screen_Pixel
      Debug "CenterX_Screen_Tile"+StrF(CenterX_Screen_Tile)
      Debug "CenterY_Screen_Tile"+StrF(CenterY_Screen_Tile)
      Debug "ScreenWidth_Tile:"+Str(ScreenWidth_Tile)
      Debug "ScreenHeight_Tile:"+Str(ScreenHeight_Tile)
      Debug "TileDeltaH_Screen_Pixel:"+StrF(TileDeltaH_Screen_Pixel)
      Debug "TileDeltaV_Screen_Pixel:"+StrF(TileDeltaV_Screen_Pixel)
      TileH=0
      Debug "TileV=0 TileX_Screen_Pixel:"+Str(CenterX_Screen_Pixel-CenterX_Screen_Tile*TileSize_Screen_Pixel-TileDeltaH_Screen_Pixel+(TileH*TileSize_Screen_Pixel))
      TileV=0
       Debug "TileV=0 TileY_Screen_Pixel:"+Str(CenterY_Screen_Pixel-CenterY_Screen_Tile*TileSize_Screen_Pixel-TileDeltaV_Screen_Pixel+(TileV*TileSize_Screen_Pixel))
    EndIf 
   
    Circle(CenterX_Screen_Pixel,CenterY_Screen_Pixel,3,#Green)
    DrawText(10,90,"Loop per second : "+Str(LPS),$5A5A5A)
    DrawText(10,130,"Frame rate : "+Str(FPS),$5A5A5A)
    DrawText(10,10,"ScreenWidth_Tile:"+StrF(ScreenWidth_Tile),$eeeeee)
    DrawText(10,20,"ScreenHeight_Tile:"+StrF(ScreenHeight_Tile),$eeeeee)
    StopDrawing()
    FlipBuffers()
  EndIf         
  Delay(1)
Until WindowEvent() = #PB_Event_CloseWindow
En gros, dans le cas où ton bug se produit, ta box de la première ligne (qui ne s'affiche pas) est en x = -256 et fait 256 de long, donc elle est hors écran.
Bonne recherche !

Si je peut me permettre quelques petits conseils :
-A ta place je ne redessinerai ma map qu'en cas de modification (appuis sur un touche), ça flingue des CPU ton truc.
-SetFrameRate()
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Une simple map avec zoom

Message par Thyphoon »

Merci body

Je vais etudier ça... :)
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Une simple map avec zoom

Message par zaphod_b »

Salut,

En modifiant ces lignes ( 112-113 ) , ca semble marcher :

Code : Tout sélectionner

TileDeltaH_Screen_Tile=Round(RealX/Game\RealTileSize_Pixel,#PB_Round_Up)-1
TileDeltaV_Screen_Tile=Round(RealY/Game\RealTileSize_Pixel,#PB_Round_Up)-1
Avatar de l’utilisateur
Thyphoon
Messages : 2697
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Une simple map avec zoom

Message par Thyphoon »

zaphod_b a écrit :Salut,

En modifiant ces lignes ( 112-113 ) , ca semble marcher :

Code : Tout sélectionner

TileDeltaH_Screen_Tile=Round(RealX/Game\RealTileSize_Pixel,#PB_Round_Up)-1
TileDeltaV_Screen_Tile=Round(RealY/Game\RealTileSize_Pixel,#PB_Round_Up)-1
Chapeau bas. J'avais réussi a corriger avec les infos de boby, mais c'était plus complexe que ça :P

Merci a vous deux :D
Répondre