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 .....

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.

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

), 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 !
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

), 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 !
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 ?