je passe sur le forum chaque semaine, et ça fait pourtant plusieurs mois que je n'ai rien postés. Aujourd'hui je compte me rattraper, en vous offrant ce jeu. J'espère qu'il vous apportera quelque chose, aussi bien au niveau de la programmation qu'au niveau du divertissement.
J'attends vos chronos avec impatience, mon meilleur chrono et pour l'instant de deux minutes 35 secondes et 46 centièmes en mode sprint.
Code : Tout sélectionner
;/
;/ - Speed Tetris - Programme Erix14 (2004)
;/ Windows XP SP2 - PureBasic 3.91 - jaPBe 2.4.7.17
;/
#WindowWidth = 800
#WindowHeight = 600
Structure Classement
Mode.b
NomJoueur.b[16]
Chrono.l
EndStructure
Enumeration
#ElementVide
#ElementVert
#ElementRouge
#ElementBleu
#ElementMarron
#ElementJaune
#ElementViolet
#ElementGris
#Image1
#Image2
#Image3
#Image4
#Image5
#BkJeu
#Jeu
#BkFuturElement
#Classement
#Chrono
#Perdu
#CmptARebour
EndEnumeration
Enumeration
#Window
#NouvellePartie
#Regle
#Mode
#Efface
#Quitter
EndEnumeration
Global hWnd,NouvellePartie,ElementX,ElementY,Element,Rotation,Points,m_hMidiOut,m_MIDIOpen.b
Global StartChrono,StopChrono,FuturElement,Nom$,Mode
NewList ListeClassementSprint.Classement()
NewList ListeClassementEndurance.Classement()
Dim TableauJeu.b(10,17)
Dim Forme.l(7,4)
Forme(1,1)=%0100010001000100 : Forme(1,2)=%0000111100000000 : Forme(1,3)=%0100010001000100 : Forme(1,4)=%0000111100000000
Forme(2,1)=%0000011001100000 : Forme(2,2)=%0000011001100000 : Forme(2,3)=%0000011001100000 : Forme(2,4)=%0000011001100000
Forme(3,1)=%0110010001000000 : Forme(3,2)=%1110001000000000 : Forme(3,3)=%0010001001100000 : Forme(3,4)=%1000111000000000
Forme(4,1)=%1110010000000000 : Forme(4,2)=%0010011000100000 : Forme(4,3)=%0000010011100000 : Forme(4,4)=%1000110010000000
Forme(5,1)=%1100011000000000 : Forme(5,2)=%0100110010000000 : Forme(5,3)=%1100011000000000 : Forme(5,4)=%0100110010000000
Forme(6,1)=%0110110000000000 : Forme(6,2)=%1000110001000000 : Forme(6,3)=%0110110000000000 : Forme(6,4)=%1000110001000000
Forme(7,1)=%0110001000100000 : Forme(7,2)=%0010111000000000 : Forme(7,3)=%0100010001100000 : Forme(7,4)=%1110100000000000
Procedure.l BoutonImage(ImageIndex.l, longueur.l, hauteur.l, Texte.s)
ImageID.l = CreateImage(ImageIndex, longueur, hauteur)
a.f = 150 / hauteur
StartDrawing(ImageOutput())
For T = 0 To hauteur
c = (hauteur-T)*a + 60
Line(0,T,longueur,0, RGB(0,c,0))
Next
DrawingMode(1)
Locate(10, 2)
FrontColor(0,0,0)
DrawText(Texte)
StopDrawing()
ProcedureReturn ImageID
EndProcedure
Procedure ElementImage(ImageIndex,r,g,b)
CreateSprite(ImageIndex,30,30)
StartDrawing(SpriteOutput(ImageIndex))
Box(1,1,28,28,RGB(r,g,b))
Line(0,0,29,0,RGB(r*1.5,g*1.5,b*1.5))
Line(0,0,0,29)
Line(0,29,29,0,RGB(r*0.4,g*0.4,b*0.4))
Line(29,0,0,29)
StopDrawing()
EndProcedure
Procedure.s StrChrono(Chro)
m = Chro / 60000
Chro = Chro % 60000
s = Chro / 1000
Chro = Chro % 1000
c = Chro / 10
ProcedureReturn RSet(Str(m),2,"0")+":"+RSet(Str(s),2,"0")+":"+RSet(Str(c),2,"0")
EndProcedure
Procedure AfficheJeu()
For y=0 To 16
For x=0 To 9
If TableauJeu(x,y) > 0
DisplaySprite(TableauJeu(x,y),10+x*30,10+y*30)
EndIf
Next
Next
EndProcedure
Procedure AfficheElement()
DisplaySprite(#Jeu,0,0)
AfficheJeu()
iPos = %1000000000000000
iForme = Forme(Element,Rotation)
For y=0 To 3
For x=0 To 3
If (iForme & iPos) > 0
DisplaySprite(Element,10+x*30+ElementX*30,10+y*30+ElementY*30)
EndIf
iPos >> 1
Next
Next
FlipBuffers()
EndProcedure
Procedure Affiche_Chrono_Points()
If NouvellePartie = 1 : StopChrono = GetTickCount_() : EndIf
BKJeu_DC = StartDrawing(WindowOutput())
DrawImage(UseImage(#Chrono),35,210)
DrawingMode(1)
DrawingFont(LoadFont(0,"Times New Roman",20,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(59,254) : DrawText(StrChrono(StopChrono - StartChrono));Affiche le Chrono
l = (110 - TextLength(Str(Points))) / 2
Locate(55+l,345) : DrawText(Str(Points));Affiche les points de partie en cour
StopDrawing()
EndProcedure
Procedure Box3D(x,y,longueur,hauteur)
Line(x,y,longueur,0,$FFFFFF)
Line(x,y,0,hauteur)
Line(x,y+hauteur,longueur,0,$000000)
Line(x+longueur,y,0,hauteur+1)
EndProcedure
Procedure Box3DI(x,y,longueur,hauteur)
Line(x,y,longueur,0,$000000)
Line(x,y,0,hauteur)
Line(x,y+hauteur,longueur,0,$FFFFFF)
Line(x+longueur,y,0,hauteur+1)
EndProcedure
Procedure PlaqueMetal(x,y,longueur,hauteur)
Box3D(x,y,longueur,hauteur)
Box3D(x+4,y+4,3,3)
Box3D(x+4,y+hauteur-7,3,3)
Box3D(x+longueur-7,y+4,3,3)
Box3D(x+longueur-7,y+hauteur-7,3,3)
EndProcedure
Procedure AfficheFuturElement()
iPos = %1000000000000000
iForme = Forme(FuturElement,Rotation)
StartDrawing(WindowOutput())
DrawImage(UseImage(#BkFuturElement),80,450)
For y=0 To 3
For x=0 To 3
If (iForme & iPos) > 0
Box(80+x*20,450+y*20,19,19,RGB(128,128,200))
Box3D(80+x*20,450+y*20,19,19)
EndIf
iPos >> 1
Next
Next
StopDrawing()
EndProcedure
Procedure.b Collision(eX,eY)
iPos = %1000000000000000
iForme = Forme(Element,Rotation)
For y=0 To 3
For x=0 To 3
If ((eX + x) > 9 Or (eX + x) < 0) And (iForme & iPos) > 0
ProcedureReturn 1
ElseIf (eY + y) > 16 And (iForme & iPos) > 0
ProcedureReturn 1
ElseIf (iForme & iPos) > 0 And TableauJeu(eX+x,eY+y) > 0
ProcedureReturn 1
EndIf
iPos >> 1
Next
Next
ProcedureReturn 0
EndProcedure
Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
If temp<>0
MessageRequester("Problème", "Erreur dans l'envoi du message MIDI",0)
EndIf
EndProcedure
Procedure MIDIOpen()
If m_MIDIOpen = 0
If midiOutOpen_(@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0
MessageRequester("Problème", "Impossible d'ouvrir le périphérique MIDI",0)
Else
SendMIDIMessage($C0,0,0,0)
m_MIDIOpen = 1
EndIf
EndIf
EndProcedure
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
If m_MIDIOpen
SendMIDIMessage($80 | Canal,0,Note,VelociteDown)
SendMIDIMessage($90 | Canal,0,Note,VelociteUp)
EndIf
EndProcedure
Procedure ChargeInstrument(Canal.b,Instrument.b)
If m_MIDIOpen
SendMIDIMessage($C0 | Canal,0,Instrument,0)
EndIf
EndProcedure
Procedure AfficheClassement()
StartDrawing(WindowOutput())
DrawImage(UseImage(#Classement),540,60)
DrawingFont(LoadFont(0,"Arial",12,#PB_Font_Bold))
DrawingMode(1) : FrontColor(32,32,32) : T = 0
If Mode
ForEach ListeClassementEndurance()
Locate(555,120+T*20) : DrawText(RSet(Str(T+1),2,"0"))
NomJ.s = "" : For c=0 To 15 : NomJ + Chr(ListeClassementEndurance()\NomJoueur[c])
If TextLength(NomJ) > 80 : Break : EndIf :Next
Locate(585,120+T*20) : DrawText(NomJ)
Locate(680,120+T*20) : DrawText(StrChrono(ListeClassementEndurance()\Chrono))
T + 1
Next
Else
ForEach ListeClassementSprint()
Locate(555,120+T*20) : DrawText(RSet(Str(T+1),2,"0"))
NomJ.s = "" : For c=0 To 15 : NomJ + Chr(ListeClassementSprint()\NomJoueur[c])
If TextLength(NomJ) > 80 : Break : EndIf :Next
Locate(585,120+T*20) : DrawText(NomJ)
Locate(680,120+T*20) : DrawText(StrChrono(ListeClassementSprint()\Chrono))
T + 1
Next
EndIf
FrontColor(64,32,32)
If Mode : Locate(590,527) : DrawText("Mode endurance")
Else : Locate(605,527) : DrawText("Mode sprint")
EndIf
StopDrawing()
EndProcedure
Procedure ChargeClassement()
ClearList(ListeClassementSprint())
ClearList(ListeClassementEndurance())
iFichier = ReadFile(#PB_Any,"c:\SpeedTetris.dat")
If iFichier
While Eof(iFichier) = 0
ReadData(@ListeClassement.Classement,SizeOf(Classement))
If ListeClassement\Mode
AddElement(ListeClassementEndurance())
ListeClassementEndurance()\Mode = ListeClassement\Mode
For c=0 To 15 : ListeClassementEndurance()\NomJoueur[c] = ListeClassement\NomJoueur[c] : Next
ListeClassementEndurance()\Chrono = ListeClassement\Chrono
Else
AddElement(ListeClassementSprint())
ListeClassementSprint()\Mode = ListeClassement\Mode
For c=0 To 15 : ListeClassementSprint()\NomJoueur[c] = ListeClassement\NomJoueur[c] : Next
ListeClassementSprint()\Chrono = ListeClassement\Chrono
EndIf
Wend
CloseFile(iFichier)
EndIf
EndProcedure
Procedure SauveClassement()
iFichier = CreateFile(#PB_Any,"c:\SpeedTetris.dat")
If iFichier
ForEach ListeClassementSprint()
WriteData(@ListeClassementSprint(),SizeOf(Classement))
Next
ForEach ListeClassementEndurance()
WriteData(@ListeClassementEndurance(),SizeOf(Classement))
Next
CloseFile(iFichier)
EndIf
EndProcedure
Procedure FinDeLaPartie()
StopChrono = GetTickCount_()
NouvellePartie = 0
Chrono = StopChrono - StartChrono
iPlace = 0
If Mode
ForEach ListeClassementEndurance()
If Chrono <= ListeClassementEndurance()\Chrono
Break
EndIf
iPlace + 1
Next
If iPlace > 18 : ProcedureReturn : EndIf
Nom$ = InputRequester("Bravo, tu es le N° "+Str(iPlace+1),"Entre ton nom :",Nom$)
SelectElement(ListeClassementEndurance(),iPlace)
If iPlace = CountList(ListeClassementEndurance())
AddElement(ListeClassementEndurance())
Else
InsertElement(ListeClassementEndurance())
EndIf
For c=0 To 15 : ListeClassementEndurance()\NomJoueur[c] = Asc(Mid(Nom$,c+1,1)) : Next
ListeClassementEndurance()\Mode = Mode
ListeClassementEndurance()\Chrono = Chrono
If CountList(ListeClassementEndurance()) > 19
LastElement(ListeClassementEndurance())
DeleteElement(ListeClassementEndurance())
EndIf
Else
ForEach ListeClassementSprint()
If Chrono <= ListeClassementSprint()\Chrono
Break
EndIf
iPlace + 1
Next
If iPlace > 18 : ProcedureReturn : EndIf
Nom$ = InputRequester("Bravo, tu es le N° "+Str(iPlace+1),"Entre ton nom :",Nom$)
SelectElement(ListeClassementSprint(),iPlace)
If iPlace = CountList(ListeClassementSprint())
AddElement(ListeClassementSprint())
Else
InsertElement(ListeClassementSprint())
EndIf
For c=0 To 15 : ListeClassementSprint()\NomJoueur[c] = Asc(Mid(Nom$,c+1,1)) : Next
ListeClassementSprint()\Mode = Mode
ListeClassementSprint()\Chrono = Chrono
If CountList(ListeClassementSprint()) > 19
LastElement(ListeClassementSprint())
DeleteElement(ListeClassementSprint())
EndIf
EndIf
SauveClassement()
EndProcedure
Procedure MemorisePosition()
iPos = %1000000000000000
iForme = Forme(Element,Rotation)
For y=0 To 3
For x=0 To 3
If (iForme & iPos) > 0
TableauJeu(ElementX+x,ElementY+y) = Element
EndIf
iPos >> 1
Next
Next
PlayNoteMIDI(0,64,127,127)
NbLigne = 0
For y=0 To 16
Ligne = 0
For x=0 To 9
If TableauJeu(x,y) > 0
Ligne + 1
EndIf
Next
If Ligne = 10
For xx=0 To 9
For yy=y To 1 Step -1
TableauJeu(xx,yy) = TableauJeu(xx,yy-1)
Next
TableauJeu(xx,0) = 0
Next
DisplaySprite(#Jeu,0,0)
AfficheJeu()
FlipBuffers()
NbLigne + 1
Points + 5 + NbLigne*5
Affiche_Chrono_Points()
PlayNoteMIDI(1,64,127,127)
If Points >= 500 And Mode = 0
FinDeLaPartie()
ProcedureReturn
EndIf
If Points >= 5000 And Mode = 1
FinDeLaPartie()
ProcedureReturn
EndIf
Delay(100)
EndIf
Next
Element = FuturElement
x = Random(6)+1
While x = FuturElement
x = Random(6)+1
Wend
FuturElement = x
Rotation = 1
ElementX = 5
ElementY = 0
If Collision(ElementX,ElementY) > 0
NouvellePartie = 0
PlayNoteMIDI(1,80,127,127)
DisplaySprite(#Jeu,0,0)
AfficheJeu()
DisplayTransparentSprite(#Perdu,20,200)
FlipBuffers()
Else
AfficheElement()
AfficheFuturElement()
EndIf
EndProcedure
Procedure LanceNouvellePartie()
Element = Random(6)+1
x = Random(6)+1
While x = Element
x = Random(6)+1
Wend
FuturElement = x
Rotation = 1
ElementX = 4
ElementY = 0
Points = 0
Chrono = 0
For y=0 To 16
For x=0 To 9
TableauJeu(x,y) = 0
Next
Next
StopChrono = StartChrono
Affiche_Chrono_Points()
For T=4 To 0 Step -1
PlayNoteMIDI(1,64,127,127)
DisplaySprite(#Jeu,0,0)
DisplayTransparentSprite(#CmptARebour+T,80,120)
FlipBuffers()
Delay(1000)
Next
PlayNoteMIDI(2,64,127,127)
Delay(200)
PlayNoteMIDI(2,69,127,127)
Delay(200)
DisplaySprite(#Jeu,0,0)
AfficheElement()
FlipBuffers()
StartChrono = GetTickCount_()
AfficheFuturElement()
NouvellePartie = 1
EndProcedure
Procedure mycallback(WindowID, Message, lParam, wParam)
result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_PAINT; création de l'arrière plan de la fenêtre
hRgnTitre = CreateRoundRectRgn_(0,0,#WindowWidth,50,50,50)
hRgn = CreateRoundRectRgn_(20,0,#WindowWidth-20,#WindowHeight,50,50)
CombineRgn_(hRgn, hRgn, hRgnTitre, #RGN_OR)
Hdc = GetDC_(hWnd)
; création de la première image
hSrcDC = CreateCompatibleDC_(Hdc)
hBmpSrc = CreateCompatibleBitmap_(Hdc,#WindowWidth,#WindowHeight)
SelectObject_(hSrcDC,hBmpSrc)
UseImage(#BkJeu)
BKJeu_DC = StartDrawing(ImageOutput())
BitBlt_(hSrcDC,0,0,#WindowWidth,#WindowHeight,BKJeu_DC,0,0,#SRCCOPY)
StopDrawing()
; création de la deuxième image
hDestDC = CreateCompatibleDC_(Hdc)
hBmpDest = CreateCompatibleBitmap_(Hdc,#WindowWidth,#WindowHeight)
SelectObject_(hDestDC,hBmpDest)
brush = CreateSolidBrush_($FFFFFF)
SelectObject_(hDestDC,brush)
pen = CreatePen_(0,4,RGB(0,0,0))
SelectObject_(hDestDC,pen)
RoundRect_(hDestDC,21,1,#WindowWidth-21,#WindowHeight-1,48,48)
RoundRect_(hDestDC,1,1,#WindowWidth-1,48,48,48)
; synthèse des deux images
BitBlt_(hDestDC,0,0,#WindowWidth,#WindowHeight,hSrcDC,0,0,#SRCAND)
; on affecte l'arrière plan à la fenêtre
hBrush = CreatePatternBrush_(hBmpDest)
SetClassLong_(hWnd,#GCL_HBRBACKGROUND, hBrush)
InvalidateRect_(hWnd,#Null, #True)
SetWindowRgn_(hWnd, hRgn, #True)
DeleteObject_(hRgn)
DeleteObject_(hRgnTitre)
DeleteObject_(hSrcDC)
DeleteObject_(hDestDC)
DeleteObject_(hBmpSrc)
DeleteObject_(hBmpDest)
DeleteObject_(pen)
DeleteObject_(brush)
DeleteObject_(hBrush)
ReleaseDC_(hWnd,Hdc)
DeleteDC_(Hdc)
DisplaySprite(#Jeu,0,0)
AfficheJeu()
If NouvellePartie : AfficheElement() : EndIf
FlipBuffers()
AfficheClassement()
Affiche_Chrono_Points()
EndSelect
ProcedureReturn result
EndProcedure
;- Debut du Programme
If InitSprite() = 0 : End : EndIf
SystemPath.s=Space(255)
GetSystemDirectory_(SystemPath,255)
hWnd = OpenWindow(#Window, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "SpeedTetris")
SendMessage_(hWnd,#wm_seticon,#False,ExtractIcon_(0,SystemPath+"\shell32.dll",130)); affecte un icon au programme
OpenWindowedScreen(hWnd, 200,55,320,535,0,0,0)
Timer = SetTimer_(hWnd, 0, 1000, 0)
ChargeClassement()
MIDIOpen()
ChargeInstrument(0,13)
ChargeInstrument(1,14)
ChargeInstrument(2,55)
;{/ Image du classement
CreateImage(#Classement, 220, 500)
StartDrawing(ImageOutput())
For y=0 To 500 Step 2
For x=0 To 220
c = 150 + Random(30)
Plot(x,y,RGB(c,c,c))
Next
For x=0 To 220
c = 120 + Random(30)
Plot(x,y+1,RGB(c,c,c+30))
Next
Next
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",18,#PB_Font_Bold))
FrontColor(50,50,50)
Locate(27,12) : DrawText("CLASSEMENT")
FrontColor(250,250,250)
Locate(25,10) : DrawText("CLASSEMENT")
PlaqueMetal(0,0,220,500)
PlaqueMetal(15,10,190,40)
PlaqueMetal(15,460,190,30)
StopDrawing();}
;{/ Image Chrono & Points
CreateImage(#Chrono, 150, 200)
StartDrawing(ImageOutput())
For y=0 To 200 Step 2
For x=0 To 150
c = 150 + Random(30)
Plot(x,y,RGB(c,c,c))
Next
For x=0 To 150
c = 120 + Random(30)
Plot(x,y+1,RGB(c,c,c+30))
Next
Next
PlaqueMetal(0,0,150,200)
PlaqueMetal(10,30,130,60)
Box(20,40,110,40,RGB(100,160,100))
Box3DI(20,40,110,40)
PlaqueMetal(10,120,130,60)
Box(20,130,110,40,RGB(100,160,100))
Box3DI(20,130,110,40)
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",12))
FrontColor(50,50,50)
Locate(52,7) : DrawText("Chrono")
Locate(52,97) : DrawText("Points")
FrontColor(250,250,250)
Locate(50,5) : DrawText("Chrono")
Locate(50,95) : DrawText("Points")
StopDrawing();}
;{/ image de fond principal
CreateImage(#BkJeu,#WindowWidth,#WindowHeight)
BKJeu_DC = StartDrawing(ImageOutput())
iCouleur.f = 150 / 45
For y = 1 To 45 : Line(0,y,#WindowWidth,0,RGB(64,100 + iCouleur*y,64)) : Next
For y=46 To #WindowHeight
iCouleur.f = y * 150/#WindowHeight
Line(0,y,800,0,RGB(80-iCouleur/2,80-iCouleur/2,160-iCouleur))
Next
For y=46 To #WindowHeight Step 10 : Line(0,y,#WindowWidth,0,RGB(0,0,0)) : Next
For y=0 To #WindowWidth Step 10 : Line(y,46,0,#WindowHeight,RGB(0,0,0)) : Next
DrawingMode(1)
DrawingFont(LoadFont(0,"Arial",24,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(275,5) : DrawText("SPEED TETRIS"); Affiche l'ombre du Titre
FrontColor(255,255,0)
Locate(270,0) : DrawText("SPEED TETRIS"); Affiche le Titre
DrawingFont(LoadFont(0,"Comic Sans MS",12))
FrontColor(150,150,250)
Locate(580,565) : DrawText("Programme ERIX14")
DrawImage(UseImage(#Chrono),35,210)
DrawImage(UseImage(#Classement),540,60)
StopDrawing();}
;{/ Image Perdu
CreateSprite(#Perdu, 280, 80)
StartDrawing(SpriteOutput(#Perdu))
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",64,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(-2,-27) : DrawText("PERDU")
Locate(2,-27) : DrawText("PERDU")
Locate(-2,-23) : DrawText("PERDU")
Locate(2,-23) : DrawText("PERDU")
FrontColor(255,255,255)
Locate(0,-25) : DrawText("PERDU")
*Ptr.LONG = DrawingBuffer()
For y=0 To 79
For x=0 To 279
If *Ptr\l > $202020 : *Ptr\l = $FFFF00-y*$300 : EndIf
*Ptr + 4
Next
Next
StopDrawing();}
;{/ Images 5 4 3 2 1
For T = 0 To 4
CreateSprite(#CmptARebour+T, 170, 256)
StartDrawing(SpriteOutput(#CmptARebour+T))
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",200,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(0,-77) : DrawText(Str(T+1))
Locate(4,-77) : DrawText(Str(T+1))
Locate(0,-73) : DrawText(Str(T+1))
Locate(4,-73) : DrawText(Str(T+1))
FrontColor(255,255,255)
Locate(2,-75) : DrawText(Str(T+1))
*Ptr.LONG = DrawingBuffer()
For y=0 To 255
For x=0 To 169
If *Ptr\l > $202020 : *Ptr\l = $FFFF00-y*$100 : EndIf
*Ptr + 4
Next
Next
StopDrawing()
Next;}
GrabImage(#BkJeu,#BkFuturElement,80,450,80,80)
;{/ création de l'aire de jeu
CreateSprite(#Jeu, 320, 535)
Jeu_DC = StartDrawing(SpriteOutput(#Jeu))
Box(0,0,320,535,$E0A0A0)
DrawingMode(1)
SetTextColor_(Jeu_DC,$F0B0B0)
Font = CreateFont_(24,0,300,0,#FW_BOLD,0,0,0,0,0,0,0,0,"Arial")
SelectObject_(Jeu_DC,Font)
For y=0 To 720 Step 60
Locate(0,y)
DrawText("SPEED TETRIS SPEED TETRIS SPEED")
Locate(-30,y+48)
DrawText("SPEED TETRIS SPEED TETRIS SPEED")
Next
Box3D(0,0,319,534)
Box3D(1,1,317,532)
DeleteObject_(Font)
StopDrawing();}
;{/ création des Elements
ElementImage(#ElementVert,0,160,0)
ElementImage(#ElementRouge,160,0,0)
ElementImage(#ElementBleu,0,100,160)
ElementImage(#ElementMarron,128,64,0)
ElementImage(#ElementJaune,160,160,0)
ElementImage(#ElementViolet,128,0,160)
ElementImage(#ElementGris,64,64,64)
;}/
CreateGadgetList(hWnd)
ButtonImageGadget(#NouvellePartie, 40, 70, 140, 20, BoutonImage(#Image1,140,20,"Nouvelle partie"))
ButtonImageGadget(#Regle, 40, 95, 140, 20, BoutonImage(#Image2,140,20,"Règle du jeu"))
ButtonImageGadget(#Mode, 40, 120, 140, 20, BoutonImage(#Image3,140,20,"Mode de jeu"))
ButtonImageGadget(#Efface, 40, 145, 140, 20, BoutonImage(#Image4,140,20,"Efface classement"))
ButtonImageGadget(#Quitter, 40, 170, 140, 20, BoutonImage(#Image5,140,20,"Quitter"))
SetWindowCallback(@mycallback())
;- Boucle Principale
Repeat
Select WaitWindowEvent()
Case #PB_EventGadget;{ Gestion des bouttons
Select EventGadgetID()
Case #NouvellePartie
LanceNouvellePartie()
Affiche_Chrono_Points()
Case #Efface
If Mode : ClearList(ListeClassementEndurance())
Else : ClearList(ListeClassementSprint())
EndIf
SauveClassement()
SendMessage_(hWnd,#WM_PAINT,0,0)
Case #Regle
Texte.s = " Il faut assembler des éléments formés de carrés,"+Chr(13)
Texte + "de telle façon à obtenir des lignes pleines. Chaque ligne"+Chr(13)
Texte + "pleine disparaît et vous donne des points :"+Chr(13)
Texte + " - une ligne 10 points"+Chr(13)
Texte + " - deux lignes 25 points"+Chr(13)
Texte + " - trois lignes 45 points"+Chr(13)
Texte + " - quatre lignes 70 points"+Chr(13)
Texte + "En mode sprint il faut obtenir 500 points."+Chr(13)
Texte + "En mode endurance il faut obtenir 5000 points."+Chr(13)
Texte + "Ceux qui auront fait cela le plus rapidement possible"+Chr(13)
Texte + "entreront dans le classement. Le but étant d'être"+Chr(13)
Texte + " le plus rapide..."+Chr(13)+Chr(13)
Texte + " - flèche haut : rotation"+Chr(13)
Texte + " - flèche droite : décalage à droite"+Chr(13)
Texte + " - flèche gauche : décalage à gauche"+Chr(13)
Texte + " - flèche bas : chute"+Chr(13)
If NouvellePartie = 0 : MessageRequester("Règle du jeu",Texte,#PB_MessageRequester_Ok) : EndIf
Case #Mode
If Mode = 0 And NouvellePartie = 0: Mode =1
Else : Mode = 0
EndIf
AfficheClassement()
Case #Quitter
End
EndSelect;}
Case #WM_TIMER;{ Timer une seconde
If NouvellePartie
If Collision(ElementX,ElementY+1) : MemorisePosition()
Else : ElementY + 1 : AfficheElement()
EndIf
Affiche_Chrono_Points()
EndIf;}
Case #WM_KEYDOWN;{ Commande clavier
If NouvellePartie
Select EventwParam()
Case 37
If Collision(ElementX-1,ElementY)=0 : ElementX - 1 : AfficheElement() : EndIf
Case 39
If Collision(ElementX+1,ElementY)=0 : ElementX + 1 : AfficheElement() : EndIf
Case 38
Rotation + 1
If Rotation > 4 : Rotation = 1 : EndIf
If Collision(ElementX,ElementY)
Rotation - 1
If Rotation < 1 : Rotation = 4 : EndIf
Else : AfficheElement()
EndIf
Case 40
While Collision(ElementX,ElementY+1) = 0
ElementY + 1
Wend
MemorisePosition()
EndSelect
EndIf;}
Case #WM_LBUTTONDOWN;{ Deplacement de la fenetre
my.l = WindowMouseY()
If my > 0 And my < 45
SendMessage_(hWnd, #WM_NCLBUTTONDOWN, #HTCAPTION, NULL)
EndIf;}
Case #PB_Event_CloseWindow: End
EndSelect
ForEver