un tetris

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

un tetris

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: un tetris

Message 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)
Dernière modification par Frenchy Pilou le mar. 02/oct./2012 2:27, modifié 1 fois.
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: un tetris

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: un tetris

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: un tetris

Message 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
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: un tetris

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: un tetris

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: un tetris

Message par SPH »

Merci kele, tu as compris mon probleme. :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: un tetris

Message 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
                                          

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: un tetris

Message 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 !
Elevé au MSX !
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: un tetris

Message 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)...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: un tetris

Message 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)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: un tetris

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: un tetris

Message 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. ;)
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: un tetris

Message 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 ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre