mettez moi sur la bonne voie tableau structure ?????
mettez moi sur la bonne voie tableau structure ?????
bonsoir je tourne en rond quelqu'un pourrait il m'orienter
je veut faire trois rangees de 10 sprites(toujours le meme)
c'est pour une evolution de mon jeu
genre space invader ces trois rangees se deplaceront de droite a gauche et de gauche a droite,je plane completement dans les structure et tableau
si quelqu'un a un bout de code pour me lancer dans la bonne direction je serai content
je veut faire trois rangees de 10 sprites(toujours le meme)
c'est pour une evolution de mon jeu
genre space invader ces trois rangees se deplaceront de droite a gauche et de gauche a droite,je plane completement dans les structure et tableau
si quelqu'un a un bout de code pour me lancer dans la bonne direction je serai content
C'est relativement simple.
oublie l'affichage au début , regarde comment tu vas gerer les "entitées" , chaque vaisseau est une entité , cette entité possède une position en x et y (z pour la 3D) des points de vie , un timer pour tirer , etc...
donc en gros il te faut comme structure ceci :
voici un p'tit snippet :
oublie l'affichage au début , regarde comment tu vas gerer les "entitées" , chaque vaisseau est une entité , cette entité possède une position en x et y (z pour la 3D) des points de vie , un timer pour tirer , etc...
donc en gros il te faut comme structure ceci :
Structure ENTITY
X.f : y.f
Life.l
TimerToShoot.l
Delay.l
SpriteID.l
EndStructure
voici un p'tit snippet :
InitSprite ()
InitKeyboard ()
Structure ENTITY
X.f : Y.f
Life.l
TimerToShoot.l
Delay.l
SpriteID.l
EndStructure
Global NewList Mechant()
Procedure PositionEntity(*this.ENTITY,x.f,y.f)
*this\X = x
*this\Y = y
EndProcedure
Procedure SpriteEntity(*this.ENTITY, SpriteID )
*this\ SpriteID = SpriteID
EndProcedure
Procedure NewMechant(x,y, SpriteID )
*This.ENTITY = AllocateMemory ( SizeOf (ENTITY))
PositionEntity(*this,x,y)
SpriteEntity(*this, SpriteID )
*This\TimerToShoot = 500
*This\ Delay = ElapsedMilliseconds () + *This\TimerToShoot
ProcedureReturn *This
EndProcedure
Procedure AfficheMechant(*this.ENTITY)
DisplaySprite (*this\ SpriteID ,*this\X,*this\Y)
EndProcedure
OpenScreen (800,600,32, "" )
CreateSprite (1,16,16)
StartDrawing ( SpriteOutput (1))
Circle (8,8,4,$FF0000)
StopDrawing ()
CreateSprite (2,16,16)
StartDrawing ( SpriteOutput (2))
Circle (8,8,4,$00FF00)
StopDrawing ()
CreateSprite (3,16,16)
StartDrawing ( SpriteOutput (3))
Circle (8,8,4,$0000FF)
StopDrawing ()
For i = 1 To 10
AddElement (Mechant())
CentreX = (800/2)-(320/2)
Mechant() = NewMechant((i*32)+CentreX,100,1)
Next
For i = 1 To 10
AddElement (Mechant())
CentreX = (800/2)-(320/2)
Mechant() = NewMechant((i*32)+CentreX,200,2)
Next
For i = 1 To 10
AddElement (Mechant())
CentreX = (800/2)-(320/2)
Mechant() = NewMechant((i*32)+CentreX,300,3)
Next
Repeat
ClearScreen ($222222) : ExamineKeyboard ()
If KeyboardPushed ( #PB_Key_Escape ) : quit=1 : End : EndIf
ForEach Mechant()
AfficheMechant(Mechant())
Next
FlipBuffers ()
Until quit=1
mettez moi sur la bonne voie tableau structure ?????
Merci beaucoup,j'etudie la chose pas si facile PUREBASIC mais puissant
Re: mettez moi sur la bonne voie tableau structure ?????
C'est vrai.geantvert a écrit :Merci beaucoup,j'etudie la chose pas si facile PUREBASIC mais puissant
Mais cela dit, on peut difficilement faire plus facile

Ca serait sympa que, dans tes exemples, tu n'utilises pas des nom qui ressemblent a des mots-clé ... mais qui n'en sont pasCpl.Bator a écrit :donc en gros il te faut comme structure ceci :

Quand on ne connais pas la totalité du langage, ou quand on n'est pas sur de le connaitre, c'est assez troublant.
Genre
"Structure ENTITY"
En encore l'utilisation de "*this" qui a une signication bien particuliere dans les langages OO.
Et quand tu melanges ca donne "*this.ENTITY" et la tu te dis "WTF ?".
Mes 2 Eurocents

justement , le fait d'employer This , veut dire "ceci" , c'est pour qu'il prenne conscience qu'il modifie une sorte "d'objet" , et puis sa lui fait une approche de la programmation orienté objet sans le savoir. c'est pas plus mal.
si tu as un minimum de base , le code n'est pas flou , je trouve sa lisible , mais bon... je me trompe peut être , je n'ai plus un regard inconnu sur les codes , donc ma vision est certainement faussée.Quand on ne connais pas la totalité du langage, ou quand on n'est pas sur de le connaitre, c'est assez troublant.
Genre
"Structure ENTITY"
je vais peter un boulon
suite de mon probleme j'ai reussi a afficher mes envahisseurs mais quand je tire dessus seul le dernier ennemi a une action
pour memo 30 envahisseurs 10 sur 3 lignes
j'ai mis en rouge l'endroit qui me pose des soucis,j'ai du mal a saisir la difference entre structure et liste chainee,pouvez vous me depanner et aussi si vous connaissez queleques bons livres pour apprendre le basic dans le style je programme j'apprends je vous serait reconnaissant merci a plus
pour memo 30 envahisseurs 10 sur 3 lignes
j'ai mis en rouge l'endroit qui me pose des soucis,j'ai du mal a saisir la difference entre structure et liste chainee,pouvez vous me depanner et aussi si vous connaissez queleques bons livres pour apprendre le basic dans le style je programme j'apprends je vous serait reconnaissant merci a plus
Code : Tout sélectionner
If InitEngine3D()=0 Or InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0 Or InitSound()=0 Or InitMovie()=0
MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
End
EndIf
UsePNGImageDecoder()
UseOGGSoundDecoder()
Enumeration
#explos1wav;son explosion
#galax ;sprite fond d'ecran
#vaisseau ;sprite vaisseau
#tir1 ;missile 1
#aster1;asteroide 1
#aster2;asteroide 2
#explosion ;=60 frame anim explosion 1
#explovai;=30 frame anim explosion 2
#cinq;musique
#enemi1
#boum ;explosion vaisseau joueur
#boum3d;pour zoom
#encadre
;#envahis
EndEnumeration
Global ta2=0,ta1=0,te1=0,score=200,t=0 ,r=Random(2),scrolling=0,vie=10,vitesse=5
Global explosion.AnimSprite,explovai.animsprite,jouani=0,animx,animy,jouani2=0,animx2,animy2
Global asterx2=40+Random(660),astery2=-100,enemi1x=800,enemi1y=40+Random(400)
Global posxtir,posytir,asterx1=40+Random(700),astery1=-100
Global eva1=0,depx=0,depbord=1,envax,envay,enva=100,envahis
Global MouseExClic.b, MouseClic.b, MousePressed.b, MouseReleased.b,pericer=0,rayon=500
OpenScreen(800,600,32,"ecranjeu")
;son musique******************************************
LoadSound(#explos1wav,"c:\space\explos1.wav")
LoadSound(#cinq,"c:\space\54.wav")
;image et sprite**************************************************************
LoadSprite(#encadre,"c:\space\encadre.png")
TransparentSpriteColor(#encadre,$ffffff)
LoadSprite(#galax,"c:\space\gala1.png") ;
LoadSprite(#aster1,"c:\space\aster1.png")
TransparentSpriteColor(#aster1,$ffffff)
LoadSprite(#aster2,"c:\space\aster2.png")
TransparentSpriteColor(#aster2,$ffffff)
LoadSprite(#vaisseau,"c:\space\vaisseau.png",0)
TransparentSpriteColor(#vaisseau,$ffffff)
LoadSprite(#tir1,"c:\space\tir1.png",0)
TransparentSpriteColor(#tir1,$ffffff)
MouseLocate(385,520)
LoadSprite(#enemi1,"c:\space\enemi1.png",0)
TransparentSpriteColor(#enemi1,$ffffff)
LoadSprite(#boum,"c:\space\spiro.png",#PB_Sprite_Texture)
CreateSprite3D(#boum3d,#boum)
LoadSprite(#explosion,"c:\space\explosion.png",0)
CreateAnimSprite(explosion,#explosion,70,70,50);explosion 1variable animsprite
TransparentSpriteColor(#explosion,$ffffff)
LoadSprite(#explovai,"c:\space\explovai.png",0)
CreateAnimSprite(explovai,#explovai,98,100,100);explosion 2 vaisseau
TransparentSpriteColor(#explovai,$ffffff)
LoadSprite(envahis,"c:\space\envah1.png",0)
TransparentSpriteColor(envahis,$ffffff)
;**************************************************
Declare colisionvaisseaua1()
Declare colisionvaisseaua2()
Declare coltirast()
Declare gestiontir()
Declare affichenemi1()
Declare afficheaster1()
Declare afficheaster2()
Declare endgame()
Declare affichegrille()
;************************************
;
;*************************************
;*********************************
;*********************************
Structure tirjoueur
posxtir.l
posytir.l
EndStructure
Global NewList position.tirjoueur()
;*********************************
Structure asteroide1
asterx1.l
astery1.l
EndStructure
Global NewList coord1.asteroide1()
;******************************
Structure asteroide2
asterx2.l
astery2.l
EndStructure
Global NewList coord2.asteroide2()
;*****************************************************************
Structure enemi1
enemi1x.l
enemi1y.l
EndStructure
Global NewList pose1.enemi1()
;*****************************************************************
[color=red]Structure envahis
envax.l
envay.l
EndStructure
Global NewList place.envahis()
;**********************************************************************
;For enva=100 To 130
;AddElement(place())
LoadSprite(enva,"c:\space\envah1.png",0)
TransparentSpriteColor(enva,$ffffff)
;place()\enva=enva
;Next enva
;position envah
;************************affiche enva
Procedure affichegrille()
;If enva=130 :enva=100:EndIf
For envay=50 To 150 Step 50
For envax=104 To 680 Step 64
AddElement(place())
;enva+1
place()\envax=envax:place()\envay=envay;:place()\enva=enva
DisplayTransparentSprite(enva,place()\envax,place()\envay)
Next envax
Next envay
EndProcedure[/color]
;**********************************************************************
Procedure gestiontir()
Select Mousereleased
Case 0
t=1
Case 1
t=0
EndSelect
If t=1:Goto freintir:EndIf
If t=0
InsertElement(position())
position()\posxtir=MouseX()+13
position()\posytir=MouseY()
EndIf
t=1
freintir:
While NextElement(position())
position()\posytir-5
DisplayTransparentSprite(#tir1,position()\posxtir,position()\posytir)
If position()\posytir=10:score-1:t=0
EndIf
coltirast()
Wend
t=0
ResetList(position())
EndProcedure
;********************************************************************
Procedure DetectClic() ;permet le tir coup par coup je remercie untel du forum j'ai pas le nom
MouseClic = #Null
MouseReleased = #Null
If MouseButton(1) And MouseExClic = #Null
MouseClic = #True
EndIf
If MouseButton(1)=0 And MouseExClic = #True
MouseReleased = #True
EndIf
MouseExClic = MouseButton(1)
MousePressed = MouseButton(1)
EndProcedure
;***********************************
Procedure afficheaster1()
InsertElement(coord1())
If ta1=1:Goto freinaster1:EndIf
If ta1=0:coord1()\asterx1=40+Random(700):EndIf
ta1=1
freinaster1:
While NextElement(coord1())
ta1=1
coord1()\astery1+vitesse
DisplayTransparentSprite(#aster1,coord1()\asterx1,coord1()\astery1)
If coord1()\astery1>600:ta1=0:coord1()\astery1=-100
DeleteElement(coord1())
r=Random(2)
EndIf
Wend
ta1=0
EndProcedure
;*********************************************************************
Procedure afficheaster2()
InsertElement(coord2())
If ta2=1:Goto freinaster2:EndIf
If ta2=0:coord2()\asterx2=40+Random(660):EndIf
ta2=1
freinaster2:
While NextElement(coord2())
ta2=1
coord2()\astery2+vitesse
DisplayTransparentSprite(#aster2,coord2()\asterx2,coord2()\astery2)
If coord2()\astery2>600:ta2=0:coord2()\astery2=-100
DeleteElement(coord2())
r=Random(2)
EndIf
Wend
ta2=0
EndProcedure
;****************************************************************
Procedure affichenemi1()
InsertElement(pose1());============================pose1 enemi 1
If te1=1:Goto freinenemi1:EndIf
If te1=0:pose1()\enemi1y=Random(400):pose1()\enemi1x=800:EndIf
te1=1
freinenemi1:
While NextElement(pose1())
te1=1
pose1()\enemi1x-vitesse
DisplayTransparentSprite(#enemi1,pose1()\enemi1x,pose1()\enemi1y)
If pose1()\enemi1x<-100:te1=0:pose1()\enemi1x=800
DeleteElement(pose1())
r=Random(2)
EndIf
Wend
te1=0
EndProcedure
;*********************************************************************************************************
Procedure coltirast()
;aster1
If SpritePixelCollision(#tir1,position()\posxtir,position()\posytir,#aster1,coord1()\asterx1,coord1()\astery1)
jouani=1;----------------------------------------------------
animx=coord1()\asterx1:animy=coord1()\astery1;-----------------------------------------------------
DeleteElement(coord1()):ta1=0
DeleteElement(position()):t=0
score+10
;PlaySound(#explos1wav)
r=Random(2)
; aster2
ElseIf SpritePixelCollision(#tir1,position()\posxtir,position()\posytir,#aster2,coord2()\asterx2,coord2()\astery2)
jouani=1;----------------------------------------------------
animx=coord2()\asterx2:animy=coord2()\astery2;-----------------------------------------------------
DeleteElement(coord2()):ta2=0
DeleteElement(position()):t=0
; PlaySound(#explos1wav)
score+10
r=Random(2)
;vaisseauenemi
ElseIf SpritePixelCollision(#tir1,position()\posxtir,position()\posytir,#enemi1,pose1()\enemi1x,pose1()\enemi1y)
jouani=1;----------------------------------------------------
animx=pose1()\enemi1x:animy=pose1()\enemi1y;-----------------------------------------------------
DeleteElement(pose1()):te1=0
DeleteElement(position()):t=0
; PlaySound(#explos1wav)
score+15
r=Random(2)
;envahisseur
[color=red]ElseIf SpritePixelCollision(#tir1,position()\posxtir,position()\posytir,enva,place()\envax,place()\envay)
;ElseIf position()\posxtir=grillex(envax) And position()\posytir=grilley(envay)
; jouani=1;----------------------------------------------------
; animx=envahis()\envax+depx:animy=envahis()\envay;-----------------------------------------------------
te1=0
;SelectElement(place(),place()\enva)
DeleteElement(place())
DeleteElement(position()):t=0
PlaySound(#explos1wav)
score+15
; r=Random(2)
EndIf[/color]
EndProcedure
;****************************************************************************************************
Procedure colisionvaisseaua1()
If SpritePixelCollision(#vaisseau,MouseX(),MouseY(),#aster1,coord1()\asterx1,coord1()\astery1)
jouani2=1
animx2=coord1()\asterx1:animy2=coord1()\astery1
DeleteElement(coord1()):ta1=0
r=Random(2) :;PlaySound(#explos1wav)
EndIf
EndProcedure
;*******************************************************************************************************************
Procedure colisionvaisseaua2()
If SpritePixelCollision(#vaisseau,MouseX(),MouseY(),#aster2,coord2()\asterx2,coord2()\astery2)
jouani2=1
animx2=coord2()\asterx2:animy2=coord2()\astery2
DeleteElement(coord2()):ta1=0
r=Random(2) :;PlaySound(#explos1wav)
EndIf
EndProcedure
;****************************************************************************************************
Procedure colisionvaisseaue1();vaisseau contre vaisseau enemi 1
If SpritePixelCollision(#vaisseau,MouseX(),MouseY(),#enemi1,pose1()\enemi1x,pose1()\enemi1y)
jouani2=1
animx2=pose1()\enemi1x:animy2=pose1()\enemi1y
DeleteElement(pose1()):ta1=0
r=Random(2) :;PlaySound(#explos1wav)
EndIf
EndProcedure
;************************************
Procedure gestionvie()
vie=vie-1
If vie=0:endgame():EndIf
EndProcedure
;*****************************************
Procedure endgame()
For rayon=500 To 0 Step -10
StartDrawing(ScreenOutput())
Circle(400,300,rayon,RGB(Random(255),Random(255),Random(255)))
StopDrawing()
FlipBuffers()
Next rayon
Delay(200)
If vie=0:End:EndIf
EndProcedure
;************************************************************
;*********************************************
;** programme principale **
;*********************************************
;*********************************************
InsertElement(pose1());pour eviter le plantage au premier tire avant creation premier element
InsertElement(coord2());pour eviter le plantage au premier tire avant creation premier element
InsertElement(coord1())
InsertElement(place())
;pour eviter le plantage au premier tire avant creation premier element
;InsertElement(place())
;pour eviter le plantage au premier tire avant creation premier element
;PlaySound(#cinq)
;**********************************************************
Repeat
DisplaySprite(#galax,0,scrolling)
DisplaySprite(#galax,0,scrolling-600)
scrolling+2:If scrolling>600:scrolling=0:EndIf
If score>200:vitesse=5:affichegrille():sp30=1:EndIf
ExamineMouse()
ExamineKeyboard()
DetectClic()
gestiontir()
Select r;affiche au hasard different obstacles
Case 0:afficheaster1():colisionvaisseaua1()
Case 1:afficheaster2():colisionvaisseaua2()
Case 2: affichenemi1():colisionvaisseaue1()
EndSelect
If jouani=1:DisplayAnimSprite(explosion,animx,animy) ;l'astuce
If 60=CurrentAnimFrame(explosion):jouani=0
EndIf
EndIf
If jouani2=1:ReleaseMouse(1):DisplayAnimSprite(explovai,animx2,animy2)
If 29=CurrentAnimFrame(explovai):gestionvie(): MouseLocate(385,520):jouani2=0:ReleaseMouse(0): EndIf
EndIf
;--------------------------------------
If jouani2<>1;gestion souris
DisplayTransparentSprite(#vaisseau,MouseX(),MouseY())
If MouseX()<42 :MouseLocate(42,MouseY()):EndIf
If MouseX()>728 :MouseLocate(728,MouseY()):EndIf
If MouseY()<42 :MouseLocate(MouseX(),42):EndIf
If MouseY()>496 :MouseLocate(MouseX(),496):EndIf
EndIf
;difficulte niveau suivant scoreenvah1x
If score>20 And score <40 :vitesse=7:EndIf
If score>40 And score <80 :vitesse=9:EndIf
If score>80 And score <100 :vitesse=11:EndIf
If score>100 And score <200 :vitesse=13:EndIf
;--------------------------------------
DisplayTransparentSprite(#encadre,0,0)
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(50,570,"VIE "+Str(vie))
DrawText(200,570,"SCORE "+Str(score)+" enva"+Str(enva))
StopDrawing()
FlipBuffers()
Until KeyboardPushed (#PB_Key_Escape)
End
[color=red][/color]
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
Re: je vais peter un boulon
bonjour,
La longueur de ton code fait un peu peur. Tu n'as pas mis tes images, ce qui est légitime. Mais tu pourrai peut être faire l'effort de les remplacer par de simples carrés de couleurs, afin que nous puissions tester la bête.
Ta procédure "Procedure affichenemi1()" pose problème. Je te propose d'organiser donc ton code comme suit:
Dans la procédure "Procedure endgame()", il y a une horreur: la ligne 346 est à désactiver de toute urgence( n'oublie pas que ton jeu est une application graphique).
La longueur de ton code fait un peu peur. Tu n'as pas mis tes images, ce qui est légitime. Mais tu pourrai peut être faire l'effort de les remplacer par de simples carrés de couleurs, afin que nous puissions tester la bête.
Ta procédure "Procedure affichenemi1()" pose problème. Je te propose d'organiser donc ton code comme suit:
Code : Tout sélectionner
Procedure affichenemi1()
ForEach pose1();- Affichage clone pose1 si existe.
; et là, tu code fébrilement tes clones pose1...
Next
EndProcedure
merci pour ton aide des erreurs il y en a ,pour l'instant je m'attarde sur le gros de mon programme apres j'ameliore ,l'abominable erreur ligne 346 "qui est vide chez moi" est ce le flipbuffer ,si c'est cela c'etait pour avoir un clignotement de l'ecran,mais ce qui me paraissait le plus abherrant c'etait la condition avec un end inclus
toujour est il que je te remercie ,j'ai essai un truc pour joindre tout mon prog avec photo etc.. j'espere que cela va marcher
liens de telechargement
http://www.neufgiga.com/index.php?m=c9a ... les tests
toujour est il que je te remercie ,j'ai essai un truc pour joindre tout mon prog avec photo etc.. j'espere que cela va marcher
liens de telechargement
http://www.neufgiga.com/index.php?m=c9a ... les tests
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
non, il s'agit de la commande delay(). Cette nuit, j'ai fait ce code qui t'aidera sûrement:geantvert a écrit :merci pour ton aide des erreurs il y en a ,pour l'instant je m'attarde sur le gros de mon programme apres j'ameliore ,l'abominable erreur ligne 346 "qui est vide chez moi" est ce le flipbuffer ,si c'est cela
Code : Tout sélectionner
;
; Les Listes Chaînées (Linked Lists), tout une aventure !
; vers l'infini 0.1 - video game - PC - mode fenêtre - 08/06/2008 - source PureBasic 4.20
; France - pseudo: beauregard
; touches flêchées gauche et droite, X( tir) et F( image/seconde)
; problème à résoudre:
; #PB_Window_ScreenCentered ne centre pas l'écran graphique si le joueur clique sur le bouton agrandir.
If InitMouse ()=0 Or InitKeyboard ()=0 Or InitSprite ()=0 Or InitSprite3D ()=0
MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
End
EndIf
If InitSound() = 0
MessageRequester("Error", "Can't open DirectX 7 Or Sound Card is not present", 0)
End
EndIf
Global manette.b
If InitJoystick():manette=1:EndIf
UsePNGImageDecoder()
; °°°°°°°°°°°°°°°°°°°° fonte °°°°°°°°°°°°°°°°°°°°°°°°°°
LoadFont ( 0 , "Comic Sans Ms" ,16, #PB_Font_Bold)
Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
#alienA
#tirbruteA
#gentil
#tirgentil
EndEnumeration
Structure objet ;- opération de clonage...
id.w ; id comme identité
x.w
y.w
tempoA.w
tempoB.w
boutonA.b
boutonB.b
EndStructure
Global NewList bruteA.objet() ; effectif
Global NewList bruteB.objet() ; pas encore effectif
Global NewList tirb.objet() ; tir brute
Global NewList tirg.objet() ; tir gentil
Declare Ftirgentil(x,y)
Declare Affichagetirgentil()
Declare FbruteA()
Declare AffichagebruteA()
Declare FtirbruteA(x,y)
Declare AffichagetirbruteA()
Declare Fin()
If OpenWindow ( 0 , 0, 0, 800, 600, "vers l'infini" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar| #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered | #PB_Window_ScreenCentered )
OpenWindowedScreen ( WindowID ( 0 ), 0, 0, 800, 600, 0, 1, 1) ; un ecran graphique dans la fenêtre.
SetWindowColor(0, RGB (0, 0, 0))
EndIf
KeyboardMode(#PB_Keyboard_International)
; les méchants de l'histoire... mais le sont-ils vraiment ?... mmmh ?
CreateSprite ( #alienA , 32, 32)
StartDrawing ( SpriteOutput ( #alienA ))
BackColor ( RGB (0,0,0))
Box (0,0, 63, 63, RGB (48, 231, 225))
StopDrawing ()
CreateSprite ( #tirbruteA , 16, 16)
StartDrawing ( SpriteOutput ( #tirbruteA ))
BackColor ( RGB (0,0,0))
Box (0,0, 15, 15, RGB (225, 0, 0))
StopDrawing ()
CreateSprite ( #gentil , 32, 32)
StartDrawing ( SpriteOutput ( #gentil ))
BackColor ( RGB (0,0,0))
Box (0,0, 63, 63, RGB (46, 135, 55))
StopDrawing ()
CreateSprite ( #tirgentil , 16, 16)
StartDrawing ( SpriteOutput ( #tirgentil ))
BackColor ( RGB (0,0,0))
Box (0,0, 15, 15, RGB (46, 135, 55))
StopDrawing ()
Global Xgentil.w=512-32, Ygentil.w=600-96
Global recharge.b, zut1.w
Global nbreis.b, numbruteA.b
; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************
Event= WindowEvent ()
ExamineKeyboard ()
If numbruteA<8:FbruteA():EndIf ; ordre de Fabrication des clones bruteA.
AffichagetirbruteA() ; ordre d'affichage des clones tirs bruteA.
AffichagebruteA() ; ordre d'affichage des clones bruteA.
; vaisseau dirigé par le joueur:
If KeyboardPushed ( #PB_Key_Right ) And Xgentil<800-32:Xgentil+4:EndIf ; droite.
If KeyboardPushed ( #PB_Key_Left ) And Xgentil>0:Xgentil-4:EndIf ; gauche.
If KeyboardPushed ( #PB_Key_X ) And recharge=0:recharge=24:Ftirgentil( (Xgentil+16)-8, Ygentil ):EndIf ; tir !
If recharge>0:recharge-1:EndIf
Affichagetirgentil()
DisplayTransparentSprite( #gentil , Xgentil, Ygentil)
If KeyboardPushed ( #PB_Key_F ) And nbreis=0:nbreis+1:EndIf
If KeyboardPushed ( #PB_Key_F )=0 And nbreis=1:nbreis+1:EndIf
If KeyboardPushed ( #PB_Key_F ) And nbreis=2:nbreis+1:EndIf
If KeyboardPushed ( #PB_Key_F )=0 And nbreis=3:nbreis=0:EndIf
Gosub fps ; nombre d'image par seconde.
FlipBuffers(1)
ClearScreen(RGB(0,0,0))
; ******************************************************************************************************
If Event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ):Fin():EndIf; si clique coin haut droit ou touche Esc, alors ferme fenêtre.
ForEver
fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek
fps+1
Else
FPS$= Str (fps)
fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
If nbreis=1 Or nbreis=2:DrawText (1,1, "FPS: " +FPS$):EndIf
StopDrawing ()
Return
Procedure Ftirgentil(x,y) ; Fabrication des tirs du vaisseau du joueur
LastElement(tirg())
AddElement(tirg())
tirg()\x=x
tirg()\y=y
EndProcedure
Procedure Affichagetirgentil() ; Affichage des clones tirs du vaisseau du joueur
ForEach tirg()
;zut1+1 ; variable utilisé par le programmeur...
tirg()\y-4
DisplayTransparentSprite( #tirgentil , tirg()\x, tirg()\y)
If tirg()\boutonA=1:DeleteElement(tirg()):Continue:EndIf
; ici, nous allons vérifier
;- si un tir gentil touche une bruteA
; avec une vieille méthode:
ForEach bruteA()
If tirg()\x>bruteA()\x-1 And tirg()\x<(bruteA()\x+31)+7
If tirg()\y>bruteA()\y-1 And tirg()\y<(bruteA()\y+31)+7
tirg()\boutonA=1:DeleteElement(bruteA())
EndIf
EndIf
Next
Next
EndProcedure
Procedure FbruteA() ; Fabrication des clones bruteA
Static placement.w
LastElement(bruteA())
AddElement(bruteA())
numbruteA+1
bruteA()\id=numbruteA; je ne suis pas un numéro, noonnn !
placement+64; taille 64 colonnes +32 pour la séparation entre les bruteA, voyez.
bruteA()\x=placement
bruteA()\y=64
EndProcedure
Procedure AffichagebruteA() ; Affichage des clones bruteA
Static dirbruteA.b ; direction des bruteA
Static posYbruteA.w
Static tempotirbruteA.b
Static choixbruteA.b
tempotirbruteA+1
If tempotirbruteA>64:tempotirbruteA=0
choixbruteA=Random(7); de 0 à 7...
choixbruteA+1; ...et là +1, donc maintenant de 1 à 8.
EndIf
ForEach bruteA()
If dirbruteA=0:bruteA()\x+2
If bruteA()\x>(800-4)-32:dirbruteA=1:EndIf ; bord de l'écran droite
EndIf
If dirbruteA=2:bruteA()\x-2
If bruteA()\x<0+4:dirbruteA=3:EndIf ; bord de l'écran gauche
EndIf
bruteA()\y=posYbruteA
DisplayTransparentSprite( #alienA , bruteA()\x, bruteA()\y)
; faut attendre le dernier clone pour decendre tout ce beau monde. Ce qui complique un peu le code.
If dirbruteA=1 And LastElement(bruteA()):dirbruteA=2:posYbruteA+32:EndIf
If dirbruteA=3 And LastElement(bruteA()):dirbruteA=0:posYbruteA+32:EndIf
If choixbruteA>0 And bruteA()\id=choixbruteA; tir ennemi !!
choixbruteA=0:FtirbruteA( (bruteA()\x+16)-8, (bruteA()\y+31)-8 )
EndIf
Next
EndProcedure
Procedure FtirbruteA(x,y) ; Fabrication des tirs ennemis provenant des clones bruteA
LastElement(tirb())
AddElement(tirb())
tirb()\x=x
tirb()\y=y
EndProcedure
Procedure AffichagetirbruteA() ; Affichage des clones tirs ennemis bruteA
ForEach tirb()
tirb()\y+4
DisplayTransparentSprite( #tirbruteA , tirb()\x, tirb()\y)
; ici, nous allons vérifier
;- si un tir bruteA touche le gentil vaisseau
; du joueur, hum:
If tirb()\x>Xgentil-1 And tirb()\x<(Xgentil+31)-7
If tirb()\y>Ygentil-1 And tirb()\y<(Ygentil+31)-7
DeleteElement(tirb())
; game over ou perd un vaisseau ou le bouclier de celui-ci... c'est à vous de continuer l'aventure.
EndIf
EndIf
Next
EndProcedure
Procedure.l Fin()
If IsImage(#alienA):FreeImage(#alienA):EndIf
If IsImage(#tirbruteA):FreeImage(#tirbruteA):EndIf
If IsImage(#gentil):FreeImage(#gentil):EndIf
If IsImage(#tirgentil):FreeImage(#tirgentil):EndIf
End
EndProcedure