Code : Tout sélectionner
;/ Pointeur + Cache pointeur pour précision / Lacher interdit sur autre dominos
InitSprite()
InitKeyboard()
InitMouse()
#AffichageGrille=#False
#LargeurDomino=33
#Largeur=1024
#Hauteur=768
#Pas=#LargeurDomino+1
OpenWindow(0,0,0,#Largeur,#Hauteur, "Dominos...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,#Largeur,#Hauteur,0,0,0)
Enumeration 255
#CachePointeur
#Pointeur
#ZoneJeu
EndEnumeration
;{/ Création du Pointeur
CreateSprite(#Pointeur,1,1)
;}
;{/ Création du Cache Pointeur
CreateSprite(#CachePointeur, 20, 20)
StartDrawing(SpriteOutput(#CachePointeur))
Box(0,0,20,20,0)
LineXY(0,0,0,10,RGB(255,255,255))
LineXY(0,0,10,0,RGB(255,255,255))
LineXY(0,10,10,0,RGB(255,255,255))
FillArea(1,1,RGB(255,255,255),RGB(255,255,255))
LineXY(0,0,15,15,RGB(255,0,0))
FillArea(0,0,0,RGB(255,0,0))
StopDrawing()
;}
;{/ Création de la zone de jeu
CreateSprite(#ZoneJeu, 28*#Pas,18*#Pas)
StartDrawing(SpriteOutput(#ZoneJeu))
Box(0,0,SpriteWidth(#ZoneJeu),SpriteHeight(#ZoneJeu),0)
Box(4,4,SpriteWidth(#ZoneJeu)-8,SpriteHeight(#ZoneJeu)-8,43008)
StopDrawing()
;}
Structure Domino
id.l
x.l
y.l
Oldx.l
Oldy.l
EndStructure
Global NewList Domino.Domino()
Procedure CreationDomino(id,x,y,g,d)
AddElement(Domino())
Domino()\id=id
Domino()\x=x
Domino()\y=y
CreateSprite(id,#LargeurDomino,#LargeurDomino*2+1)
StartDrawing(SpriteOutput(id))
Box(0,0,#LargeurDomino,#LargeurDomino*2+1,RGB(255,255,255)) ;/ Carré blanc
;/ Tour du Domino
LineXY(0,0,#LargeurDomino*2,0,1)
LineXY(0,#LargeurDomino*2,#LargeurDomino*2,#LargeurDomino*2,1)
LineXY(0,#LargeurDomino+1,#LargeurDomino*2,#LargeurDomino+1,1)
LineXY(0,0,0,#LargeurDomino*2,1)
LineXY(#LargeurDomino-1,0,#LargeurDomino-1,#LargeurDomino*2,1)
;/ Bords invisibles
Plot(0,0,0)
Plot(0,#LargeurDomino*2,0)
Plot(#LargeurDomino-1,0,0)
Plot(#LargeurDomino-1,#LargeurDomino*2,0)
radius.f=#LargeurDomino/12
L.f=#LargeurDomino/4
Select g
Case 0
Case 1
Circle(#LargeurDomino/2,#LargeurDomino/2,radius,1)
Case 2
Circle(L*3,L,radius,1)
Circle(L,L*3,radius,1)
Case 3
Circle(L*3,L,radius,1)
Circle(L,L*3,radius,1)
Circle(#LargeurDomino/2,#LargeurDomino/2,radius,1)
Case 4
Circle(L,L,radius,1)
Circle(L*3,L,radius,1)
Circle(L,L*3,radius,1)
Circle(L*3,L*3,radius,1)
Case 5
Circle(L,L,radius,1)
Circle(L*3,L,radius,1)
Circle(L,L*3,radius,1)
Circle(L*3,L*3,radius,1)
Circle(#LargeurDomino/2,#LargeurDomino/2,radius,1)
Case 6
Circle(L,L,radius,1)
Circle(L*3,L,radius,1)
Circle(L,L*3,radius,1)
Circle(L*3,L*3,radius,1)
Circle(L,L*2,radius,1)
Circle(L*3,L*2,radius,1)
EndSelect
Select d
Case 0
Case 1
Circle(#LargeurDomino/2,#LargeurDomino+ #LargeurDomino/2,radius,1)
Case 2
Circle(L*3,#LargeurDomino+ L,radius,1)
Circle(L,#LargeurDomino+ L*3,radius,1)
Case 3
Circle(L*3,#LargeurDomino+ L,radius,1)
Circle(L,#LargeurDomino+ L*3,radius,1)
Circle(#LargeurDomino/2,#LargeurDomino+ #LargeurDomino/2,radius,1)
Case 4
Circle(L,#LargeurDomino+ L,radius,1)
Circle(L*3,#LargeurDomino+ L,radius,1)
Circle(L,#LargeurDomino+ L*3,radius,1)
Circle(L*3,#LargeurDomino+ L*3,radius,1)
Case 5
Circle(L,#LargeurDomino+ L,radius,1)
Circle(L*3,#LargeurDomino+ L,radius,1)
Circle(L,#LargeurDomino+ L*3,radius,1)
Circle(L*3,#LargeurDomino+ L*3,radius,1)
Circle(#LargeurDomino/2,#LargeurDomino+ #LargeurDomino/2,radius,1)
Case 6
Circle(L,#LargeurDomino+ L,radius,1)
Circle(L*3,#LargeurDomino+ L,radius,1)
Circle(L,#LargeurDomino+ L*3,radius,1)
Circle(L*3,#LargeurDomino+ L*3,radius,1)
Circle(L,#LargeurDomino+ L*2,radius,1)
Circle(L*3,#LargeurDomino+ L*2,radius,1)
EndSelect
StopDrawing()
EndProcedure
For h= 0 To 6
For b=h To 6
CreationDomino(id,#Pas*id+#Pas,(Int(#Hauteur/#Pas)*#Pas)-#Pas*2,h,b)
id+1
Next
Next
MouseLocate(#Largeur/2,#Hauteur/2)
DominoDeplace=-1
Repeat
Repeat
ExamineKeyboard()
Event = WindowEvent()
If Event=#PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
End
EndIf
Until Event = 0
FlipBuffers()
ClearScreen(32768)
;/ Dessine la zone de Jeu
DisplaySprite(#ZoneJeu,#Pas,#Pas)
;/ Dessin de la grille
If #AffichageGrille
StartDrawing(ScreenOutput())
For n=0 To #Hauteur Step #Pas
LineXY(0,n,#Largeur,n)
Next
For n=0 To #Largeur Step #Pas
LineXY(n,0,n,#Hauteur)
Next
StopDrawing()
EndIf
;/ Détermine les coordonnés de la souris
ExamineMouse()
x=MouseX()
y=MouseY()
;/ Clic & Collision
If MouseButton(#PB_MouseButton_Left)
If DominoDeplace=-1
;/ détecte quel domino a été cliqué ( début déplacement )
ForEach Domino()
If SpriteCollision(#Pointeur,x,y,Domino()\id,Domino()\x,Domino()\y)
DominoDeplace=ListIndex(Domino())
;/ détermine l'offset
offsetX=x-Domino()\x
offsetY=y-Domino()\y
;/ mémorise où était placé le domino
Domino()\Oldx=Domino()\x
Domino()\Oldy=Domino()\y
Break
EndIf
Next
Else
;/ On déplace le domino où est la souris ( pour affichage quand domino cliqué )
SelectElement(Domino(),DominoDeplace)
Domino()\x=x-offsetX
Domino()\y=y-offsetY
;/ Rotation Clic droit en plus
If MouseButton(#PB_MouseButton_Right)
beep_(700,15)
EndIf
EndIf
Else
If DominoDeplace<>-1
;- Domino laché
;/ Calage sur la grille ( gestion plus à gauche / plus à droite )
SelectElement(Domino(),DominoDeplace)
tx.f=Domino()\x/#Pas
If tx-Int(tx)>0.6
Domino()\x=Domino()\x/#Pas*#Pas+#Pas
Else
Domino()\x/#Pas*#Pas
EndIf
ty.f=Domino()\y/#Pas
If ty-Int(ty)>0.6
Domino()\y=Domino()\y/#Pas*#Pas+#Pas
Else
Domino()\y/#Pas*#Pas
EndIf
;- Détecte si collision avec un autre domino ( sinon le repositione à son origine )
SelectElement(Domino(),DominoDeplace)
tid=Domino()\id
tx=Domino()\x
ty=Domino()\y
toldx=Domino()\Oldx
toldy=Domino()\Oldy
For n=0 To CountList(Domino())-1
If n<>DominoDeplace
SelectElement(Domino(),n)
If SpriteCollision(Domino()\id,Domino()\x,Domino()\y,tid,tx,ty)
Debug n
Debug DominoDeplace
beep_(300,100)
SelectElement(Domino(),DominoDeplace)
Domino()\x=Domino()\Oldx
Domino()\y=Domino()\Oldy
Break
EndIf
EndIf
Next
EndIf
DominoDeplace=-1
EndIf
;/ Affichage
ForEach Domino()
DisplayTransparentSprite(Domino()\id,Domino()\x,Domino()\y)
Next
DisplayTransparentSprite(#Pointeur,x,y)
DisplayTransparentSprite(#CachePointeur,x,y)
Delay(1)
ForEver