Mini-code pour débutants : T.A.N.K.S
Publié : ven. 02/mai/2008 2:18
'alut
Dans la série des mini-codes(ou plutôt "j'ai pas le temps mais je code quand même"
, "un jeu" pour deux joueurs. Jeu entre guillemets car pouvant être utilisé en 2nde pour aborder la notion de projectile !
Toujours pareil, j'essaye de faire court(200 lignes) avec peu de mots-clés, etc, etc...
J'espère que ça pourra motiver ceux qui débutent.
Le paysage est généré aléatoirement.
La trajectoire des obus est calculée avec la méthode d'Euler(calcul de proches en proches).
J'ai utilisé des gadgets
!
S'il y a un truc qui cloche n'hésitez pas !
Idem, toute amélioration du code est bienvenue !

Images à mettre dans le même dossier que le code !


Hasta la vista !
PS : pour tenir compte des frottements dus à l'air (modèle en f = k*v²)
il faut modifier quelques lignes :
avec #beta=0.0005; coefficient de frottements de l'air divisé par la masse du missile
Dans la série des mini-codes(ou plutôt "j'ai pas le temps mais je code quand même"



Toujours pareil, j'essaye de faire court(200 lignes) avec peu de mots-clés, etc, etc...
J'espère que ça pourra motiver ceux qui débutent.
Le paysage est généré aléatoirement.
La trajectoire des obus est calculée avec la méthode d'Euler(calcul de proches en proches).
J'ai utilisé des gadgets

S'il y a un truc qui cloche n'hésitez pas !
Idem, toute amélioration du code est bienvenue !
Images à mettre dans le même dossier que le code !
Code : Tout sélectionner
;T.A.N.K.S
;auteur Huitbit
;pb v4.10
;-déclarations
#largeur_ecran=1024
#hauteur_ecran=768
;-caractéristiques des montagnes
#amplitude=#hauteur_ecran/6
#pulsation=2*#PI/#largeur_ecran
#valeur_moyenne=#hauteur_ecran*0.5
deformation.f=1+Random(10)
Enumeration
#spr_ciel
#spr_montagne
#spr_decor
#spr_tank_1
#spr_tank_2
#spr_boulet
#Text_0
#TrackBar_0
#Text_1
#TrackBar_1
#TrackBar_2
#Text_2
#TrackBar_3
#Text_3
#Button_0
#Text_4
EndEnumeration
;fonction pour dessiner les montagnes
Macro f(x)
#amplitude*Sin(#pulsation*x)+#valeur_moyenne+#amplitude*0.25*Sin(#pulsation*deformation*x)
EndMacro
i.l
;variables utilisées pour tracer les montagnes
x_precedent.l
y_precedent.l
x.l
y.l
;-coordonnées initiales des tanks
x_1.f=20+Random(200)
y_1.f=f(x_1)
x_2.f=#largeur_ecran-20-Random(200)
y_2.f=f(x_2)
;-données pour les obus
#g=9.8
x_boulet_1.f=x_1-8
y_boulet_1.f=y_1-49
v_boulet_1.f=90
angle_1.f=45*#PI/180 ;conversion degrés / radians
vx_boulet_1.f=v_boulet_1*Cos(angle_1)
vy_boulet_1.f=-v_boulet_1*Sin(angle_1)
ay_boulet_1.f=#g
x_boulet_2.f=x_2-8
y_boulet_2.f=y_2-49
v_boulet_2.f=90
angle_2.f=45*#PI/180
vx_boulet_2.f=-v_boulet_2*Cos(angle_2)
vy_boulet_2.f=-v_boulet_2*Sin(angle_2)
ay_boulet_2.f=#g
dt.f=0.1 ;"pas" pour le calcul des coordonnées
feu.b=0; gestion du bouton de tir
score_1.b=0
score_2.b=0
tank_1_touche.b=0; pour savoir si un tank est touché
tank_2_touche.b=0
;-PROGRAMME PRINCIPAL
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"T.A.N.K.S",#PB_Window_ScreenCentered|#PB_Window_SystemMenu )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran-200,0,0,0)
;-gadgets
CreateGadgetList(WindowID(0))
TextGadget(#Text_0, 0, 593+0, 356, 20, "Vitesse initiale = 90 (de 1 m/s à 180 m/s)", #PB_Text_Center)
TrackBarGadget(#TrackBar_0, 0, 593+20, 356, 20, 1, 179, #PB_TrackBar_Ticks)
SetGadgetState(#TrackBar_0,90)
TextGadget(#Text_1, 0, 593+60, 356, 20, "Angle de tir = 45 (de 1° à 89°)", #PB_Text_Center)
TrackBarGadget(#TrackBar_1, 0, 593+80, 356, 20, 0, 89, #PB_TrackBar_Ticks)
SetGadgetState(#TrackBar_1,45)
TextGadget(#Text_2, 668, 593+0, 356, 20, "Vitesse initiale = 90 (de 1 m/s à 180 m/s)", #PB_Text_Center)
TrackBarGadget(#TrackBar_2, 668, 593+20, 356, 20, 1, 179, #PB_TrackBar_Ticks)
SetGadgetState(#TrackBar_2,90)
TextGadget(#Text_3, 668, 593+60, 356, 20, "Angle de tir = 45 (de 1° à 89°)", #PB_Text_Center)
TrackBarGadget(#TrackBar_3, 668, 593+80, 356, 20, 0, 89, #PB_TrackBar_Ticks)
SetGadgetState(#TrackBar_3,45)
ButtonGadget(#Button_0, 376, 593+20, 272, 80, "*** FEU ! ***",#PB_Button_MultiLine)
TextGadget(#Text_4, 376, 593, 272, 20, "Score "+Str(score_1)+" : "+Str(score_2), #PB_Text_Center)
;-Active le support du format PNG
UsePNGImageDecoder()
;-dessin du décor ciel et montagne
CreateSprite(#spr_ciel,#largeur_ecran,#hauteur_ecran)
StartDrawing(SpriteOutput(#spr_ciel))
For i=0 To 255 Step 8
Circle(#largeur_ecran/8,#hauteur_ecran/8,#largeur_ecran-i*4,RGB(i,255,255))
Next i
StopDrawing()
CreateSprite(#spr_montagne,#largeur_ecran,#hauteur_ecran)
StartDrawing(SpriteOutput(#spr_montagne))
DrawingMode( #PB_2DDrawing_Outlined)
x_precedent=0
y_precedent=f(x_precedent)
For x=1 To #largeur_ecran
y=f(x)
LineXY(x_precedent,y_precedent,x,y,RGB(189, 114, 66))
x_precedent=x
y_precedent=y
Next x
FillArea(2,#hauteur_ecran-2,RGB(189, 114, 66),RGB(25, 114, 66))
StopDrawing()
;-chargement des sprites tanks 1&2
LoadSprite(#spr_tank_1,"tank_1.png")
LoadSprite(#spr_tank_2,"tank_2.png")
;-dessin d'un obus
CreateSprite(#spr_boulet,16,16)
StartDrawing(SpriteOutput(#spr_boulet))
For i = 0 To 7
Circle(8,8,8-i,RGB(20+25*i,20+25*i,20+25*i))
Next i
StopDrawing()
;-BOUCLE PRINCIPALE
Repeat
;-tank_1 touché ?
If SpritePixelCollision(#spr_boulet,x_boulet_2,y_boulet_2,#spr_tank_1,x_1-24,y_1-32) And tank_1_touche=0
score_2=score_2+1
SetGadgetText(#Text_4,"Score "+Str(score_1)+" : "+Str(score_2))
tank_1_touche=1
EndIf
;-tank_2 touché ?
If SpritePixelCollision(#spr_boulet,x_boulet_1,y_boulet_1,#spr_tank_2,x_2-24,y_2-32) And tank_2_touche=0
score_1=score_1+1
SetGadgetText(#Text_4,"Score "+Str(score_1)+" : "+Str(score_2))
tank_2_touche=1
EndIf
;-l'obus_1 a touché le sol ?
If SpritePixelCollision(#spr_boulet,x_boulet_1,y_boulet_1,#spr_montagne,0,0)=0 And x_boulet_1<#largeur_ecran+16 And tank_2_touche=0 And feu=1
vy_boulet_1=vy_boulet_1+ay_boulet_1*dt
x_boulet_1=x_boulet_1+vx_boulet_1*dt
y_boulet_1=y_boulet_1+vy_boulet_1*dt
EndIf
;-l'obus_2 a touché le sol ?
If SpritePixelCollision(#spr_boulet,x_boulet_2,y_boulet_2,#spr_montagne,0,0)=0 And x_boulet_2>-16 And tank_1_touche=0 And feu=1
vy_boulet_2=vy_boulet_2+ay_boulet_2*dt
x_boulet_2=x_boulet_2+vx_boulet_2*dt
y_boulet_2=y_boulet_2+vy_boulet_2*dt
EndIf
;-BOUCLE DE GESTION DES EVENEMENTS DE LA FENETRE
Repeat
Event = WindowEvent()
GadgetID = EventGadget()
If Event = #PB_Event_CloseWindow
End
ElseIf Event =#PB_Event_Gadget
If GadgetID = #TrackBar_0
SetGadgetText(#Text_0, "Vitesse initiale = "+Str(GetGadgetState(#TrackBar_0))+ " (de 1 m/s à 180 m/s)")
ElseIf GadgetID = #TrackBar_1
SetGadgetText(#Text_1, "Angle de tir = "+Str(GetGadgetState(#TrackBar_1)) +" (de 1° à 89°)")
ElseIf GadgetID = #TrackBar_2
SetGadgetText(#Text_2, "Vitesse initiale = "+Str(GetGadgetState(#TrackBar_2))+ " (de 1 m/s à 180 m/s)")
ElseIf GadgetID = #TrackBar_3
SetGadgetText(#Text_3, "Angle de tir = "+Str(GetGadgetState(#TrackBar_3)) +" (de 1° à 89°)")
ElseIf GadgetID = #Button_0
feu=feu+1
If feu>1
feu=0
EndIf
If feu=1 ;on récupère les valeurs de vitesses initiales
v_boulet_1=GetGadgetState(#TrackBar_0)
angle_1=GetGadgetState(#TrackBar_1)*#PI/180
vx_boulet_1=v_boulet_1*Cos(angle_1)
vy_boulet_1=-v_boulet_1*Sin(angle_1)
v_boulet_2=GetGadgetState(#TrackBar_2)
angle_2=GetGadgetState(#TrackBar_3)*#PI/180
vx_boulet_2=-v_boulet_2*Cos(angle_2)
vy_boulet_2=-v_boulet_2*Sin(angle_2)
SetGadgetText(#Button_0,"REJOUER ?")
ElseIf feu =0 ;on replace au hasard les tanks
x_1=20+Random(200)
y_1=f(x_1)
x_2=#largeur_ecran-20-Random(200)
y_2=f(x_2)
x_boulet_1=x_1-8
y_boulet_1=y_1-49
x_boulet_2=x_2-8
y_boulet_2=y_2-49
tank_1_touche=0
tank_2_touche=0
SetGadgetText(#Button_0,"FEU !")
EndIf
EndIf
EndIf
Until Event = 0
DisplaySprite(#spr_ciel,0,0)
DisplayTransparentSprite(#spr_montagne,0,0)
DisplayTransparentSprite(#spr_tank_1,x_1-24,y_1-32)
DisplayTransparentSprite(#spr_tank_2,x_2-24,y_2-32)
DisplayTransparentSprite(#spr_boulet,x_boulet_1,y_boulet_1)
DisplayTransparentSprite(#spr_boulet,x_boulet_2,y_boulet_2)
Delay(1)
FlipBuffers()
ForEver
PS : pour tenir compte des frottements dus à l'air (modèle en f = k*v²)
il faut modifier quelques lignes :
Code : Tout sélectionner
v_boulet=sqr(vx_boulet*vx_boulet+vy_boulet*vy_boulet)
ax_boulet=-#beta*v_boulet*vx_boulet
ay_boulet=#g-#beta*v_boulet*vy_boulet
vx_boulet=vx_boulet+ax_boulet*dt
vy_boulet=vy_boulet+ay_boulet*dt
x_boulet=x_boulet+vx_boulet*dt
y_boulet=y_boulet+vy_boulet*dt