Page 1 sur 1

Jeu de Puzzle Windows & Linux

Publié : dim. 24/févr./2008 14:14
par Thyphoon
Je suis en train de faire un petit jeu de Puzzle pour mon fils qui a 3 ans.
ça marche très bien sous windows, mais pas sous linux (testé avec 4.10 et 4.20beta) vous avez une idée pourquoi ?
il faut un répertoire appeler "Images" et y placer une image Jpeg

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0 Or InitSound()=0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

Global ScreenWidth=800
Global ScreenHeight=480

If OpenWindow(0,0,0,ScreenWidth,ScreenHeight,"Maxime Puzzle",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0),0,0,ScreenWidth,ScreenHeight,0,0,0)
    UseJPEGImageDecoder()
    UseOGGSoundDecoder()
    ;LoadSound(0,"./Sounds/claps.ogg")

  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
  
EndIf

Structure Param
  DivX.l
  DivY.l
  PieceWidth.l
  PieceHeight.l
EndStructure

Global Param.Param
Global Dim Puzzle.l(1)

Procedure NewImage()
  ExamineDirectory(0,"./Images/","*.jpg")
  NewList mylist.s()
  Repeat
    file=NextDirectoryEntry(0)
    If file=1
      AddElement(mylist.s())
      mylist.s()=DirectoryEntryName(0)
    EndIf
  Until file=0
  SelectElement(mylist.s(),Random(CountList(mylist.s())-1))
  
  Names.s=mylist()
  
  LoadImage(0,"Images/"+Names,#PB_Sprite_Memory)
  
  
  
EndProcedure

Procedure Cut(X.l,Y.l)
  Param\DivX=X
  Param\DivY=Y
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(0),0,0,ScreenWidth,ScreenHeight)
  StopDrawing()
  Param\PieceWidth=ScreenWidth/Param\DivX
  Param\PieceHeight=ScreenHeight/Param\DivY
  sp=0
  For y=0 To Param\DivY-1
    For x=0 To Param\DivX-1
      sp+1
      GrabSprite(sp, x*Param\PieceWidth, y*Param\PieceHeight, Param\PieceWidth, Param\PieceHeight)
    Next
  Next
  ReDim Puzzle.l(Param\DivX*Param\DivY)
EndProcedure

Procedure ShuffleTable()
  Nb=Param\DivX*Param\DivY
  ReDim Puzzle(Nb)
  
  For Index = 1 To Nb
    Puzzle(Index) = Index
  Next
  
  For Index = 1 To Nb
    IndexB = Random(Nb-1)+1
    If IndexB <> Index
      Swap Puzzle(Index), Puzzle(IndexB)
    EndIf
  Next
EndProcedure



Procedure Finish()
  Nb=Param\DivX*Param\DivY
  Ok=0
  For z=1 To Nb
    If Puzzle(z)=z
      Ok+1
    EndIf
  Next
  If Ok=Nb:
    ProcedureReturn 1
  Else 
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure NextPicture()
  NewImage()
  Cut(4,4)
  ShuffleTable()
EndProcedure

