Page 1 sur 2

un tetris

Publié : lun. 01/oct./2012 21:53
par SPH
Bon,
je m'ennuie fort alors je vais faire un tetris. Mais comme je n'ai jamais fait de OpenWindow, quel squelette de code me proposez vous ?

Merci

Re: un tetris

Publié : lun. 01/oct./2012 22:01
par Frenchy Pilou
Sinon pour inspiration, et changer un petit peu le concept
ici un Teris cylindrique en ligne! ;)
Il y a le code ;) (en Processing...mais c'est très lisible)

Re: un tetris

Publié : lun. 01/oct./2012 22:21
par falsam
Le code d'Ollivier me déconcerte en particulier les macros. Mais il fonctionne. Ne regarde pas si tu souhaites développer ton propre tetris :)
Lien sur le forum anglais : http://www.purebasic.fr/english/viewtop ... 31#p288931

Re: un tetris

Publié : lun. 01/oct./2012 22:27
par SPH
Ce n'est pas temps l'idée des options du tetris qu'il me manque.

Peut etre que je devrais broder tetris sur ce code :

Code : Tout sélectionner

If OpenWindow(0, 400, 40, 400, 600, "Tetris", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic

Re: un tetris

Publié : mar. 02/oct./2012 9:10
par kelebrindae
@Falsam:
Ah oui, le Tetris d'Ollivier! Je m'en rappelle bien parce ça m'avait impressionné: à mi-chemin du "mind-fuck", mais incroyablement compact.
Il avait du génie avec les macros; dommage qu'on ne le voit plus par ici...

@SPH:
Une petite remarque sur le squelette que tu proposes: le WaitWindowEvent() bloque l'exécution du programme (à moins que tu ne précises une durée d'attente maxi dans le paramètre) jusqu'à ce qu'un événement Windows se produise; ce n'est pas souhaitable dans un jeu, où il faut plutôt privilégier le "temps réel". De plus, cette instruction ne gère qu'un seul évènement à la fois => si plusieurs évènements se produisent simultanément, ils vont se placer en file d'attente et seront traités aux itérations suivantes.

Perso, je proposerais plutôt un truc comme ça:

Code : Tout sélectionner

  ;- Main loop
  Repeat
    Delay(1)
    Repeat
      ; Traite TOUS les événements Windows, afin d'éviter qu'ils s'accumulent dans la file d'attente.
      Event = WindowEvent()
      Select Event
        Case #PB_Event_CloseWindow
          Quit = #True
      EndSelect
    Until Event = 0
  
    ;- Keyboard
    If ExamineKeyboard()
      ; ...Gestion du clavier...  
    EndIf
    
    ;- Mouse
    If ExamineMouse()
      ; ...Gestion de la souris si tu l'utilises (pas forcément nécessaire, dans un Tetris)...  
    EndIf
    
    ;- Logique du jeu
    
    ;- Gestion des graphismes (DisplaySprites ou autre)
    
    ;- Flipbuffers pour affichage et fin de la boucle
    FlipBuffers()
  
  Until Quit = #True

Re: un tetris

Publié : mar. 02/oct./2012 10:36
par Kwai chang caine
dommage qu'on ne le voit plus par ici...
Tu as raison, moi aussi il me manque, une grande perte pour ce forum :(
Un cerveau perpetuellement torturé, mais d'une puissance ..... 8O

Re: un tetris

Publié : mar. 02/oct./2012 11:09
par Le Soldat Inconnu
@kelebrindae : Presque d'accord avec toi, tu enlèves le "Delay(1)" et c'est bon.

Il n'est pas utile car c'est le Flipbuffer() qui gère la synchro avec l'écran (donc 60hz en gros en général sur un LCD), donc ton Flipbuffer() va générer de l'attente à lui tout seul. pas besoin d'en rajouter.

Re: un tetris

Publié : mar. 02/oct./2012 14:12
par SPH
Merci kele, tu as compris mon probleme. :wink:

Re: un tetris

Publié : mar. 02/oct./2012 16:17
par SPH
Le code d'ollivier :

Code : Tout sélectionner

Macro BL(X)
  For I=0 To 3
    X
  Next
EndMacro
Dim G(14,28):Dim G2(14,28):Dim C(1);##
Macro IT
  X+PX(PC,I,Rt),Y+PY(PC,I,Rt)
EndMacro
Dim PX(6,3,3):Dim PY(6,3,3);#####
Macro F(X,Y)
  For X=0 To Y
  EndMacro
  Macro N
  Next
EndMacro
Macro Q
EndIf
EndMacro
F(I,28)
G(1,I)=1
G(13,I)=1
G(I%13,27)=1
N
F(Pe,6)
eC=0
F(Eg,1)
F(PL,3);########
If Val("$"+Mid("33F06336747172",2*Pe+1+Eg,1))&(1<<PL)
  F(Ag,3)
  Y=1-PL
  A=1.57*Ag;
  C=Cos(A)
  S=Sin(A)
  PX(Pe,eC,Ag)=C*Eg-S*Y
  PY(Pe,eC,Ag)=S*Eg+C*Y
  N
  eC+1
  Q
  N
  N
  N;##
  Macro K0
    AddKeyboardShortcut
  EndMacro
  OpenWindow(0,0,0,208,432,"",$CF0001);####
  K0(0,37,10)
  K0(0,40,32)
  K0(0,39,12)
  K0(0,38,16)
  X=7
  Y=2
  D=1000
  C(0)=$FFFFFF;###
  C(1)=$1
  Ok=1
  Repeat
    Delay(1)
    Et=WindowEvent()
    StartDrawing(WindowOutput(0));###
    F(A,28)
    F(B,14)
    Box(B*16-16,(A-1)*16,16,16,C(G(B,A)|G2(B,A)))
    N
    N
    StopDrawing()
    If Ok
      BL(G2(IT)=0)
      MN=0
      If Et=13101
        MN=EventMenu()
        If MN=32
          CH!1
          Q
          Q;#######
          EL=ElapsedMilliseconds()
          If EL>T Or CH
            T=EL+D
            Y+1
            Q
            CA=0
            F(I,3)
            If G(IT)
              CA=1
              Q
              N
              If CA
                Y-1
                CH=0
                MN=0
                BL(G(IT)=1)
                X=7
                Y=2
                SC+1
                If D>100
                  D-10
                  Q
                  DY=0;###########
                  For Y3=26 To 0 Step -1
                    CM=1
                    For X3=1 To 12
                      If G(X3,Y3)=0
                        CM=0
                        Q
                        ;###############
                        G(X3,Y3+DY)=G(X3,Y3)
                        N
                        If CM
                          DY+1
                          Q
                          If Y3-DY<=0
                            Break
                            Q
                            N
                            SC+(DY*(DY+1));######
                            SetWindowTitle(0,Str(SC))
                            PC=Random(6)
                            Rt=Random(3)
                            Ok=1
                            F(I,3)
                            If G(IT)
                              Ok=0
                              Q
                              N
                            Else
                              BL(G2(IT)=1)
                              Q
                              BL(G2(IT)=0)
                              NS=0
                              If MN&8
                                NS=MN-11
                                Q
                                If NS
                                  X+NS
                                  Q
                                  C0=0;##
                                  F(I,3)
                                  If G(IT)
                                    C0=1
                                    Q
                                    N
                                    If C0
                                      X-NS
                                      Q
                                      If MN&16
                                        Rt+1
                                        Rt&3
                                        Q
                                        C3=0
                                        F(I,3)
                                        If G(IT)
                                          C3=1
                                          Q
                                          N
                                          If C3
                                            Rt-1
                                            Rt&3
                                            Q
                                            BL(G2(IT)=1)
                                            Q
                                          Until Et=16
                                          

Re: un tetris

Publié : mer. 03/oct./2012 3:31
par Huitbit
Hello,
Le Soldat Inconnu a écrit :@kelebrindae : Presque d'accord avec toi, tu enlèves le "Delay(1)" et c'est bon.
Etrange..., ça m'étonne que Sir kelebrindae mette un delay() pour la décoration.

Il y a eu pas mal de discussions sur ce delay(1), il y a bien longtemps.
Sur les "vieux" pc(je parle de XP :mrgreen: ), s'il est absent, c'est 100% du temps de l'UC d'office et ronflement des ventilos !

Ce "problème"(c'est peut-être le choix du codeur ?) existe dans d'autres langages. Des programmes ridicules affolent les ventilos(sur XP en tout cas).
Et moi, j'aime pô les programmes qui schtroumpfent les ventilos ! :lol:

Me mettrais-je le doigt dans l'oeil ?


Hasta la vista !

Re: un tetris

Publié : mer. 03/oct./2012 7:48
par kelebrindae
C'est vrai que je le mets plus par habitude, ce delay(1)...
Avant, on disait qu'il fallait le mettre pour être sûr que le process ne consomme pas tout le CPU disponible, mais ton argument avec le FlipBuffers est convaincant, surtout si on a bien précisé "#PB_Screen_SmartSynchronization" dans le OpenScreen.

Dans l'aide de "Delay", on trouve ceci:
Remarks
Delay is especially useful in event loops with WindowEvent() or ExamineKeyboard(), so these functions do not "eat" the entire CPU power.
Mais est-ce toujours valable ? :?

Disons qu'au pire, même s'il ne sert à rien, on ne perd pas grand-chose (1/16ème du temps dispo à chaque itération pour un écran à 60Hz, quand même)...

Re: un tetris

Publié : mer. 03/oct./2012 7:55
par SPH
Ca donc :

Code : Tout sélectionner

OpenWindow(0, 400, 40, 400, 600, "Tetris", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Screen_SmartSynchronization)

Re: un tetris

Publié : mer. 03/oct./2012 8:53
par Le Soldat Inconnu
Oui, a partir du moment ou tu as la synchronisation, tu attends forcément. Pour un écran 60hz, tu feras 60 boucle par seconde. Sauf si ton code est trop gourmand et nécessite plus d'1/60 de seconde pour parcourir la boucle. Dans ce cas la, tu tombe à 30 images/s au lieu de 60 image/s.
Par contre, si tu pars sans synchronisation, on peut mettre un Delai(), mais quel est l'intérêt de ne pas activer la synchro. ça sert à rien de se vanter d'avoir un jeu qui tourne à 250 image/s puisque de toute façon, un écran 60hz n'en affichera pas plus de 60.

Re: un tetris

Publié : mer. 03/oct./2012 19:11
par beauregard
Huitbit a écrit :Hello,
Le Soldat Inconnu a écrit :@kelebrindae : Presque d'accord avec toi, tu enlèves le "Delay(1)" et c'est bon.
Etrange..., ça m'étonne que Sir kelebrindae mette un delay() pour la décoration.

Il y a eu pas mal de discussions sur ce delay(1), il y a bien longtemps.
Sur les "vieux" pc(je parle de XP :mrgreen: ), s'il est absent, c'est 100% du temps de l'UC d'office et ronflement des ventilos !

Ce "problème"(c'est peut-être le choix du codeur ?) existe dans d'autres langages. Des programmes ridicules affolent les ventilos(sur XP en tout cas).
Et moi, j'aime pô les programmes qui schtroumpfent les ventilos ! :lol:

Me mettrais-je le doigt dans l'oeil ?


Hasta la vista !
Non parce que ça fait vachement mal, alors oui, un petit Delay(1) après le FlipBuffers() c'est un couple inséparable. ;)

Re: un tetris

Publié : jeu. 04/oct./2012 19:41
par Fig
Le flipbuffer attend peut être, mais est ce qu'il rend la main au système d'exploitation comme le delay le fait ?