mettez moi sur la bonne voie tableau structure ?????

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

mettez moi sur la bonne voie tableau structure ?????

Message par geantvert »

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
Anonyme

Message par Anonyme »

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 :




   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
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

mettez moi sur la bonne voie tableau structure ?????

Message par geantvert »

Merci beaucoup,j'etudie la chose pas si facile PUREBASIC mais puissant
ker2x
Messages : 61
Inscription : dim. 11/mai/2008 7:27

Re: mettez moi sur la bonne voie tableau structure ?????

Message par ker2x »

geantvert a écrit :Merci beaucoup,j'etudie la chose pas si facile PUREBASIC mais puissant
C'est vrai.
Mais cela dit, on peut difficilement faire plus facile :)
Cpl.Bator a écrit :donc en gros il te faut comme structure ceci :
Ca serait sympa que, dans tes exemples, tu n'utilises pas des nom qui ressemblent a des mots-clé ... mais qui n'en sont pas :)
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 :)
Anonyme

Message par Anonyme »

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.

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"
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.
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

Message par geantvert »

bonsoir je vous remercie de votre attention mais je suis un petit amteur de basic et en plus je ne capte rien a l'anglais,bon j'ai rien pour moi,mais je suis beau(je reve)
une petite question les petits x et y qu'est ce que c'est?
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

C'est vrai que Entity porte un peu à confusion. Mais, par contre la structuration c'est super.

En fait, ce qui manque un peu pour se familiariser avec ce code c'est de la tabulation et la coloration de code de Dobro.
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

Message par geantvert »

bon ben c'est tout amusez vous entre vous je me sens tout seul
petit perdu dans la cour des grands
c'est quoi c'est petits x y
non je deconne je vous remercie de votre attention il y a quand meme une bonne entente sur ce forum on pourrait ce croire en famille
Anonyme

Message par Anonyme »

x&y = la position sur l'écran.

++
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

Message par geantvert »

je vous remercie avec un peu de retard je n'ai guere de temps merci
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

je vais peter un boulon

Message par geantvert »

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

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]
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: je vais peter un boulon

Message par beauregard »

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:

Code : Tout sélectionner

Procedure affichenemi1()

 ForEach pose1();- Affichage clone pose1 si existe.




; et là, tu code fébrilement tes clones pose1...






 Next
EndProcedure 
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).
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

Message par geantvert »

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
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

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
non, il s'agit de la commande delay(). Cette nuit, j'ai fait ce code qui t'aidera sûrement:

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  
geantvert
Messages : 34
Inscription : dim. 09/déc./2007 20:15

Message par geantvert »

ah quelle belle communauté que le forum purebasic ,mille merci j'en demandais pas temps,je vais etudier ton code de pres ,c'est sympa de ta part,je pensais que le delay me permettait d'avoir le temps de voir mon petit final
a plus et encore merci
Répondre