NextPicture()
Mode=0
Repeat
  Event.l = WindowEvent()
  
  If Event = #PB_Event_Gadget
    
  Else
    ; do the sprite & screen stuff here...
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    ExamineKeyboard()
    ExamineMouse()
    
    If KeyboardPushed(#PB_Key_N)
      NewImage()
      Cut(4,4)
      ShuffleTable()
    EndIf
    
    If KeyboardPushed(#PB_Key_Return)
      ShuffleTable()
    EndIf
    
    If KeyboardPushed(#PB_Key_Space)
      Nb=Param\DivX*Param\DivY
      
      For z=1 To Nb
        Puzzle(z)=z
      Next
    EndIf
    
    
    
    ; Clear the screen and draw our sprites
    ClearScreen(RGB(0,0,0))
    sp=0
    For y=0 To Param\DivY-1
      For x=0 To Param\DivX-1
        sp+1
        If IsSprite(Puzzle(sp))
          DisplaySprite(Puzzle(sp), x*Param\PieceWidth, y*Param\PieceHeight)
        EndIf
      Next
    Next
    

    
    StartDrawing(ScreenOutput())
    If Mode<3
      For x=0 To Param\DivX-1
        Line(x*Param\PieceWidth,0,0,ScreenHeight,0)
      Next
      For y=0 To Param\DivY-1
        Line(0,y*Param\PieceHeight,ScreenWidth,0,0)
      Next
    EndIf
    Circle(MouseX(),MouseY(),5,RGB(255,0,0))
    StopDrawing()
    
    If Take>0
      DisplaySprite(Puzzle(Take),MouseX()-DeltaX,MouseY()-DeltaY)
    EndIf
    
    If MouseButton(#PB_MouseButton_Left) And Mode=0
      Take=((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\DivX)+1
      Mode=1
      DeltaX=MouseX()-Int(MouseX()/Param\PieceWidth)*Param\PieceWidth
      DeltaY=MouseY()-Int(MouseY()/Param\PieceHeight)*Param\PieceHeight
    ElseIf MouseButton(#PB_MouseButton_Left)=0 And Mode=1
      Swap Puzzle(Take), Puzzle(((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\DivX)+1)
      Take=0
      Mode=0
      If Finish()
        Time=ElapsedMilliseconds()
        ;PlaySound(0)
        Mode=3
      EndIf
    ElseIf Mode=3
      If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
    EndIf
   
    Delay(1)
  EndIf
  
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

End

Publié : dim. 24/févr./2008 14:57
par Anonyme
Les noms de chemins sont sensibles à la case

ex : Image =/ image

de même que les "\" ne sont pas valable sous nux , utilise "/" :wink:

Publié : dim. 24/févr./2008 15:05
par Thyphoon
Cpl.Bator a écrit :Les noms de chemins sont sensibles à la case

ex : Image =/ image

de même que les "" ne sont pas valable sous nux , utilise "/" :wink:
j'ai testé ça ne change rien :(
ça charge bien l'image mais j'ai l'impression que ça n'affiche pas les sprites. comme si la fonction displaysprite ne servait a rien ... pour la commande grabsprite utiliser pour les créer ne renvoie pas zero ...
je vais mettre a jour le code en haut

Publié : dim. 24/févr./2008 15:17
par Anonyme
bon, te prends pas le choux , boit un bon café,fume une clope, met une cartouche a maman :D
moi , je monte ma tour dans la journée ( elle est dans les cartons de déménagement ) et je regarde cela de plus près. je suis sur que le problème vient de là, je te confirme cela plus tard :wink:

Publié : dim. 24/févr./2008 15:26
par Thyphoon
Cpl.Bator a écrit :bon, te prends pas le choux , boit un bon café,fume une clope, met une cartouche a maman :D
moi , je monte ma tour dans la journée ( elle est dans les cartons de déménagement ) et je regarde cela de plus près. je suis sur que le problème vient de là, je te confirme cela plus tard :wink:
merci c'est sympa :P
Mais j'ai un peu avancé...curieusement c'est la première image qui ne s'affiche pas.
Si tu appuies sur espace (pour trier les morceaux du puzzle) et si tu fait juste un clic gauche (pour déclencher la détection du puzzle finit) tu verra l'image suivante s'affichera correctement...
mais pourquoi la première image ne s'affiche pas correctement là je comprend pas. Si tu as une idée n'hésite pas...

Bon courage pour le montage de ta tour ... :)
ps: je remet a jour le code dans le premier poste

Publié : dim. 24/févr./2008 15:56
par Anonyme

Code : Tout sélectionner

 LoadImage(0,"Images/"+Names,#PB_Sprite_Memory)

y a pas une erreur avec la constante?

Publié : dim. 24/févr./2008 18:57
par Anonyme

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0 Or InitSound()=0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

Global ScreenWidth=800
Global ScreenHeight=480

If OpenWindow(0,0,0,ScreenWidth,ScreenHeight,"Maxime Puzzle",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
 
  If OpenWindowedScreen(WindowID(0),0,0,ScreenWidth,ScreenHeight,0,0,0)
    UseJPEGImageDecoder()
    UseOGGSoundDecoder()
    ;LoadSound(0,"./Sounds/claps.ogg")

  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
 
EndIf

Structure Param
  DivX.l
  DivY.l
  PieceWidth.l
  PieceHeight.l
EndStructure

Global Param.Param
Global Dim Puzzle.l(1)

Procedure NewImage()
  ExamineDirectory(0,"./Images/","*.jpg")
  NewList mylist.s()
  
  
  While NextDirectoryEntry(0)<>0
    If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        AddElement(mylist())
        mylist()=DirectoryEntryName(0)
    EndIf 
  Wend 
    
  Index =  Random( CountList(mylist())-1 )
  SelectElement(mylist(),Index)
  Names.s=mylist()
  LoadImage(0,"Images/"+Names)
  ResizeImage(0,ScreenWidth,ScreenHeight)
 
EndProcedure

Procedure Cut(X.l,Y.l)
  Param\DivX=X
  Param\DivY=Y
  
  ReDim Puzzle.l(Param\DivX*Param\DivY)
  
  StartDrawing(ScreenOutput())
  DrawImage(ImageID(0),0,0)
  StopDrawing()
  FlipBuffers()
   
  Param\PieceWidth=ScreenWidth/Param\DivX
  Param\PieceHeight=ScreenHeight/Param\DivY
  sp=0
  For y=0 To Param\DivY-1
    For x=0 To Param\DivX-1
      sp+1
      Puzzle(sp) = GrabSprite(sp, x*Param\PieceWidth, y*Param\PieceHeight, Param\PieceWidth, Param\PieceHeight)
    Next
  Next
  
EndProcedure

Procedure ShuffleTable()
  Nb=Param\DivX*Param\DivY
  ReDim Puzzle(Nb)
 
  For Index = 1 To Nb
    Puzzle(Index) = Index
  Next
 
  For Index = 1 To Nb
    IndexB = Random(Nb-1)+1
    If IndexB <> Index
      Swap Puzzle(Index), Puzzle(IndexB)
    EndIf
  Next
EndProcedure



Procedure Finish()
  Nb=Param\DivX*Param\DivY
  Ok=0
  For z=1 To Nb
    If Puzzle(z)=z
      Ok+1
    EndIf
  Next
  If Ok=Nb:
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure NextPicture()
  NewImage()
  Cut(4,4)
  ShuffleTable()
EndProcedure

NextPicture()
Mode=0
Repeat
  Event.l = WindowEvent()
 
    ClearScreen(RGB(64,128,255))
    ExamineKeyboard()
    ExamineMouse()
   
    If KeyboardPushed(#PB_Key_N)
      NewImage()
      Cut(4,4)
      ShuffleTable()
    EndIf
   
    If KeyboardPushed(#PB_Key_Return)
      ShuffleTable()
    EndIf
   
    If KeyboardPushed(#PB_Key_Space)
      Nb=Param\DivX*Param\DivY
     
      For z=1 To Nb
        Puzzle(z)=z
      Next
    EndIf
   
   
   
    ; Clear the screen and draw our sprites
    
    sp=0
    For y=0 To Param\DivY-1
      For x=0 To Param\DivX-1
        sp+1
        If IsSprite(Puzzle(sp))
          DisplaySprite(Puzzle(sp), x*Param\PieceWidth, y*Param\PieceHeight)
        EndIf
      Next
    Next
   

   
    StartDrawing(ScreenOutput())
    If Mode<3
      For x=0 To Param\DivX-1
        Line(x*Param\PieceWidth,0,0,ScreenHeight,0)
      Next
      For y=0 To Param\DivY-1
        Line(0,y*Param\PieceHeight,ScreenWidth,0,0)
      Next
    EndIf
    Circle(MouseX(),MouseY(),5,RGB(255,0,0))
    StopDrawing()
   
    If Take>0
      DisplaySprite(Puzzle(Take),MouseX()-DeltaX,MouseY()-DeltaY)
    EndIf
   
    If MouseButton(#PB_MouseButton_Left) And Mode=0
      Take=((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\DivX)+1
      Mode=1
      DeltaX=MouseX()-Int(MouseX()/Param\PieceWidth)*Param\PieceWidth
      DeltaY=MouseY()-Int(MouseY()/Param\PieceHeight)*Param\PieceHeight
    ElseIf MouseButton(#PB_MouseButton_Left)=0 And Mode=1
      Swap Puzzle(Take), Puzzle(((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\DivX)+1)
      Take=0
      Mode=0
      If Finish()
        Time=ElapsedMilliseconds()
        ;PlaySound(0)
        Mode=3
      EndIf
    ElseIf Mode=3
      If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
    EndIf
   
  

 
 
 FlipBuffers()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

End
l'erreur est simple , tu as fait un grabsprite() sur un buffer vidéo vide, un flipbuffer resoud le problème , j'ai aussi corriger 2 3 trucs :wink:

Publié : jeu. 28/févr./2008 17:17
par Thyphoon
Merci Cpl.Bator ! Désolé de ne pas t'avoir repondu plus tôt mais je n'avais plus d'acces internet (vive les vacances a la campagne) c'était bien le problème du FlipBuffer... d'ailleur entre la version windows et la version Linux le buffer est inversé ! Car si je laisse le flipbuffer que tu as rajouté et que je le compile sous windows alors il y a la fameuse image noir de debut..Je vais corriger ça dans les heures qui viennent en ecrivant l'image sur un sprite avant de la découper plutôt qu'en utilisant le buffer du screen ....

mais bon voici en attendant la dernière version de mon code

Code : Tout sélectionner

;Initiaisation des differents libs
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0 Or InitSound()=0
  MessageRequester("Error", "GFX Libs Error", 0)
  End
EndIf

;On Examine le Bureau pour connaitre la resolution
ExamineDesktops()

Global ScreenWidth=DesktopWidth(0)
Global ScreenHeight=DesktopHeight(0)

 OpenScreen(ScreenWidth, ScreenHeight, 32, "Maxime")
 UseJPEGImageDecoder()
 UseOGGSoundDecoder()
 LoadSound(0,"./Sounds/claps.ogg")

;Initiation des variables

Structure Param
  Division.l             ;Division
  PieceWidth.l        ;Largeur d'une piece
  PieceHeight.l      ;Hauteur d'une piece
  GameWidth.l       ;Largeur de jeu
  GameHeight.l    ;Hauteur de jeu
  StartTime.l         ;Temps du debut du jeux
 
EndStructure

Global Param.Param
 Param\Division=4;;On commence avec un Puzlle de 4 pieces
Global Dim Puzzle.l(1)

Structure PictureList
  Name.s
  Count.l
  BestTime.l[65]
EndStructure

Global NewList PictureList.PictureList()       ;Listes des images utilisé pour faire les puzzles
;Creation de la liste des images
Procedure ReadPictureList()
  ExamineDirectory(0,"./Images/","*.jpg")
  Repeat
    file=NextDirectoryEntry(0)
    If file=1
      AddElement(PictureList())
      PictureList()\Name=DirectoryEntryName(0)
    EndIf
  Until file=0
EndProcedure

Procedure ReadPuzzleInfo()
countmini=-1;
If OpenPreferences("Preferences.ini")
  ForEach PictureList()
    PreferenceGroup( PictureList()\Name)
    PictureList()\Count=ReadPreferenceLong("Counter",0)
    If countmini=-1 Or countmini>PictureList()\Count
      countmini=PictureList()\Count
    EndIf
    For z=2 To 64
      PictureList()\BestTime[z]=ReadPreferenceLong(Str(z),0)
    Next
  Next
  ClosePreferences()
  ForEach PictureList()
    If PictureList()\Count>countmini
      DeleteElement(PictureList())
    EndIf
  Next
EndIf
EndProcedure

Procedure WritePuzzleInfo()
f=0
If OpenPreferences("Preferences.ini")
f=1
Else 
  If CreatePreferences("Preferences.ini")
   f=1
   EndIf
EndIf
If f=1
  PreferenceGroup( PictureList()\Name)
  WritePreferenceLong("Counter",PictureList()\Count)
  d=Param\Division
  WritePreferenceLong(Str(Param\Division), PictureList()\BestTime[d])
  ClosePreferences()
EndIf
EndProcedure

Procedure shufflelist()
For z=0 To CountList(PictureList.s())-1
  SelectElement(PictureList(),z)
  *FirstElement=@PictureList()
  SelectElement(PictureList(),Random(CountList(PictureList.s())-1))
  *SecondElement=@PictureList()
    SwapElements(PictureList(), *FirstElement, *SecondElement)
Next
ResetList(PictureList())
EndProcedure

Procedure ResetGame()
  ReadPictureList()
  ReadPuzzleInfo()
  shufflelist()
EndProcedure 

Procedure NewImage()
If ListIndex(PictureList())=>CountList(PictureList())-1
 ;ResetGame()
EndIf
 NextElement(PictureList())
  LoadImage(0,"Images/"+PictureList()\Name,#PB_Sprite_Memory)
EndProcedure

Procedure Cut()
  StartDrawing(ScreenOutput())
  Box(0,0,ScreenWidth,ScreenHeight,0)
  DrawImage(ImageID(0),0,0,ScreenWidth,ScreenHeight)
  StopDrawing()
  FlipBuffers()
  Param\PieceWidth=ScreenWidth/Param\Division
  Param\PieceHeight=ScreenHeight/Param\Division
  sp=0
  For y=0 To Param\Division-1
    For x=0 To Param\Division-1
      sp+1
      GrabSprite(sp, x*Param\PieceWidth, y*Param\PieceHeight, Param\PieceWidth, Param\PieceHeight)
    Next
  Next
  Debug Param\Division
  ReDim Puzzle.l(Param\Division*Param\Division)
  Param\StartTime=ElapsedMilliseconds()
EndProcedure

Procedure ShuffleTable()
  Nb=Param\Division*Param\Division
  ReDim Puzzle(Nb)
  
  For Index = 1 To Nb
    Puzzle(Index) = Index
  Next
  
  For Index = 1 To Nb
    IndexB = Random(Nb-1)+1
    If IndexB <> Index
      Swap Puzzle(Index), Puzzle(IndexB)
    EndIf
  Next
EndProcedure

Procedure Finish()
  Nb=Param\Division*Param\Division
  Ok=0
  For z=1 To Nb
    If Puzzle(z)=z
      Ok+1
    EndIf
  Next
  ;Si on a finit le puzzle
  If Ok=Nb:
    PictureList()\Count+1
    Time=ElapsedMilliseconds()-Param\StartTime;Calcul du temps mis pour finir le puzzle
    d=Param\Division
    If PictureList()\BestTime[d]=0 Or PictureList()\BestTime[d]>Time
      PictureList()\BestTime[d]=Time
      WritePuzzleInfo()
      ProcedureReturn 2;On a finit le Puzzle avec un meilleur temps
    Else
      WritePuzzleInfo()
      ProcedureReturn 1;On a finit le Puzzle mais pas avec un meilleur temps
    EndIf
  Else 
    ProcedureReturn 0; Le puzzle n'est pas finit
  EndIf
EndProcedure

Procedure NextPicture()
  NewImage()
  Cut()
  ShuffleTable()
EndProcedure

ResetGame()
NextPicture()
Mode=0
Repeat

    ; do the sprite & screen stuff here...
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    ExamineKeyboard()
    ExamineMouse()
    
    If KeyboardPushed(#PB_Key_N)
      NextPicture()
    EndIf
    
    If KeyboardPushed(#PB_Key_Return)
      ShuffleTable()
    EndIf
    
    If KeyboardPushed(#PB_Key_Space)
      Nb=Param\Division*Param\Division
      For z=1 To Nb
        Puzzle(z)=z
      Next
    EndIf
    
   ; Clear the screen and draw our sprites
    ClearScreen(RGB(0,0,0))
    sp=0
    For y=0 To Param\Division-1
      For x=0 To Param\Division-1
        sp+1
        If IsSprite(Puzzle(sp))
          DisplaySprite(Puzzle(sp), x*Param\PieceWidth, y*Param\PieceHeight)
        EndIf
      Next
    Next
    

    
    StartDrawing(ScreenOutput())
    If Mode<3
      For x=0 To Param\Division-1
        Line(x*Param\PieceWidth,0,0,ScreenHeight,0)
      Next
      For y=0 To Param\Division-1
        Line(0,y*Param\PieceHeight,ScreenWidth,0,0)
      Next
    EndIf
        If Take>0
      DisplaySprite(Puzzle(Take),MouseX()-DeltaX,MouseY()-DeltaY)
    EndIf
    
    Circle(MouseX(),MouseY(),5,RGB(255,0,0))
    StopDrawing()
    
   
    If MouseButton(#PB_MouseButton_Left) And Mode=0
      Take=((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\Division)+1
      Mode=1
      DeltaX=MouseX()-Int(MouseX()/Param\PieceWidth)*Param\PieceWidth
      DeltaY=MouseY()-Int(MouseY()/Param\PieceHeight)*Param\PieceHeight
    ElseIf MouseButton(#PB_MouseButton_Left)=0 And Mode=1
      Swap Puzzle(Take), Puzzle(((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\Division)+1)
      Take=0
      Mode=0
      TheEnd=Finish()
      If TheEnd=1
        Time=ElapsedMilliseconds()
        PlaySound(0)
        Mode=4
      ElseIf TheEnd=2
        Time=ElapsedMilliseconds()
        PlaySound(0)
        Mode=3
      EndIf
      
    ElseIf Mode=3
      If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
     ElseIf Mode=4
     StartDrawing(ScreenOutput())
     txt.s="Nouveau record"
     w.l=TextWidth(txt)
     h.l=TextHeight(txt)
     DrawText((ScreenWidth-w)/2,(ScreenHeight-h)/2,txt,RGB(255,255,255),0)
     StopDrawing()
        If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
    EndIf
   
    Delay(1)
  
Until KeyboardPushed(#PB_Key_Escape)

End

Publié : jeu. 28/févr./2008 20:39
par Thyphoon
Voici la dernière version du code. La prochaine fois je ferais une archive.
car il y a quelques sprites et sons ...

il y a une fonction qui marche sous windows et pas sous linux c'est celle là:
il s'agit d'un code pour charger une police proportionnel a la taille de l'ecran
(sous linux eça boucle indefiniment)

Code : Tout sélectionner

Procedure FontChoice()
 size=23
 Repeat
   size+1
   r=LoadFont(1, "Arial", size) 
   StartDrawing(ScreenOutput())
   DrawingFont(FontID(1))
   w=TextWidth("AAAAAAAAAAAAAAAA")
   Debug w
   StopDrawing()
 Until w>ScreenWidth Or r=0
 EndProcedure
si quelqu'un a une idée...
en attendant voici le code principal

Code : Tout sélectionner

;Initiaisation des differents libs
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse()=0 Or InitSound()=0
  MessageRequester("Error", "GFX Libs Error", 0)
  End
EndIf

;On Examine le Bureau pour connaitre la resolution
ExamineDesktops()

Global ScreenWidth=DesktopWidth(0)
Global ScreenHeight=DesktopHeight(0)
Global ScreenType=1
If  ScreenType=0
  OpenScreen(ScreenWidth, ScreenHeight, 32, "Maxime")
Else
  OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight, "Maxime", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0), 0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
 EndIf
 UseJPEGImageDecoder()
 UsePNGImageDecoder()
 UseOGGSoundDecoder()
 LoadSound(0,"./datas/claps.ogg")
 TransparentSpriteColor(#PB_Default, RGB(255,0,255))
 LoadSprite(1000,"./datas/cursor00.png",#PB_Sprite_Memory)
;Initiation des variables

Structure Param
  Division.l             ;Division
  PieceWidth.l        ;Largeur d'une piece
  PieceHeight.l      ;Hauteur d'une piece
  GameWidth.l       ;Largeur de jeu
  GameHeight.l    ;Hauteur de jeu
  StartTime.l         ;Temps du debut du jeux
 
EndStructure

Global Param.Param
 Param\Division=4;;On commence avec un Puzlle de 4 pieces
Global Dim Puzzle.l(1)

Structure PictureList
  Name.s
  Count.l
  BestTime.l[65]
EndStructure

Global NewList PictureList.PictureList()       ;Listes des images utilisé pour faire les puzzles
;Creation de la liste des images
Procedure ReadPictureList()
  ExamineDirectory(0,"./Images/","*.jpg")
  Repeat
    file=NextDirectoryEntry(0)
    If file=1
      AddElement(PictureList())
      PictureList()\Name=DirectoryEntryName(0)
    EndIf
  Until file=0
EndProcedure

Procedure ReadPuzzleInfo()
countmini=-1;
If OpenPreferences("Preferences.ini")
  ForEach PictureList()
    PreferenceGroup( PictureList()\Name)
    PictureList()\Count=ReadPreferenceLong("Counter",0)
    If countmini=-1 Or countmini>PictureList()\Count
      countmini=PictureList()\Count
    EndIf
    For z=2 To 64
      PictureList()\BestTime[z]=ReadPreferenceLong(Str(z),0)
    Next
  Next
  ClosePreferences()
  ForEach PictureList()
    If PictureList()\Count>countmini
      DeleteElement(PictureList())
    EndIf
  Next
EndIf
EndProcedure

Procedure WritePuzzleInfo()
f=0
If OpenPreferences("Preferences.ini")
f=1
Else 
  If CreatePreferences("Preferences.ini")
   f=1
   EndIf
EndIf
If f=1
  PreferenceGroup( PictureList()\Name)
  WritePreferenceLong("Counter",PictureList()\Count)
  d=Param\Division
  WritePreferenceLong(Str(Param\Division), PictureList()\BestTime[d])
  ClosePreferences()
EndIf
EndProcedure

Procedure shufflelist()
For z=0 To CountList(PictureList.s())-1
  SelectElement(PictureList(),z)
  *FirstElement=@PictureList()
  SelectElement(PictureList(),Random(CountList(PictureList.s())-1))
  *SecondElement=@PictureList()
    SwapElements(PictureList(), *FirstElement, *SecondElement)
Next
ResetList(PictureList())
EndProcedure

Procedure ResetGame()
  ReadPictureList()
  ReadPuzzleInfo()
  shufflelist()
EndProcedure 

Procedure NewImage()
If ListIndex(PictureList())=>CountList(PictureList())-1
 ResetGame()
EndIf
 NextElement(PictureList())
  LoadImage(0,"Images/"+PictureList()\Name,#PB_Sprite_Memory)
EndProcedure

Procedure Cut()
  StartDrawing(ScreenOutput())
  Box(0,0,ScreenWidth,ScreenHeight,0)
  DrawImage(ImageID(0),0,0,ScreenWidth,ScreenHeight)
  StopDrawing()
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    FlipBuffers()
  CompilerEndIf
  
  Param\PieceWidth=ScreenWidth/Param\Division
  Param\PieceHeight=ScreenHeight/Param\Division
  sp=0
  For y=0 To Param\Division-1
    For x=0 To Param\Division-1
      sp+1
      GrabSprite(sp, x*Param\PieceWidth, y*Param\PieceHeight, Param\PieceWidth, Param\PieceHeight)
    Next
  Next
  Debug Param\Division
  ReDim Puzzle.l(Param\Division*Param\Division)
  Param\StartTime=ElapsedMilliseconds()
EndProcedure

Procedure ShuffleTable()
  Nb=Param\Division*Param\Division
  ReDim Puzzle(Nb)
  
  For Index = 1 To Nb
    Puzzle(Index) = Index
  Next
  
  For Index = 1 To Nb
    IndexB = Random(Nb-1)+1
    If IndexB <> Index
      Swap Puzzle(Index), Puzzle(IndexB)
    EndIf
  Next
EndProcedure

Procedure Finish()
  Nb=Param\Division*Param\Division
  Ok=0
  For z=1 To Nb
    If Puzzle(z)=z
      Ok+1
    EndIf
  Next
  ;Si on a finit le puzzle
  If Ok=Nb:
    PictureList()\Count+1
    Time=ElapsedMilliseconds()-Param\StartTime;Calcul du temps mis pour finir le puzzle
    d=Param\Division
    If PictureList()\BestTime[d]=0 Or PictureList()\BestTime[d]>Time
      PictureList()\BestTime[d]=Time
      WritePuzzleInfo()
      ProcedureReturn 2;On a finit le Puzzle avec un meilleur temps
    Else
      WritePuzzleInfo()
      ProcedureReturn 1;On a finit le Puzzle mais pas avec un meilleur temps
    EndIf
  Else 
    ProcedureReturn 0; Le puzzle n'est pas finit
  EndIf
EndProcedure

Procedure NextPicture()
  NewImage()
  Cut()
  ShuffleTable()
EndProcedure

Procedure FontChoice()
 size=23
 
 Repeat
 size+1
 r=LoadFont(1, "Arial", size) 
 StartDrawing(ScreenOutput())
 DrawingFont(FontID(1))
 w=TextWidth("AAAAAAAAAAAAAAAA")
 Debug w
 StopDrawing()
 Until w>ScreenWidth Or r=0
 
EndProcedure


ResetGame()
;FontChoice()
NextPicture()
Mode=0
Repeat
  If  ScreenType=1
    Event = WindowEvent()
    Delay(1)
  EndIf

    ; do the sprite & screen stuff here...
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    ExamineKeyboard()
    ExamineMouse()
    
    If KeyboardPushed(#PB_Key_N)
      NextPicture()
    EndIf
    
    If KeyboardPushed(#PB_Key_Return)
      ShuffleTable()
    EndIf
    
    If KeyboardPushed(#PB_Key_Space)
      Nb=Param\Division*Param\Division
      For z=1 To Nb
        Puzzle(z)=z
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_Escape)
      Event=#PB_Event_CloseWindow
    EndIf
    
   ; Clear the screen and draw our sprites
    ClearScreen(RGB(0,0,0))
    sp=0
    For y=0 To Param\Division-1
      For x=0 To Param\Division-1
        sp+1
        If IsSprite(Puzzle(sp))
          DisplaySprite(Puzzle(sp), x*Param\PieceWidth, y*Param\PieceHeight)
        EndIf
      Next
    Next
    


    StartDrawing(ScreenOutput())
    If Mode<3
      For x=0 To Param\Division-1
        Line(x*Param\PieceWidth,0,0,ScreenHeight,0)
      Next
      For y=0 To Param\Division-1
        Line(0,y*Param\PieceHeight,ScreenWidth,0,0)
      Next
    EndIf
    StopDrawing()
        If Take>0
      DisplaySprite(Puzzle(Take),MouseX()-DeltaX,MouseY()-DeltaY)
    EndIf
    DisplayTransparentSprite(1000,MouseX()-SpriteWidth(1000)/2,MouseY())
   
    If MouseButton(#PB_MouseButton_Left) And Mode=0
      Take=((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\Division)+1
      Mode=1
      DeltaX=MouseX()-Int(MouseX()/Param\PieceWidth)*Param\PieceWidth
      DeltaY=MouseY()-Int(MouseY()/Param\PieceHeight)*Param\PieceHeight
    ElseIf MouseButton(#PB_MouseButton_Left)=0 And Mode=1
      Swap Puzzle(Take), Puzzle(((MouseX()/Param\PieceWidth)+MouseY()/Param\PieceHeight*Param\Division)+1)
      Take=0
      Mode=0
      TheEnd=Finish()
      If TheEnd=1
        Time=ElapsedMilliseconds()
        PlaySound(0)
        Mode=4
      ElseIf TheEnd=2
        Time=ElapsedMilliseconds()
        PlaySound(0)
        Mode=3
      EndIf
      
    ElseIf Mode=3
      If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
     ElseIf Mode=4
     StartDrawing(ScreenOutput())
     txt.s="Nouveau record"
     w.l=TextWidth(txt)
     h.l=TextHeight(txt)
     DrawingFont(FontID(1))
     DrawText((ScreenWidth-w)/2,(ScreenHeight-h)/2,txt,RGB(255,255,255),0)
     StopDrawing()
        If ElapsedMilliseconds()-Time>3000
        Mode=0
        NextPicture()
      EndIf
    EndIf
   
    Delay(1)
  
Until Event=#PB_Event_CloseWindow

End

Publié : ven. 29/févr./2008 9:24
par Anonyme
Y a pô d'Arial sous linux :D

Publié : ven. 29/févr./2008 10:46
par Thyphoon
Cpl.Bator a écrit :Y a pô d'Arial sous linux :D
lollllllllll zut alors... heu !!! quels sont les polices de caractère que je suis sur de trouver ?
"Sans"?
"DejaVu" ?

Publié : ven. 29/févr./2008 12:25
par Anonyme
regarde dans : Application -> Accessoires -> Table de caractères. :wink:

Publié : ven. 21/mars/2008 22:49
par Kayne
excellent ce jeu de puzzle

Publié : sam. 22/mars/2008 6:30
par Thyphoon
Kayne a écrit :excellent ce jeu de puzzle
Merci il pourrait être nettement améliorer, mais ça suffit pour mon fils de 3 ans :P
Faut que mette la dernières version du code en ligne. mais comme je bosse ça attendra un peu. D'ailleur si certain on des propositions pour améliorer le jeu.
Je cherche aussi quelqu'un pour me compiler une version macOS