un tetris
un tetris
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
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
-
- Messages : 2194
- Inscription : jeu. 27/janv./2005 19:07
Re: un tetris
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)
ici un Teris cylindrique en ligne!

Il y a le code

Dernière modification par Frenchy Pilou le mar. 02/oct./2012 2:27, modifié 1 fois.
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: un tetris
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

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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: un tetris
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 :
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
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: un tetris
@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:
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.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: un tetris
Tu as raison, moi aussi il me manque, une grande perte pour ce forumdommage qu'on ne le voit plus par ici...

Un cerveau perpetuellement torturé, mais d'une puissance .....

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: un tetris
@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.
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: un tetris
Merci kele, tu as compris mon probleme. 

!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
Re: un tetris
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
Re: un tetris
Hello,
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
), 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 !
Me mettrais-je le doigt dans l'oeil ?
Hasta la vista !
Etrange..., ça m'étonne que Sir kelebrindae mette un delay() pour la décoration.Le Soldat Inconnu a écrit :@kelebrindae : Presque d'accord avec toi, tu enlèves le "Delay(1)" et c'est bon.
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

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 !

Me mettrais-je le doigt dans l'oeil ?
Hasta la vista !
Elevé au MSX !
-
- Messages : 579
- Inscription : ven. 11/mai/2007 15:21
Re: un tetris
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:
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)...
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:
Mais est-ce toujours valable ?Remarks
Delay is especially useful in event loops with WindowEvent() or ExamineKeyboard(), so these functions do not "eat" the entire CPU power.

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.
Re: un tetris
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: un tetris
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.
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
Re: un tetris
Non parce que ça fait vachement mal, alors oui, un petit Delay(1) après le FlipBuffers() c'est un couple inséparable.Huitbit a écrit :Hello,
Etrange..., ça m'étonne que Sir kelebrindae mette un delay() pour la décoration.Le Soldat Inconnu a écrit :@kelebrindae : Presque d'accord avec toi, tu enlèves le "Delay(1)" et c'est bon.
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), 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 !![]()
Me mettrais-je le doigt dans l'oeil ?
Hasta la vista !

config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Re: un tetris
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
Version de PB : 6.00LTS - 64 bits