Tssss, Cool Dji aurait pu être 2eme (Mode je ne remue pas du tout le couteau dans la plaiecederavic a écrit :Bouerf, j'avais meme pas vu

Tssss, Cool Dji aurait pu être 2eme (Mode je ne remue pas du tout le couteau dans la plaiecederavic a écrit :Bouerf, j'avais meme pas vu
Code : Tout sélectionner
;*****************************************************************************
;*
;* Season's Greetings PurePunch Demo contest
;* PureBasic 5.00
;* 80 lines of 80 chars, 1 month delay
;*
;* Name : Winter Punch
;* Author : Cool Dji
;* Date : 31 decembre 2012
;* Notes : RAS
;*
;*****************************************************************************
InitEngine3D():InitSprite():InitKeyboard():InitSprite3D():InitSound():InitMouse()
UsePNGImageDecoder():UseOGGSoundDecoder()
Global si.s,n0.s,c,l,t
;- charge des données codées dans l'image - utilisé pour charger des mesh
;- les entiers sont codés sur 16 bits et sont codés de la manière suivante
;- Rouge 0 : chiffre positif, 1 chiffre négatif
;- Vert : octet supérieur (poids fort)
;- Bleu : octet inférieur (poids faible)
;- je convertis les deux octets en binaire pour composer un seul chiffre binaire en 16bits
;- que je transcris en entier
Procedure ri(x.i,y.i)
cl=Point(x,y)
n0=Str(Red(cl))
n1.s=Str(Green(cl))
n2.s=Str(Blue(cl))
sr.s=""
w=Len(Bin(Val(n2)))
If w<8
For q=0 To 8-w-1
sr=sr+"0"
Next
EndIf
si=Bin(Val(n1))+sr+Bin(Val(n2))
t=Val("%"+si)
If n0="1"
t=-t
EndIf
c+1 ; passe au pixel suivant
If c=512 ; si on atteint la fin de la ligne (Image de 512 pixels)
c=0 ; on revient au début
l+1 ; et on saute une ligne
EndIf
EndProcedure
; Sauvegarde des textes
Global Dim At(150,7),Dim T$(11):T$(0)="SNOWMAN":T$(1)="SLOWLY":T$(5)="TOGETHER"
T$(10)="PUREPUNCH":T$(2)="CHANGE[THINGS":T$(3)="FLOWERS"::T$(7)="THINK[BIG"
T$(4)="LOVE":T$(9)="LIFE":T$(6)="PEACE":T$(8)="WORLD"
;- Prépare les carrés pour afficher les textes
Global nc=5000,b
Global Dim dx.f(nc),Dim zx.f(nc),Dim dy.f(nc),Dim zy.f(nc)
For j=1 To nc
zx(j)=(Random(10)-5)/10 ; sens et vitesse de déplacement en X
zy(j)=(Random(10)-5)/10 ; sens et vitesse de déplacement en Y
Next
;- Charge l'image
LoadImage(0,"W1.png")
; Extrait chaque pixel noir de la police de caractère
; et construit une matrice contenant la police
; 1=il faut afficher un carré, 0= pas de carré à afficher
GrabImage(0,1,0,377,130,7)
StartDrawing(ImageOutput(1))
For k=0 To 25 ; 26 caractères
For j=0 To 4
For i=0 To 6
If Point(k*5+j,i)=0 ; est-ce que le point est noir ?
At(k*5+j,i)=1 ;=> oui, c'est un pixel d'un caractère
EndIf
Next
Next
Next
StopDrawing()
; Charge le morceau musical
LoadSound(0,"W.ogg")
; Ouvre un écran
OpenScreen(1024,768,32,"X")
AntialiasingMode(#PB_AntialiasingMode_x6)
; copie les images pour faire les textures
u=0:k=16
For j=1 To 6
CreateTexture(j,128,128)
GrabImage(0,j,u,k,128,128)
StartDrawing(TextureOutput(j))
DrawImage(ImageID(j),0,0,128,128)
StopDrawing()
CreateMaterial(j,TextureID(j))
DisableMaterialLighting(j,1)
u+128
If j=4
u=0
k=128+16
EndIf
Next
; un petit soucis avec le mode transparent
; ça marchait bien en lisant directement la texture par un loadtexture
; mais plus en copiant la texture via un grabimage Grrrr
; ça a bien planté ma démo car j'avais construit un sablier ou l'effet rendu
; du verre transparent était bien plus classe que mon espece de cube avec les balles
; à l'interieur...
MaterialBlendingMode(3,#PB_Material_AlphaBlend)
; creation du sol en 3 parties
; 2 parties latérales
CreatePlane(1,2000,2000,1,1,20,20)
TransformMesh(1,0,0,0,1,1,1,0,0,0)
CreateEntity(1,MeshID(1),MaterialID(1),1420,0,0)
CreateEntity(0,MeshID(1),MaterialID(1),-600,0,0)
; 1 bande centrale composée de carrés bifaces qui se retournent
CreatePlane(2,20,20,1,1,1,1)
Dim Tz(200)
For j=0 To 199
CreateEntity(j+300,MeshID(2),MaterialID(1),410,0,1000-j*20) ; une face neige
CreateEntity(j+500,MeshID(2),MaterialID(6),410,0,1000-j*20) ; une face fleur
RotateEntity(j+500,0,0,180,#PB_Relative)
Tz(j)=j*4
Next
; creation Bonhomme de neige
CreateSphere(5,6.4)
CreateSphere(6,4.5)
CreateSphere(7,0.4)
Restore BN
For j=2 To 8 ; 8 meshs composent le bonhomme
Read.f in
Read.f kn
Read.f xn
Read.f yn
Read.f zn
CreateEntity(j,MeshID(Int(in)),MaterialID(Int(kn)),xn,yn,zn)
Next
; Charge le mesh du cube à balle depuis l'image
; Initialement, je chargeais un sablier avec cette méthode...
; charge la boite transparente qui contient les balles
StartDrawing(ImageOutput(0))
CreateMesh(9)
For j=1 To 12
ri(c,l):m=t:ri(c,l):n=t:ri(c,l):o=t
AddMeshFace(m,n,o)
Next
For j=1 To 24
ri(c,l):m=t:ri(c,l):n=t:ri(c,l):o=t
AddMeshVertex(m,n,o):
Next
StopDrawing()
FinishMesh()
NormalizeMesh(9)
; charge le tour de boite transparente (2 plaques et 4 piliers)
StartDrawing(ImageOutput(0))
CreateMesh(10)
For j=1 To 120
ri(c,l):m=t:ri(c,l):n=t:ri(c,l):o=t
AddMeshFace(m,n,o)
Next
For j=1 To 136
ri(c,l):m=t:ri(c,l):n=t:ri(c,l):o=t
AddMeshVertex(m,n,o):
Next
StopDrawing()
FinishMesh()
NormalizeMesh(10)
; creation de l'entity boite transparente
CreateEntity(9,MeshID(9),MaterialID(3),1000,100,100)
ScaleEntity(9, 0.1, 0.1, 0.1)
EntityPhysicBody(9,#PB_Entity_StaticBody)
; creation de l'entity 2 plaques + 4 piliers
CreateEntity(10,MeshID(10),MaterialID(2),1000,100,100)
ScaleEntity(10, 0.1, 0.1, 0.1)
; Creation des flocons
fe=255:ca.f=0
bf=500:c=0
CreateSphere(2,0.5)
P=350 ;positionne les facons dans un rayon de 350 autour de la caméra
For j=1000 To 5000
v.f=Random(P)-P/2
q.f=Random(P)-P/2
CreateEntity(j,MeshID(2),MaterialID(5),v,Random(200),q)
Next
; Creation des balles dans l'espece de cube
CreateSphere(3,5)
For j=100 To 200
sd=1000+Random(10)
CreateEntity(j,MeshID(3),MaterialID(4),sd,100+Random(10),100+Random(10))
EntityPhysicBody(j,#PB_Entity_SphereBody,1,0,1)
Next
co=RGB(200,200,255)
CreateCamera(0,0,0,100,100)
CameraBackColor(0,co)
Fog(co,100,500,800)
; Creation d'un sprite pour un effet de Fade-on Fade-Off
CreateSprite(0,1024,768,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Box(0,0,1024,768,$ffffff)
StopDrawing()
TransparentSpriteColor(0,0)
CreateSprite3D(0,0)
; Creation d'un sprite pour afficher les textes rouges
CreateSprite(1,8,8,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0,0,8,8,$aaaaff)
StopDrawing()
TransparentSpriteColor(1,1)
CreateSprite3D(1,1)
; on se cale sur le temps qui passe pour les animations
Smt=ElapsedMilliseconds()
PlaySound(0)
Repeat
Smtb=ElapsedMilliseconds()-Smt
ExamineKeyboard()
; affiche un texte régulierement
; routine pas assez précise
Select Smtb
Case 20000 To 202000
Smt=ElapsedMilliseconds()
bf=500
For j=1 To nc
dx(j)=0
dy(j)=0
Next
sa+1
If sa>10
sa=10
EndIf
EndSelect
; Fait pivoter les dalles de sols pour afficher le tapis de fleurs
If ca>150
For j=0 To 199
Tz(j)-1
If (Tz(j)<0) And (Tz(j) >-360)
RotateEntity(300+j,0,0,-0.5,#PB_Relative)
RotateEntity(500+j,0,0,-0.5,#PB_Relative)
EndIf
Next
EndIf
; Fait tomber les flocons de neige
ca+0.5
For j=1000 To 5000
MoveEntity(j,Random(100)/1000,-0.8,Random(100)/1000)
If EntityY(j)<0 ; si un flocon touche le sol
; on le repositionne dans le ciel autour de la caméra
EntityLocate(j,ca+Random(P)-P/2,200,Random(P)-P/2)
EndIf
Next
; Fait tourner l'espece de cube avec les balles dedans
RotateEntity(9,0,0,0.6,#PB_Relative)
RotateEntity(10,0,0,0.6,#PB_Relative)
; Deplace la camera
y.f+0.01
CameraLocate(0,ca+200*Cos(y),5+y*2,200*Sin(y))
CameraLookAt(0,ca,50+10*Cos(y),0)
RenderWorld()
; gere le fade-on du début
If sa<10
fe-1
If fe<0:fe=0:EndIf
Else ; et le fade off de la fin
fe+1
If fe>255:fe=255:EndIf
EndIf
Start3D()
DisplaySprite3D(0,0,0,fe) ; Affiche le sprite pour le fade
; affiche les textes rouges qui sont composés de petits sprites
; qui s'éparpillent au bout d'un moment
b=0:bf-2
bl=bf
If bf<0:bl=0:EndIf
If bf>255:bl=255:EndIf
jb=Len(T$(sa))
s=512-60-jb*30
For ja=1 To jb
a$=Mid(T$(sa),ja,1)
h=Asc(a$)-65
For j=0 To 4
For i=0 To 6
If At(j+h*5,i)=1
For k=1 To 5
b+1
If bl<255
dx(b)+zx(b)
dy(b)+zy(b)
EndIf
DisplaySprite3D(1,s+ja*60+j*10+Random(5)-3+dx(b),250+i*10+Random(5)-3+dy(b),bl)
Next
EndIf
Next
Next
Next
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
DataSection:
Bn:Data.f 5,5,5,6,25,6,5,5,15,25,7
Data.f 2,4,17,29,7,2,6,17,29,7,2,5,10,30,7,2,5,9,30.7,7,2,5,8,31
EndDataSection
Code : Tout sélectionner
;*******************************************************************************
;*
;* Season's Greetings PurePunch Demo contest
;* PureBasic 5.00
;*
;*
;* Name : FAST EDITOR 2D
;* Author : Comtois
;* Date : 19/01/2013
;* Notes : Esc to Quit : Left button add a tile: Right button remove a tile
;*
;*******************************************************************************
InitSprite()
InitKeyboard()
InitMouse()
OpenScreen(1024, 768, 32,"Fast Editor 2D")
#Ajout = 1
#Supprime = 2
;Taille d'un sprite
#LargeurSprite = 32
#HauteurSprite = 32
;Taille de la carte
#LargeurCarte = 32
#HauteurCarte = 24
Global Dim Carte(#LargeurCarte, #HauteurCarte)
;Charge les sprites
LoadSprite(16,"S.bmp")
DisplaySprite(16,0,0)
; Fond = 0
;* Horizontal gauche = 1
;* Horizontal droit = 2
; Horizontal = 3 (combinaison de 1 + 2)
;* Vertical haut = 4
; Angle Haut Droit = 5 (combinaison de 1 + 4)
; Angle Haut Gauche = 6 (combinaison de 2 + 4)
; Té Bas = 7 (combinaison de 1 + 2 + 4)
;* Vertical bas = 8
; Angle Bas Gauche = 9 (combinaison de 1 + 8)
; Angle Bas Droit = 10 (combinaison de 2 + 8)
; Té Haut = 11 (combinaison de 1 + 2 + 8)
; Vertical = 12 (combinaison de 4 + 8)
; Té Droit = 13 (combinaison de 1 + 4 + 8)
; Té Gauche = 14 (combinaison de 2 + 4 + 8)
; Croix = 15 (combinaison de 1 + 2 + 4 + 8)
For I=0 To 7
GrabSprite(i,i*#LargeurSprite,0,#LargeurSprite,#HauteurSprite)
GrabSprite(i+8,i*#LargeurSprite,#HauteurSprite,#LargeurSprite,#HauteurSprite)
Next i
;Souris
GrabSprite(20,0,64, #LargeurSprite, 32)
;Procedure récursive pour adapter les sprites dans le voisinage
;du sprite qu'on ajoute ou supprime
Procedure ControleCarte(x,y,Action)
Protected Sprite, Mem
If x<#LargeurCarte
If Carte(x+1,y)>0 : Sprite|1 : EndIf
EndIf
If x>0
If Carte(x-1,y)>0 : Sprite|2 : EndIf
EndIf
If y<#HauteurCarte
If Carte(x,y+1)>0 : Sprite|4 : EndIf
EndIf
If y>0
If Carte(x,y-1)>0 : Sprite|8 : EndIf
EndIf
If Carte(x,y)>0
If Sprite=0 : Sprite=15 : EndIf
Else
Sprite=0
EndIf
;Mémorise l'état de la carte en x et y
Mem=Carte(x,y)
Carte(x,y)=Sprite
;Si la carte change ou si on supprime un sprite
If Mem<>Carte(x,y) Or Action=#Supprime
If x>0 : ControleCarte(x-1,y,#Ajout) : EndIf
If x<#LargeurCarte : ControleCarte(x+1,y,#Ajout) : EndIf
If y>0 : ControleCarte(x,y-1,#Ajout) : EndIf
If y<#HauteurCarte : ControleCarte(x,y+1,#Ajout) : EndIf
EndIf
EndProcedure
Procedure AfficheCarte()
For j=0 To #HauteurCarte-1
For i=0 To #LargeurCarte-1
DisplaySprite(Carte(i,j),i*#LargeurSprite,j*#HauteurSprite)
Next i
Next j
EndProcedure
Repeat
ExamineKeyboard()
If ExamineMouse()
MouseX = MouseX()
MouseY = MouseY()
PosX=MouseX/#LargeurSprite
PosY=MouseY/#HauteurSprite
; Test si la souris se trouve sur la carte
If PosX<=#LargeurCarte And PosY<=#HauteurCarte
;Supprime un sprite dans la carte
If MouseButton(#PB_MouseButton_Right)
Carte(PosX,PosY)=0
ControleCarte(PosX,PosY,#Supprime)
EndIf
;Ajoute un sprite dans la carte
If MouseButton(#PB_MouseButton_Left)
Carte(PosX,PosY)=99 ; un nombre différent de zéro et différent des numéros de sprites
ControleCarte(PosX,PosY,#ajout)
EndIf
EndIf
EndIf
AfficheCarte()
;Affiche la souris
DisplayTransparentSprite(20,MouseX-#LargeurSprite/2,MouseY-#HauteurSprite/2)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Code : Tout sélectionner
;{ chargement, structure, et variables
UsePNGImageDecoder()
LoadImage(0, "512.png")
LoadFont(0, "Arial Black", 19, #PB_Font_HighQuality)
Structure _positiontype_
x.d
y.d
t.l
x1.d
y1.d
EndStructure
Dim _ennemis_._positiontype_(9, 5)
NewList _tir_._positiontype_()
NewList _explo_._positiontype_()
NewList _tirE_._positiontype_()
NewList _text_._positiontype_()
_newlevel_ = 100
_mex_ = 286
_tex_ = _mex_
_showboubou_ = 0
_vie_ = 3
_div_ = 32
_balle_._positiontype_\x = 294
_balle_\y = 82
_balle_\x1 = (Random(10) - 5) / 5
_balle_\y1 = 1
;}
InitSprite()
InitKeyboard()
OpenWindow(0, 0, 0, 600, 400, "PurePunch", #PB_Window_ScreenCentered| #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 600, 400, 0, 0, 0)
;{ MACRO
Macro _LoadSpriteAt_(i, x, y, w, h)
CreateSprite(i, w, h)
GrabImage(0, 1, x, y, w, h)
StartDrawing(SpriteOutput(i))
DrawImage(ImageID(1), 0, 0)
StopDrawing()
TransparentSpriteColor(i, 0)
EndMacro
Macro _PreparerTextTremblant_(t1)
StartDrawing(ScreenOutput())
DrawingFont(FontID(0))
DrawText(0, 0, t1)
i2 = TextWidth(t1)
j2 = TextHeight(t1) - 1
For i = 0 To i2
For j = 0 To j2
If Point(i, j)
AddElement(_text_())
_text_()\x = i
_text_()\y = j
_text_()\x1 = Random(600)
_text_()\y1 = Random(400)
_text_()\t = Point(i, j)
EndIf
Next
Next
Box(0, 0, i2, j2, 0)
StopDrawing()
EndMacro
Macro _explosion_(i)
If i\t > 0
DisplayTransparentSprite(i\t + 24, i\x - 10, i\y - 10)
EndIf
i\t + 1
If i\t > 15
DeleteElement(i)
EndIf
EndMacro
Macro _Addexplosion_(x1, y1, w, h, t1)
For t2 = 0 To t1
AddElement(_explo_())
_explo_()\x = Random(w) + x1
_explo_()\y = Random(h) + y1
_explo_()\t = - Random(t1)
Next
EndMacro
For i = 0 To 11 ; chargement des aliens
_LoadSpriteAt_(i, i * 24, 50, 24, 16)
Next
For i = 0 To 5; chargement des tirs aliens
_LoadSpriteAt_(i + 12, i * 6, 80, 6, 16)
Next
_LoadSpriteAt_(18, 320, 50, 26, 16) ; vaisseau
_LoadSpriteAt_(19, 0, 0, 510, 50) ; Vaisseau maître
_LoadSpriteAt_(20, 0, 462, 510, 50) ; Terre
_LoadSpriteAt_(21, 22, 110, 468, 15) ; Bouclier
_LoadSpriteAt_(22, 288, 50, 32, 16) ; vaisseau mère
_LoadSpriteAt_(23, 510, 0, 2, 512) ; limite du terrain
For i = 0 To 15 ; chargement des sprites de l'animation des les explosions
_LoadSpriteAt_(i + 24, i * 20, 141, 20, 20)
Next
For i = 0 To 7; chargement des sprites de l'animation de la balle
_LoadSpriteAt_(i + 40, 346 + i * 16, 50, 16, 16)
Next
;}
; Boucle principale
Repeat
Repeat : _event_ = WindowEvent() : Until _event_ = 0 Or _event_ = 16
; compteur servant à temporiser les actions répétitives, telles que l'affichage des aliens
_compteur_ + 1
ExamineKeyboard()
ClearScreen(0)
;{ affichage du décor, et boubou
DisplayTransparentSprite(19, 44, _vaisseauy_) ; Vaisseau maître
DisplayTransparentSprite(20, 44, 350) ; Terre
DisplayTransparentSprite(23, 42, 0) ; limite gauche
DisplayTransparentSprite(23, 556, 0) ; limite droite
; Bouclier du vaisseau Maitre
If _showboubou_ And _tps_boubou_ > 0
_tps_boubou_ - 1
DisplayTransparentSprite(21, 66, 40)
EndIf
;}
If _vie_ > 0
;{ Jeu en cours
; affichage des vies
For i = 1 To _vie_
DisplayTransparentSprite(18, 9, i * 30)
Next
;{ déplacement et initialisation des aliens
If _newlevel_ < 70
; Ajout de nouveaux aliens lors du début d'un niveau
If _compteur_ % 6 = 0
If _newlevel_ < 60
With _ennemis_((59 - _newlevel_) % 10, (59 - _newlevel_) / 10)
\t = _newlevel_ / 10
\x = 294
\y = 40
EndWith
EndIf
_newlevel_ + 1
EndIf
Else
; Déplacement des aliens
_posx_ + _dir_
If _posx_ > = 262 Or _posx_ < = 48
_dir_ = - _dir_
_posy_ + 10
EndIf
EndIf
;}
;{ Traitement évènement sur les aliens
For j = 0 To 5
For i = 0 To 9
With _ennemis_(i, j)
If _newlevel_ = 100 ; initialisation lors du lancement du jeu
\t = - 1
EndIf
If \t <> - 1
If _newlevel_ < 70
; Cinémtique de mise en place des aliens au début d'un niveau
\x + 2 * (i * 30 + _posx_ - \x) / 8
\y + (j * 20 + _posy_ - \y) / 8
Else
; Déplacement normal des aliens
\x = _posx_ + i * 30
\y = _posy_ + j * 20
; Décision d'un tir
If Random(1000) = 0
AddElement(_tirE_())
_tirE_()\t = \t / 2 + 13
_tirE_()\y = \y + 16
_tirE_()\x = \x + 12
EndIf
EndIf
DisplayTransparentSprite(\t * 2 + _compteur_ % 40 / 20, \x, \y) ; on affiche l'alien
; test de collision entre l'alien et la terre
If SpritePixelCollision(20, 44, 350, \t * 2 + _compteur_ % 40 / 20, \x, \y)
_vie_ = 0
EndIf
; test de collision entre l'alien et la balle
If _level_ > 3 And SpritePixelCollision(40, _balle_\x, _balle_\y, \t * 2 + _compteur_ % 40 / 20, \x, \y)
\t = - 1
_Addexplosion_(\x, \y, 24, 16, 20)
_nombreennemis_ - 1
Else
; test de collision entre l'alien et les tirs amis
ForEach _tir_()
If SpritePixelCollision(12, _tir_()\x, _tir_()\y, \t * 2 + _compteur_ % 40 / 20, \x, \y)
DeleteElement(_tir_())
\t = - 1
_nombreennemis_ - 1
_Addexplosion_(\x, \y, 24, 16, 20)
Break
EndIf
Next
EndIf
EndIf
EndWith
Next
Next
;}
;{ si il n'y a plus d'ennemis, on initialise un nouveau niveau
If _nombreennemis_ = 0
_newlevel_ = 0
_level_ + 1
_nombreennemis_ = 60
_dir_ = 2
_posx_ = 150
_posy_ = 110
EndIf
;}
;{ Control du vaisseau
_dirME_ = 0
If KeyboardPushed(#PB_Key_Left)
_mex_ - 3
_dirME_ = - 1
If _mex_ < 44
_mex_ = 44
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
_mex_ + 3
_dirME_ = 1
If _mex_ > 530
_mex_ = 530
EndIf
EndIf
If _compteur_ % 18 = 0 ; temporisation des tirs amis
_tirarmer_ = 1
EndIf
If _tirarmer_ And KeyboardReleased(#PB_Key_Space)
_tirarmer_ = 0
AddElement(_tir_())
_tir_()\x = _mex_ + 10
_tir_()\y = 324
EndIf
;}
DisplayTransparentSprite(18, _mex_, 340) ; affichage du vaisseau
DisplayTransparentSprite(22, _tex_, 65) ; affichage du vaisseau mère
DisplayTransparentSprite(40 + _compteur_ % 32 / 4, _balle_\x, _balle_\y) ; affichage du bon sprite de la balle
;{ Déplacement de la balle
If _level_ > 3
_balle_\x + _balle_\x1
_balle_\y + _balle_\y1
;{ déplacement du vaisseau mère
If _balle_\x + 8 < _tex_ + 16
_tex_ - 4
EndIf
If _balle_\x + 8 > _tex_ + 16
_tex_ + 4
EndIf
;}
;{ rebonds
If _balle_\x < 44 Or _balle_\x > 540
_balle_\x1 = - _balle_\x1
_balle_\x + _balle_\x1
EndIf
;}
; rebond sur le vaisseau mère
If _balle_\y > 60 And SpritePixelCollision(40, _balle_\x, _balle_\y, 22, _tex_, 65)
_balle_\y1 = - _balle_\y1
_balle_\y = 80
EndIf
; rebond sur le vaisseau
If _balle_\y < 344 And SpritePixelCollision(40, _balle_\x, _balle_\y, 18, _mex_, 340)
_balle_\y1 = - _balle_\y1
_balle_\y = 324
_balle_\x1 + _dirME_
If Abs(_balle_\x1) > 5
_balle_\x1 = 5 * Sign(_balle_\x1)
EndIf
EndIf
; collision avec la terre
If SpritePixelCollision(40, _balle_\x, _balle_\y, 20, 44, 350)
_vie_ = 0
EndIf
; Victoire du joueur, car la balle a franchis le boubou
If _balle_\y < 30
_vie_ = - 2
EndIf
EndIf
;}
;{ Déplcement des tirs, et affichage du bouclier si collision
ForEach _tir_()
With _tir_()
\y - 2
DisplayTransparentSprite(12, \x, \y)
If SpritePixelCollision(12, \x, \y, 21, 66, 40) Or \y < - 8
If \y > 0
_showboubou_ = 1
_tps_boubou_ = 8
EndIf
DeleteElement(_tir_())
EndIf
EndWith
Next
;}
;{ Déplacement des tirs ennemis et détection de collision avec le vaisseau
ForEach _tirE_()
With _tirE_()
\y - 12 + \t
DisplayTransparentSprite(\t, \x, \y)
If SpritePixelCollision(\t, \x, \y, 20, 44, 345)
DeleteElement(_tirE_())
ElseIf SpritePixelCollision(\t, \x, \y, 18, _mex_, 340)
DeleteElement(_tirE_())
_vie_ - 1
EndIf
EndWith
Next
;}
;}
ElseIf _vie_ = 0
;{ le joueur perd
_vie_ - 1
_Addexplosion_(_mex_, 340, 26, 16, 100)
; les ennemis restants explosent
For j = 0 To 5
For i = 0 To 9
If _ennemis_(i, j)\t < > - 1
_Addexplosion_(_ennemis_(i, j)\x, _ennemis_(i, j)\y, 24, 16, 20)
EndIf
Next
Next
; on initialise les ennemis qui vont dévaster la terre
For i = 0 To 5
_ennemis_(0, i)\t = i
_ennemis_(0, i)\x = 294
_ennemis_(0, i)\y = 40
Next
_PreparerTextTremblant_("Les ALIENS envahissent la terre ...")
_showboubou_ = 1
_tps_boubou_ = j2
;}
ElseIf _vie_ = - 2
;{ le joueur gagne
_vie_ - 1
_PreparerTextTremblant_("Tu as vaincus les SPACE INVADERS !!")
;}
ElseIf _vie_ = - 3
;{ cinématique de victoire
; explosion et retrait du vaisseau maître
If _vaisseauy_ > - 50 And _compteur_ % 5 = 0
_Addexplosion_(70, 0, 454, 40 + _vaisseauy_, 20)
_vaisseauy_ - 1
EndIf
DisplayTransparentSprite(18, _mex_, 340)
DisplayTransparentSprite(40 + _compteur_ % 32 / 4, _mex_ + 5, 320 - 50 * Abs(Sin(_compteur_ / 10)))
;}
Else
;{ cinématique de défaite
; Déplacement des ennemis dévastateurs selon une courbe
For i = 0 To 5
ra.d = 920 + 25 * Abs(Sin(_compteur_ / 24 + i) * Sin(_compteur_ / 8 + i) * Sin(_compteur_ / 8 + i))
_ennemis_(0, i)\x = _ennemis_(0, i)\x + (300 + ra * Cos(0.2 * Sin(_compteur_ / 90 + i / 2) - #PI / 2) - _ennemis_(0, i)\x) / _div_
_ennemis_(0, i)\y = _ennemis_(0, i)\y + (1270 + ra * Sin(0.2 * Sin(_compteur_ / 90 + i / 2) - #PI / 2) - _ennemis_(0, i)\y) / _div_
DisplayTransparentSprite(_ennemis_(0, i)\t * 2 + _compteur_ % 40 / 20, _ennemis_(0, i)\x, _ennemis_(0, i)\y)
_Addexplosion_(_ennemis_(0, i)\x + 12, _ennemis_(0, i)\y + 24, 2, 2, 2)
Next
If _compteur_ % 200 = 0
_showboubou_ = - _showboubou_
_tps_boubou_ = j2
EndIf
If _compteur_ % 3 = 0
_tps_boubou_ - 1
EndIf
If _compteur_ % 20 = 0
_div_ / 2 + 1
EndIf
;}
EndIf
;{ dessin des textes de victoire / défaite
StartDrawing(ScreenOutput())
ForEach _text_()
With _text_()
\x1 + (300 - i2 / 2 + \x + 2 * Sin(\y + _compteur_ / 5) - \x1) / 8
If (_showboubou_ = - 1 And \y > = _tps_boubou_) Or (_showboubou_ = 1 And \y > = j2 - _tps_boubou_)
\y1 + (200 + \y - \y1) / 8
Else
\y1 + (100 + \y - \y1) / 8
EndIf
Box(\x1, \y1, 1, 1, \t)
EndWith
Next
StopDrawing()
;}
;{ dessin des explosions
ForEach _explo_()
_explosion_(_explo_())
Next
;}
FlipBuffers()
Until _event_ = 16 Or KeyboardPushed(#PB_Key_Escape)