Page 7 sur 13

Publié : mar. 09/mars/2004 12:25
par comtois
Patrick88 a écrit :3) il serait interressant de stocker toutes les infos (textures, sons, data ) soit dans le fichier access ou soit dans un .pak

pat
1) Pour le UNDO dans la version précédente, j'avais fait deux listes chainées ,une pour enregistrer les déplacements du jeton ( pour enregistrer une solution si le niveau se termine avec le meilleur score )
et une liste chainée UNDO .
Mais je me demande si une seule ne serait pas suffisant ? je n'ai pas encore réfléchi à ça, car j'ai géré autrement la liste chainée "solution" dans le code en commun .Disons qu'avec deux listes , on ne se casse pas la tête :)

2) Pour le score c'est tout à fait ça , on stocke le nombre de déplacements pour chaque niveau sans oublier le nom du champion , et on fera un palmarès :)

3) oui bonne idée .Qui s'en occupe ? :)
Remarque
avec Add3DArchive(Chemin$, Type) et en précisant un type zip , on peut tout mettre dans un zip , par contre , pour les tiles 2D faudra un pak , alors tout un pak ,c'est la meilleure solution ?

Publié : mar. 09/mars/2004 13:12
par Patrick88
CORBASE a écrit : Puis, patrick j'est fait la sauvegarde de score, et j'ai fait comme tu dis, on sauvegarde le nombre de déplacement du robot !

Par contre, si quelqu'un sait comment on peux sauter des ligne dans un StirngGadget sa serais bien, enfin voila le petit bout de code qui m'embete :
il ne faut pas que tu affiches toutes les infos dans ton stringadget
il faut que tu stockes "ça" dans un tableau et prendre juste ce qui est intéressant ( avec un stringfield )

pseudo-code
structure
niveau.w ; n° du niveau
player.b[20] ; puisque pb ne sait pas sauver de string il faut passer par un tableau de char
score.w ; nombre déplacement
temps.w ; temps réalisé en centieme de seconde (60mn = 100 centieme)
fin
Table score.structure(1000) ; ou une linked list

score.txt => 1,alphonse,25,75
chaine$=readstring()
score(index)\niveau = val(stringfield(chaine$,1,","))
temp$ = stringfield(chaine$,1,",")
tant que len(temp$)>0
faire score(index)\player = left(temp$,1) : i+1
temp$ = right(temp$,len(temp$)-1) ; ou similaire
loop

....

