Page 3 sur 4

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 15/janv./2013 21:36
par falsam
cederavic a écrit :Bouerf, j'avais meme pas vu :oops:
Tssss, Cool Dji aurait pu être 2eme (Mode je ne remue pas du tout le couteau dans la plaie :mrgreen: )

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 15/janv./2013 21:44
par cederavic
Bah en même temps il n'y avait pas d'heure de cloture, ducoup ce matin je me suis dit "je posterais ça en rentrant du boulot ce soir" :roll:

Edit : Ho putain! Toute la journée je me suis cru le 14!

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 15/janv./2013 21:55
par Cool Dji
Bah, c'est pas grave du tout Cederavic, l'essentiel est de participer, de prendre du plaisir à coder un truc sympa et surtout découvrir les productions réalisées... :D

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 16/janv./2013 19:44
par graph100
Wouaah ! je suis en haut de la liste :mrgreen:

Bah merci beaucoup à tous, c'est le premier punch auquel je participe, ayant manqué les autres... Mais c'était franchement sympathique,
et de très beau et très intéressant codes sont tombés !

Un Grand merci à Djes pour avoir organiser tout ça, et merci à Fred pour la peluche PB :D

Si ça intéresse du monde, je peux poster la version lisible du code, ou l'envoyer à Djes pour qu'il fasse une archive (si il veut bien :mrgreen: )
avec les codes lisibles de tout le monde ! (surtout avec la bouillie que nous a servie einander :lol: )

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 16/janv./2013 21:59
par djes
Merci à toi Graph100 et encore bravo, c'est une peluche bien méritée !

Oui, si vous envoyez les codes "originaux", je les incluerai dans l'archive :)

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 16/janv./2013 23:11
par Cool Dji
Encore bravo à Graph100 :D

Voici le code re-commenté de WinterPunch
et les deux fichiers de l'archive...

Music
http://xdji.free.fr/Telechargement/W.ogg

Image
http://xdji.free.fr/Telechargement/W1.png

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

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : sam. 19/janv./2013 10:30
par comtois
code commenté de Fast Editor 2D, le principe est basé sur un codage binaire des sprites. 4 sprites principaux gauche droit haut bas, les autres étant déduits par une combinaison binaire de ces 4 sprites.

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)

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : lun. 21/janv./2013 19:28
par graph100
Et voila ! Le code commenté de Space Invaders Pong.
La version sonore viendra plus tard :D

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)

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 22/janv./2013 22:18
par Cool Dji
hop la :D

Un joli et très pratique tapis souris sur le bureau !!

Image

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 22/janv./2013 23:49
par comtois
wow, c'est sympa. Reste plus qu'à attendre les images des 2 autres prix :)

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mar. 22/janv./2013 23:56
par Ar-S
Yeah ! joli tapis ! :P

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 23/janv./2013 1:00
par Fred
excellent :D

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 23/janv./2013 14:30
par djes
:o Merci pour la photo ! :)

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 23/janv./2013 16:01
par Ar-S
question : Mis à part les tapis de souris de base, ne peut-on pas se faire faire un tapis perso avec repose poignée en gélatine ?

Re: Compétition PurePunch des fêtes de fin d'année 2012 - Vo

Publié : mer. 23/janv./2013 17:28
par graph100
Et hop, la photo du nounours en T-shirt PureBasic ! (je viens de le recevoir) :mrgreen:

Image