do nombre de score
stringadget(#score) = ...\niveau + .. \player + \temp + \mouvement
loop

/pseudo-code

pat

Publié : mar. 09/mars/2004 16:09
par CORBASE
bah en fait, j'ai fait un message requester tout simplement, sa rend bien !

Mais j'ai un pb sur l'enregistrement des highscore ...

Code : Tout sélectionner

              test$ = "gfd"
              While test$ <> ""
                ReadString()
                test$ = ReadString()
                If score$ < test$
                  Goto ecrire
                EndIf 
                test = Loc()
              Wend
              ;je place mon pointeur à la fin du fichier
              ecrire:
              FileSeek(test)
              WriteStringN(GetGadgetText(#nick))
              WriteStringN(score$)
              CloseFile(0)
donc le fait que cela s'enregistre ou je veux c'est bon, le pb vient du fait que avec ce code, la ou j'enregistre mon joueur, le suivant a quelques caractères d'effacé, ce qui est génant.

Pour que vous compreniez reagrder :
Fichier d'ORIGINE :

Code : Tout sélectionner

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
53
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
54
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
55
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
56
La sa ce vois mal, mais il y a lme meme nombre de lettre I J K L ..

et apres insertion du joueur voila ce que j'ai :

Code : Tout sélectionner

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
53
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
54
trfed
54
KKKKKKKKKKKKKKKKKKKKKK <= la sa m'enelve 13 char
55
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
56
Si quelqu'un vois le pb :p

Ensuite ,j'ai une petite idée pour le robot :P

D'abord faut que je finisse ce hIgh Score, donc marci pour votre aide !!

Publié : mar. 09/mars/2004 17:02
par Patrick88
a vue de nez ton bidule ne rajoute pas de ligne, mais se contente d'écrabouiller les données qui existe déja.

trfed = 5 cararcateres
54 = 2 caracteres

+ retour de ligne = chr(10)+chr(13) = +2 caracteres à chaque ligne

soit en tout (5+2) + (2+2) = 11 caracteres ...

peut etre + 2 espaces en plus dans trfred ?

donc ta routines est pas bonne

pat

Publié : mar. 09/mars/2004 17:07
par CORBASE
Justement patrick ,je veux qu'il l'ecrase !

Tu ne connais pas un moyen pour rectifier tout cela ?

Publié : mar. 09/mars/2004 17:12
par Patrick88
j'y travaille... je compléterai ce post quand j'aurai fini...

Code : Tout sélectionner

Structure stru_score
  index.w
  nom.s
  deplacement.w
  temps.w
EndStructure

NewList score.stru_score()

Procedure AjourFichierScore()
  If CreatePreferences("score.txt")
    WritePreferenceLong("NOMBRE_SCORE",CountList(score()))
    ForEach score()
      PreferenceGroup("PLAYER"+Str(score()\index))
      WritePreferenceString("NAME",score()\nom)
      WritePreferenceLong("DEPLACEMENT",score()\deplacement)
      WritePreferenceLong("TEMPS",score()\temps)
    Next
    ClosePreferences()
    FirstElement(score())
  EndIf
EndProcedure

Procedure LectureFichierScore()
  ClearList(score())
  If OpenPreferences("score.txt")
    nbscore = ReadPreferenceLong("NOMBRE_SCORE",0):Debug nbscore
    For i = 1 To nbscore
      AddElement(score())
      score()\index = i
      PreferenceGroup("PLAYER"+Str(i))
      score()\nom = ReadPreferenceString("NAME","AAA")
      score()\deplacement = ReadPreferenceLong("DEPLACEMENT",0)
      score()\temps= ReadPreferenceLong("TEMPS",0)
      Debug score()\nom 
    Next
    ClosePreferences()
    FirstElement(score())
  EndIf
EndProcedure

AddElement(score())
score()\index = 1
score()\nom = "Patrick"
score()\deplacement = 20
score()\temps = 53

AjourFichierScore()
LectureFichierScore()
ForEach score()
  Debug score()\nom
Next
voila

pat

Publié : mar. 09/mars/2004 17:16
par CORBASE
Patrick, tu veux que je te passe tout ce que j'ai déjà fait de mon coté ? comme sa tu as cas améliorer :p

Enfin, c'est toi qui vois :P

Publié : mar. 09/mars/2004 21:50
par comtois
Je vois que tu as ajouté le temps patrick88 ? purée tu es dur toi :)

Publié : mar. 09/mars/2004 22:06
par CORBASE
Moi perso, je ne mettrais pas le temps .. mais bon cela ne regarde que moi !

Sinon personne à une idée pour mon problème ?

Publié : mar. 09/mars/2004 22:18
par Invité
ouais moi non plus , je ne mettrais pas le temps ,c'est assez dur comme ça :)

Faudrait prévoir la possibilité de récolter les scores et le fichier solution faisant foi de ceux qui voudront bien participer , pour créer un fichier HightScore qui sera fourni avec les nouvelles versions ( avec les solutions correspondantes ) ? Qu'est-ce que vous en pensez ?

Publié : mar. 09/mars/2004 22:26
par CORBASE
moi je suis OK, pour vous aidé voici le bout de code que j'ai fait :

Code : Tout sélectionner

Procedure SaveScore(level$,score$)
;- Constante pour la fentre
;
Enumeration
  #sauvS
EndEnumeration

;- Constantes des gadgets
;
Enumeration
  #Frame3D_0
  #nick
  #go
EndEnumeration

If OpenWindow(#sauvS, 216, 0, 406, 87,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered , "Enregistrement des scores ")
  If CreateGadgetList(WindowID())
    Frame3DGadget(#Frame3D_0, 10, 10, 310, 50, "Entrez votre pseudo ...")
    StringGadget(#nick, 20, 30, 280, 20, "")
    ButtonGadget(#go, 340, 20, 50, 40, "OK")
  EndIf
EndIf
  
Repeat
  Repeat
    WEvent = WindowEvent()
    Select WEvent
      Case #PB_Event_CloseWindow
        Quit = 1
      Case #PB_Event_Gadget
        Gadget = EventGadgetID()
        Select Gadget
          ;Quand on clique sur OK sa enregistre le score
          Case #go
            If OpenFile(0, "Score\"+level$+".txt")
              ;La je recupere le pointeur correspondant à la fin du fichier
              test$ = "gfd"
              While test$ <> ""
                ReadString()
                test$ = ReadString()
                If score$ < test$
                  Goto ecrire
                EndIf 
                test = Loc()
              Wend
              ;je place mon pointeur à la fin du fichier
              ecrire:
              FileSeek(test)
              WriteStringN(GetGadgetText(#nick))
              WriteStringN(score$)
              CloseFile(0)
            Else
              MessageRequester("Enregistrement Score", "Un problème est apparut durant l'écriture du score", 0)
            EndIf
            WEvent = 0
            Quit = 1
        EndSelect
    EndSelect
  Until WEvent = 0
Until Quit = 1

EndProcedure

et voila la lecture du highscore

Code : Tout sélectionner

If OpenFile(0, "Score\niveau1.txt")
  s1$ = ReadString()+Chr(10)
  s2$ = ReadString()+Chr(10)
  s3$ = ReadString()+Chr(10)
  s4$ = ReadString()+Chr(10)
  s5$ = ReadString()+Chr(10)
  s6$ = ReadString()+Chr(10)
  s7$ = ReadString()+Chr(10)
  s8$ = ReadString()+Chr(10)
  s9$ = ReadString()+Chr(10)
  s10$ = ReadString()+Chr(10)
  totsco$ = s1$+s2$+s3$+s4$+s5$+s6$+s7$+s8$+s9$+s10$
  MessageRequester("Meilleurs scores",totsco$,0)
  CloseFile(0)
Else
  MessageRequester("Enregistrement Score", "Un problème est apparut durant l'écriture du score", 0)
EndIf

j'ai prévu de mettre que 10 score :p

Enfin voila ...

Publié : jeu. 11/mars/2004 10:33
par comtois
la Version V006 est dispo , toujours à la même adresse .

Il n'y a pas grand chose de nouveau .

J'ai incorporé :

la modif de Filperj pour le menu .
la sauvegarde et le chargement d'une partie .
Un début de gestion du score , je n'ai pas encore regardé les solutions de patrick88 et de corbase .

On va pouvoir discuter sur les 3 solutions et se mettre d'accord sur une seule .

L'idée de stocker les dix meilleurs scores par niveau est intéressante , enfin s'il s'agit bien de ça ? pourquoi pas , c'est à étudier:)

REMARQUE :

Je me suis trompé , je n'ai pas copié le bon fichier de sauvegarde "Niveau1.SFF" dans le répertoire sauve , le prog plante avec ce fichier , il suffit de le supprimer ou de l'écraser en créant une autre sauvegarde du niveau1 .
C'est parce qu'entretemps j'ai changé la façon de créer le fichier et les données ne sont plus tout à fait les mêmes
Faudrait que je sois plus rigoureux , et que je note les versions :oops:

Publié : jeu. 11/mars/2004 18:58
par CORBASE
Comtois OK :P

Sinon moi j'essaye de m'oqp des entitys avec des anim differentes et pour le score ..

En plus je part ce Week End à la messe anniversaire de ma Gd Mere .. J'aime pas sa il y a tjrs des gens qui pleure ..

Enfin bref, je verra sa lundi, enfin jepense avoir un bon filon :P

Publié : ven. 12/mars/2004 10:19
par Patrick88
Anonymous a écrit :ouais moi non plus , je ne mettrais pas le temps ,c'est assez dur comme ça :)
bon bon, ça aurait permis de départagé certain record, celui qui a fait 42 déplacement en 20 mn, et celui qui en a 42 en 5mn :lol:
Anonymous a écrit : Faudrait prévoir la possibilité de récolter les scores et le fichier solution faisant foi de ceux qui voudront bien participer , pour créer un fichier HightScore qui sera fourni avec les nouvelles versions ( avec les solutions correspondantes ) ? Qu'est-ce que vous en pensez ?
une mise à jour en ligne de la table des scores ? suffit d'herberger la table quelque part sur le forum et d'aller la relire... ( hum ) :roll:

pat

Publié : dim. 14/mars/2004 11:53
par Patrick88
Le Comtois a dit :
En fait ,je commence à regarder comment faire pour configurer les touches dans sokoban3D , donc si tu as une idée , elle est la bienvenue , on peut en parler dans le post Sokoban3D. pour l'instant je regarde les exemples dans CodeArchiv ,c'est touffu , on ne sait que choisir

Code : Tout sélectionner

; http://purebasic.myforums.net/viewtopic.php?t=8300&start=0&postdays=0&postorder=asc&highlight=eventlparam

If OpenWindow(0,1,1,640,480,#PB_Window_SystemMenu |#PB_Window_ScreenCentered,"test_clavier")
  hwnd = WindowID(0) 
  quit = 0
  Repeat
    event = WaitWindowEvent()
    
    Select event
      Case #WM_KEYDOWN ; ou #WM_KEYUP
        nVirtKey.l = EventwParam()    ; virtual-key code
        Debug "touche virtuelle : "+Str(nVirtKey)
        
      Case #WM_CHAR
        chCharCode = EventwParam() ; character code
        Debug "caractère correspondant : "+Chr(chCharCode)
        
      Case #PB_Event_CloseWindow
        quit =1
        
    EndSelect
    
  Until quit = 1
EndIf

Code : Tout sélectionner

; http://purebasic.myforums.net/viewtopic.php?t=8300&start=0&postdays=0&postorder=asc&highlight=eventlparam

If OpenWindow(0,1,1,640,480,#PB_Window_SystemMenu |#PB_Window_ScreenCentered,"test_clavier")
hwnd = WindowID(0)
quit = 0
Repeat
event = WaitWindowEvent()
EventwParam = EventwParam()
EventlParam = EventlParam()
Select event


Case #WM_KEYUP
nVirtKey.l = EventwParam()    ; virtual-key code
lKeyData.l = EventlParam()    ; key Data


Debug nVirtKey
Debug lKeyData
Debug "-------"

Case #WM_MOUSEMOVE

mousex.l = EventlParam() % 65536
mousey.l = EventlParam() / 65536
;Debug Str(mousex)+" "+Str(mousey)

Case #PB_Event_CloseWindow
quit =1

EndSelect

Until quit = 1
EndIf
et enfin le code original....

Code : Tout sélectionner

; purebasic survival guide
; messages_1 - 10.11.2003 ejn (blueznl)
; http://www.xs4all.nl/~bluez/datatalk/pure1.htm
;
; - opening a window, and processing messages using WaitWindowEvent()
; - how to use TrackMouseEvent_()
; - retrieve cursor (mouse) coordinates from a windows WM_MOUSEMOVE event
;
;
;
;IncludeFile "x_lib.pb"
;
;x_init()
;
screen_w.l = GetSystemMetrics_(#SM_CXSCREEN)
screen_h.l = GetSystemMetrics_(#SM_CYSCREEN)
;
;main_nr.l = x_nr()
main_whnd.l = OpenWindow(main_nr,300,350,400,200,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget,"Test")
;
; wanna' have a message to notify the mouse leaving the window? use the trackmouseevent_() function
; here's the structure and the constants we might need later (uncomment when needed)
;
;   Structure tagTRACKMOUSEEVENT
;     cbSize.l
;     dwFlags.l
;     hwndTrack.l
;     dwHoverTime.l
;   EndStructure
;   #TME_LEAVE = 2
;
#WM_MOUSELEAVE = $2A3
;
UseWindow(main_nr)
;
mouselmb.l = #False
done.l = #False
Repeat
  ;
  ; processing windows messages using waitevent() instead of callback
  ;
  event.l = WaitWindowEvent()                   ; wait for an event
  window.l = EventWindowID()                    ; on which window?
  ;
  Select event
    Case #WM_KEYDOWN
      Debug "256 #WM_KEYDOWN key pressed"
      event_parameter.l = EventwParam()         ; undocumented / deprecated / windows only
      Select event_parameter                    ; eventwparam() gets additional info on event
        Case #VK_ESCAPE
          done=#True
      EndSelect
    Case #PB_Event_Menu
      Debug "13101 #PB_Event_Menu menu"
    Case #PB_Event_CloseWindow
      ; Debug "16 #PB_Event_CloseWindow close window"
      done = #True 
    Case 5
      ; Debug "5 ? resize"
    Case #PB_Event_Repaint
      ; Debug "15 #PB_Event_Repaint repaint #WM_SYSCOLORCHANGE"
    Case 160
      ; Debug "160 mouse over dragbar"
    Case 161
      ; Debug "161 window move"
    Case 275
      ; Debug "275 ? focus / activation"
    Case #WM_MOUSEMOVE
      ; Debug "512 $200 #WM_MOUSEMOVE mouse moved over window"
      ;
      ; EventwParam() contains info on variuos virtual keys
      ; EventlParam() contains the cursor coords
      ;
      ; the implementation of mousecoordinates is somewhat fuzzy in purebasic, they are
      ; reported in relation to the upper left corner of the window, not of the client area
      ; using the EventlParam() field an accurate position can be retrieved
      ;
      mousex.l = EventlParam() % 65536
      mousey.l = EventlParam() / 65536
      ;
      ; if you want to use the build in commands, you have to compensate for the size
      ; of window borders etc.
      ;
      ;   mousex.l = WindowMouseX()-GetSystemMetrics_(#SM_CYSIZEFRAME)
      ;   mousey.l = WindowMouseY()-GetSystemMetrics_(#SM_CYCAPTION)-GetSystemMetrics_(#SM_CYSIZEFRAME)
      ;     
      ; if you want To detect when the mouse leaves the window, you could set a TrackMouseEvent_()
      ;
      ;   mouseleave.tagTRACKMOUSEEVENT
      ;   mouseleave\cbSize = SizeOf(tagTRACKMOUSEEVENT)
      ;   mouseleave\dwFlags = #TME_LEAVE
      ;   mouseleave\hwndTrack = main_whnd
      ;   TrackMouseEvent_(@mouseleave)     
      ;
      ; when using SetCapture_() windows 'prefilters' messages, that is you won't receive
      ; messages unless another condition is met (virtual keys, mousebuttons, etc.)
      ; so you can't use SetCapture() to see if the cursor left the area with no button
      ; pressed
      ;
      ;
    Case #WM_LBUTTONDOWN
      ;
      ; Debug "513 $201 #WM_LBUTTONDOWN lmb down"
      ;
      mouselmb = #True
      ;
      ; if a mousebutton is pressed, and the cursor is moved outside the window client area
      ; no more messages will be received, including the WM_LBUTTONUP message
      ; to make sure such a message is received grab all messages until we got what we
      ; want
      ;
      SetCapture_(main_whnd)
      ;
    Case #WM_LBUTTONUP
      ;
      ; Debug "514 $202 #WM_LBUTTONUP lmb up"
      ;
      mouselmb = #False
      ;
      ReleaseCapture_()
      ;
    Case 516
      ; rmb down
    Case 517
      ; rmb up
    Case 519
      ; mmb down
    Case 520
      ; mmb up
    Case 522
      event_parameter.l = EventwParam()     
      If event_parameter>0
        Debug "522 $20A eventwparam>0 scrollwheel up"
      Else
        Debug "522 $20A eventwparam<0 scrollwheel down"
      EndIf       
    Case 674
      Debug "674 ?"
    Case #WM_MOUSELEAVE
      ;
      Debug "675 $2A3WM_MOUSELEAVE mouse left window (after a trackmouseevent was used)"
      ; 
      ; only generated after calling TrackMouseEvent_(), see #WM_MOUSEMOVE above
      ;
    Default
      Debug event
  EndSelect
  ; 
  If mouselmb = #True
    StartDrawing(WindowOutput())
    Line(mousex,mousey,1,1,RGB(0,0,0))
    StopDrawing()
  EndIf
  ;
Until done = #True
;
; x_end()
; x_hidedebugger() 
pat :twisted: