test font,barre d'énergie,collision,timer

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

test font,barre d'énergie,collision,timer

Message par raven »

bonjour,
pour ce test je me suis inspiré de ce code pour la barre d'énergie.

Code : Tout sélectionner

;auteur Huitbit
;barre d'énergie avec clipsprite
;pb v4.02
;***************************************************
#largeur_barre=200
#hauteur_barre=#largeur_barre/10
InitSprite()

OpenWindow(0,0,0,#largeur_barre,2*#hauteur_barre,"barre d'énergie",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_barre,2*#hauteur_barre,1,0,0)

;dessin de la barre complète
CreateSprite(0,#largeur_barre,#hauteur_barre)
StartDrawing(SpriteOutput(0))
For  i=0 To #hauteur_barre/2
  Line(0,i,#largeur_barre,1,RGB(100+15*i,0,0))
  Line(0,i+#hauteur_barre/2,#largeur_barre,1,RGB(255-15*i,0,0))
Next i
For i = 1 To 9
  Line(#hauteur_barre*i,0,1,#hauteur_barre,RGB(100,100,100))
Next i
StopDrawing()

x=0;niveau d'énergie
dx=1;variation du niveau d'énergie
Repeat
 
  Repeat
    Event = WindowEvent()     
    If  Event = #PB_Event_CloseWindow
      End
    EndIf
  Until Event = 0
 
  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))
  ClipSprite(0,0,0,x,#hauteur_barre);affichage partiel de la barre d'énergie
  DisplaySprite(0, 0,10)
 
  x=x+dx
  If x>#largeur_barre Or x=<0
    dx=-dx
  EndIf
 
ForEver
j'ai voulut testé les fontes,les collisions et un timer.
il doit avoir pas mal d'erreur dans mon code.

Code : Tout sélectionner

;test font,barre d'energie,collision,timer
EnableExplicit
;- Initialisations
If InitSprite()=0 Or InitKeyboard()=0 ;Or InitSound() = 0
  MessageRequester("Probleme","Initialisations impossibles",0)
  End
EndIf
;fenetre
Enumeration fenetre
  #fenetre
EndEnumeration
;font
Enumeration  
  #font
EndEnumeration
;sprite
Enumeration
  #etoile
  #etoile2
  #etoile3
  #Bg
  #ravitaillement
  #ravitaillement2
  #astronaute
  #barre_fond
  #pieces
  #fond_base
  #lune
  #dessin_intro
  #HB
EndEnumeration

Structure Star
  Xpos.i
  Ypos.i
  vit.i
  couleur.b
EndStructure

#barre = 550
#NBstar = 99
#Sas = 80

Global i,Event,ctime_oxygene,time_oxygene = 1000/8 ;timer barre oxygene
Global largeur_ecran,hauteur_ecran,ravitaillement_posx,ravitaillement_posy,Astronaute_Posx,Astronaute_Posy,t
Global oxygene,variation_oxygene,player,aff_oxygene,Boost_Oxygene
Global ctime_deplacement,time_deplacement=1000/2 
Global affiche_gameover,credits,Vies,Vies_Posx,Vies_Posy
Global Lune_posx,Lune_Posy,ravitaillement2_posx,ravitaillement2_posy,Intro_Posx,Intro_Posy,Intro_logo,Sas,Sas_variation
Global Dim stars.star(#NBstar)  ; tableau etoile                                                                                       
Global Lstar,Hstar,Lstarv,Hstarv,Score,base_x,base_y,sas_posx,sas_posy       
;variables ecran
largeur_ecran = 1024
hauteur_ecran = 768

ravitaillement_posx = 500
ravitaillement_posy = 380
ravitaillement2_posx = 500
ravitaillement2_posy = 380
Astronaute_Posx = -50
Astronaute_Posy = 380
oxygene = 550
variation_oxygene = 1
vies = 1
Vies_Posx = 10
Vies_Posy =12
credits = 1
Lune_posx = 1024
Lune_Posy = -130
Lstar = 1024
Hstar = 768
Intro_logo = #True
Intro_Posx = 120
Intro_Posy = 0
Sas = 80
Sas_variation=1
Score = 0
base_x =720
base_y = 80
sas_posx = 720
sas_posy = 0
;ecran
OpenWindow(#fenetre,0,0,largeur_ecran,hauteur_ecran,"test font,barre energie,collision,timer",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#fenetre),0,0,largeur_ecran,hauteur_ecran)

Procedure newfont()
  Protected font
  font=LoadFont(#font, "arial",15)
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#font))
  DrawText(760,700,"Position astronaute X: "+Str(Vies_Posx),RGB(255,255,255))
  DrawText(760,730,"Position astronaute Y: "+Str(Vies_Posy),RGB(255,255,255))
  DrawText(450,680,"Score : " +Str(Score),RGB(125,125,255))
  DrawText(10,680,"Vie : "+Str(vies),RGB(255,255,0))
  DrawText(90,680,"Credit : "+Str(credits),RGB(0,155,55))
  If player=1
    DrawText(470,320,"PLAYER 1",RGB(255,255,155))
  EndIf
  ;si il y a collision avec le sprite ravitaillement et l'astronaute on affiche le message level up.
  If SpritePixelCollision(#ravitaillement,ravitaillement_posx,ravitaillement_posy,#astronaute,Astronaute_Posx,Astronaute_Posy):DrawText(470,320,"LEVEL UP",RGB(255,255,155)):EndIf
  ; on affiche player 1  a la position 50 en x de l'astronaute
  If Astronaute_Posx >50:player=1:EndIf
  ;on desactive le message player 1 à la position en x de 250 de l'astronaute
  If Astronaute_Posx >250:player=0:EndIf
  
  If affiche_gameover=#True: DrawText(460,320,"GAME OVER",RGB(255,255,155)):Else:affiche_gameover=#False:EndIf  
  
  If aff_oxygene=1: DrawText(250,680,"Oxygene : "+Str(oxygene),RGB(25,125,255)):EndIf
  ;si oxygene est different de 250 affiche oxygene interface
  If oxygene<>250:aff_oxygene=1:EndIf 
  ;si oxygene et plus bas que 250 affiche message critique
  If oxygene<250:DrawText(200,680,"Oxygene niveau critique ",RGB(t+255,0,0)):aff_oxygene=0:EndIf
  If Boost_Oxygene=#True:DrawText(250,655,"Boost Oxygene ",RGB(0,t+255,0)):EndIf
  ;intensité font
  If  t>0:t-255:Else:t+1:EndIf
  
  StopDrawing()
EndProcedure
;--- barre d'oxygene ---
Procedure Bg()
  CreateSprite(#Bg,550,10,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#Bg))
  For i = 0 To #barre
    Box(0,0,550,10,RGB(25,155,255))
  Next i
  StopDrawing()
  ClipSprite(#Bg,0,0,oxygene,#barre)
  DisplayTransparentSprite(#Bg,largeur_ecran/2-485,hauteur_ecran-45)
EndProcedure
;--- Astronaute ---
Procedure astronaute()
  CreateSprite(#astronaute,120,120,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
  StartDrawing(SpriteOutput(#astronaute))
  Circle(28,28,18,$666666)
  Circle(34,28,13,RGB(0,155,255))
  Box(18,45,20,55,$666666)
  Box(5,45,12,30,$ffffff)
  Box(20,45,12,30,$ccffff)
  Box(30,65,12,10,$ccffff)
  Box(5,15,2,30,$ffffff) 
  Box(15,95,35,10,$FFFFFF)
  StopDrawing()
  
  TransparentSpriteColor(#astronaute,RGB(0,0,0))
  ZoomSprite(#astronaute,60,60)
  DisplayTransparentSprite(#astronaute,Astronaute_Posx,Astronaute_Posy)
  DisplayTransparentSprite(#astronaute,Vies_Posx,Vies_Posy+15)
 EndProcedure

Procedure ravitaillement()
  CreateSprite(#ravitaillement,80,80,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
  StartDrawing(SpriteOutput(#ravitaillement))
  Box(0,0,80,80,RGB(175,175,175))
  Box(0,0,80,3,RGB(125,125,125))
  Box(0,2,3,79,RGB(125,125,125))
  Box(0,80,80,3,RGB(125,125,125))
  Box(77,2,3,79,RGB(125,125,125))
  Box(0,15,80,3,RGB(125,125,125))
  Box(3,18,74,7,RGB(0,t+255,0))
  Box(0,25,80,3,RGB(125,125,125))
  Box(0,50,80,3,RGB(125,125,125))
  Box(3,53,74,7,RGB(255,255,115))
  Box(0,60,80,3,RGB(125,125,125))
  Circle(12,9,2,RGB(115,115,115))
  Circle(66,9,2,RGB(115,115,115))
  Circle(12,71,2,RGB(115,115,115))
  Circle(66,71,2,RGB(115,115,115))
  StopDrawing()
  
  TransparentSpriteColor(#ravitaillement,RGB(0,0,0))
  ZoomSprite(#ravitaillement,32,32)
  DisplayTransparentSprite(#ravitaillement,ravitaillement_posx,ravitaillement_posy)
 EndProcedure

Procedure ravitaillement2()
  CreateSprite(#ravitaillement2,80,80,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
  StartDrawing(SpriteOutput(#ravitaillement2))
  Box(0,0,80,80,RGB(175,175,175))
  Box(0,0,80,3,RGB(125,125,125))
  Box(0,0,3,79,RGB(125,125,125))
  Box(0,80,80,3,RGB(125,125,125))
  Box(77,2,3,79,RGB(125,125,125))
  Box(0,15,80,3,RGB(125,125,125))
  Box(3,18,74,7,RGB(Random(255),Random(255),Random(255)))
  Box(0,25,80,3,RGB(125,125,125))
  Box(0,50,80,3,RGB(125,125,125))
  Box(3,53,74,7,RGB(Random(255),Random(255),Random(255)))
  Box(0,60,80,3,RGB(125,125,125))
  Circle(12,9,2,RGB(115,115,115))
  Circle(66,9,2,RGB(115,115,115))
  Circle(12,71,2,RGB(115,115,115))
  Circle(66,71,2,RGB(115,115,115))
  StopDrawing()
EndProcedure
;--- décor base
Procedure decor_base()
  CopySprite(#ravitaillement,#fond_base)
  ;test decor base                                     
  DisplayTransparentSprite(#fond_base,0,0)
  DisplayTransparentSprite(#fond_base,480,0)
  DisplayTransparentSprite(#fond_base,800,0)
  DisplayTransparentSprite(#fond_base,960,0)
  DisplayTransparentSprite(#fond_base,160,0)
  DisplayTransparentSprite(#fond_base,320,0)
  DisplayTransparentSprite(#fond_base,640,0)
  ZoomSprite(#fond_base,80,40)
  DisplayTransparentSprite(#fond_base,80,80)
  DisplayTransparentSprite(#fond_base,0,80)
  DisplayTransparentSprite(#fond_base,160,80)
  DisplayTransparentSprite(#fond_base,240,80)
  DisplayTransparentSprite(#fond_base,320,80)
  DisplayTransparentSprite(#fond_base,400,80)
  DisplayTransparentSprite(#fond_base,480,80)
  DisplayTransparentSprite(#fond_base,560,80)
  DisplayTransparentSprite(#fond_base,640,80)
  DisplayTransparentSprite(#fond_base,base_x,base_y)
  DisplayTransparentSprite(#fond_base,800,80)
  DisplayTransparentSprite(#fond_base,880,80)
  DisplayTransparentSprite(#fond_base,960,80)
EndProcedure
;--- Lune ---
Procedure Lune()
  CreateSprite(#Lune,360,360,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#Lune))
  Circle(178,172,37,RGB(t+255,0,0))
  Circle(178,172,36,RGB(Random(255),Random(255),Random(255)))
  Circle(180,172,35,RGB(125,155,155))
  Circle(228,184,6,RGB(115,115,t+255))
  StopDrawing()
  
  If Lune_Posx<-250:Lune_Posx=1024:EndIf
  TransparentSpriteColor(#lune,RGB(0,0,0))
  DisplayTransparentSprite(#Lune,Lune_Posx,Lune_Posy)
  Lune_posx - 1
EndProcedure
;-- piece ---
Procedure pieces()
  CreateSprite(#pieces,60,60,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#pieces))
  Circle(34,28,15,RGB(255,255,255))
  Circle(34,28,14,RGB(155,155,0))
  Circle(34,28,12,RGB(155,125,0))
  Circle(34,28,8,RGB(155,155,100))
  StopDrawing()
EndProcedure
 ;fenetre base
Procedure Hb()
  CreateSprite(#HB,80,80,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#HB))
   Box(0,0,80,80,RGB(175,175,175))
  Box(0,0,80,3,RGB(125,125,125))
  Box(0,0,3,79,RGB(125,125,125))
  Box(0,80,80,3,RGB(125,125,125))
  Box(77,2,3,79,RGB(125,125,125))
  Box(0,78,80,3,RGB(125,125,125))
  Box(5,15,70,50,RGB(0,0,0))
  Circle(12,9,2,RGB(115,115,115))
  Circle(66,9,2,RGB(115,115,115))
  Circle(66,70,2,RGB(115,115,115))
  Circle(12,70,2,RGB(115,115,115))
  StopDrawing()
  TransparentSpriteColor(#HB,RGB(0,0,0))
  DisplayTransparentSprite(#HB,480,0)
  DisplayTransparentSprite(#HB,400,0)
  DisplayTransparentSprite(#HB,240,0)
  DisplayTransparentSprite(#HB,80,0)
  DisplayTransparentSprite(#HB,560,0)
  DisplayTransparentSprite(#HB,880,0)
EndProcedure
;--- sas ----
Procedure Sas()
  CreateSprite(#sas,80,80,#PB_Sprite_AlphaBlending)
  StartDrawing(SpriteOutput(#sas))
  ;Box(0,0,100,100,RGB(0,255,255))
  Box(0,0,80,80,RGB(175,175,175))
  Box(0,0,80,3,RGB(125,125,125))
  Box(0,0,3,79,RGB(125,125,125))
  Box(0,80,80,3,RGB(125,125,125))
  Box(77,2,3,79,RGB(125,125,125))
  Box(0,78,80,3,RGB(125,125,125))
  Box(5,15,70,50,RGB(125,125,125))
  Box(15,25,45,15,RGB(0,0,0))
  Box(15,45,45,15,RGB(255,255,115))
  Circle(12,9,2,RGB(115,115,115))
  Circle(66,9,2,RGB(115,115,115))
  Circle(66,70,2,RGB(115,115,115))
  Circle(12,70,2,RGB(115,115,115))
  StopDrawing()
  TransparentSpriteColor(#sas,RGB(0,0,0))
  ClipSprite(#sas,0,0,#sas,sas)
  DisplayTransparentSprite(#Sas,sas_posx,sas_posy);:DisplayTransparentSprite(#sas,640,0)
  If sas>#sas Or sas=<20:sas_variation=-sas_variation:EndIf
EndProcedure
;--- timer oxygene ---
Procedure timer_oxygene()
  If ElapsedMilliseconds() - ctime_oxygene > time_oxygene ;timer barre oxygene
    ctime_oxygene = ElapsedMilliseconds()
    oxygene=oxygene - variation_oxygene
  EndIf 
EndProcedure
;--- Logo ---
Procedure Affiche_logo()
  ;o                    
  ZoomSprite(#Sas,16,16)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+17,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+34,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+51,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+17,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+51,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+34,Intro_Posy+264)
  ;x
  DisplayTransparentSprite(#Sas,Intro_Posx+100,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+117,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+134,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+151,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+167,Intro_Posy+248) 
  DisplayTransparentSprite(#Sas,Intro_Posx+184,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+167,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+151,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+134,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+117,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+100,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+184,Intro_Posy+264)
  ;y
  DisplayTransparentSprite(#Sas,Intro_Posx+251,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+284,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+234,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+217,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+217,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+317,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+317,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+300,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+267,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+267,Intro_Posy+264)
  ;G
  DisplayTransparentSprite(#Sas,Intro_Posx+367,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+367,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+231)
  ;E
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+221) 
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+221) 
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+264) 
  ;N
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+197) 
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+571,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+588,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+604,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+620,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+636,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+197) 
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+264)
  ;E
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+221)
  EndProcedure
;--- timer deplacement astronaute
Procedure time_deplacement()
  
  If ElapsedMilliseconds() - ctime_deplacement > time_deplacement
    ctime_deplacement = ElapsedMilliseconds()
     Astronaute_Posx + 50
    If Astronaute_Posx >-50
      vies = 1
      credits=0
      affiche_gameover= #False 
      Boost_Oxygene = #False
    EndIf
    
    If Astronaute_Posx>1000
      vies = 0
      affiche_gameover=#True
      credits = 1
      score - 100
      Boost_Oxygene=#True
    EndIf
    If vies=0:aff_oxygene=0:EndIf
  EndIf
EndProcedure
;--- collisions ----
Procedure collision()
  ;si il y a collision entre le sprite astronaute et le ravitaillement.
  If SpritePixelCollision(#ravitaillement,ravitaillement_posx,ravitaillement_posy,#astronaute,Astronaute_Posx,Astronaute_Posy) 
    ;on active le boost d'oxygene
    Boost_Oxygene=#True
    oxygene=oxygene + 1
    ;on deplace le 2eme astronaute
    Vies_Posx +3
    score + 5
    TransparentSpriteColor(#ravitaillement2,RGB(0,0,0))
    ZoomSprite(#ravitaillement2,32,32)
    DisplayTransparentSprite(#ravitaillement2,ravitaillement2_posx,ravitaillement2_posy)
  EndIf
EndProcedure
;-- dessine etoiles --
Procedure dessine_star()
  CreateSprite(#etoile,1,1)
  CreateSprite(#etoile2,1,1)
  CreateSprite(#etoile3,1,1)
  StartDrawing(SpriteOutput(#etoile))
  Box(0,0,1,1,$00FFFF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile2))
  Box(0,0,1,1,$0033FF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile3))
  Box(0,0,1,1,$FFCC00)
  StopDrawing()
  
EndProcedure
;----- init starfield horizontale ---------
Procedure init_star()
  Protected i
  With stars(i)
    For i = 0 To #Nbstar
      \Xpos = i*Lstar / #Nbstar
      \Ypos = i*Hstar / #Nbstar
      \vit=Random(4,2)
      \couleur=Random(2,0)
    Next
    For i = 0 To #Nbstar*5
      Swap stars(Random(#Nbstar))\Xpos, stars(Random(#Nbstar))\Xpos
      Swap stars(Random(#Nbstar))\Ypos, stars(Random(#Nbstar))\Ypos
    Next i
  EndWith
EndProcedure
;----------- affiche starfield horizontale ---------
Procedure affiche_star()
  Protected i
  For i= 0 To #nbstar
    DisplayTransparentSprite(stars(i)\couleur,stars(i)\Xpos,stars(i)\Ypos)
    stars(i)\Xpos - stars(i)\vit
    If stars(i)\Xpos < = 0
      stars(i)\Xpos + Lstar
    EndIf
  Next
EndProcedure

pieces()
dessine_star()
astronaute()
init_star()

SpriteQuality(#PB_Sprite_BilinearFiltering)
;-boucle
Repeat ; 2d
  
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
  ExamineKeyboard()
  ; on appelle les procedures
  affiche_star()
  Lune()
  ravitaillement()
  ravitaillement2()
  collision()
  astronaute()
  decor_base()
  Hb()
  sas()
  timer_oxygene()
  time_deplacement() 
  newfont()
  bg()
  
  ;si l'astraunaute sort de l'ecran en x il reapparait à la position de depart - 50 pixels
  If Astronaute_Posx>largeur_ecran:Astronaute_Posx=-50:EndIf
  ;affichage nombre de vie astronaute
  If vies=1:credits=0:DisplayTransparentSprite(#astronaute,15,600):EndIf
  ;si j'ajoute un credit on active le boost d'oxygene et on affiche la piece    
  If credits=1:oxygene=oxygene+1: DisplayTransparentSprite(#pieces,90,600):EndIf
  ;si le 2eme astronaute sort de l'ecran en x il revient a la position de depart - 50 pixels
  If Vies_Posx>1024:Vies_Posx=-50:EndIf
  If Vies_Posx>720:sas=80:base_y+1:sas_posy+1:Else:sas_posy=0:sas=sas-Sas_variation:EndIf
  If vies_posx>720:vies_posy +1:Else:base_y=80:EndIf
  If vies_posy>520:score+1000:oxygene=300:Vies_Posy=12:vies_posx=10:EndIf
  If base_y>600:base_y-1:EndIf
  If Vies_Posx>280 And Vies_Posx<720:Affiche_logo():EndIf
  Repeat ; fenetre
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  ;on quitte si on appuie sur echap ou la croix de la fenetre (ou si le niveau d'oxygene est à 0 modif lihne 535). 
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow ;Or oxygene = 0

End
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: test font,barre d'énergie,collision,timer

Message par Huitbit »

Houlà, pb v4.02, ça date !!!

Tout ce décor à la main, ça a dû te demander pas mal d'énergie !
Peut-être qu'en mettant des data cela te permettrai plus de liberté (et moins d'efforts) au niveau des décors ?
Cela dépend bien sûr de tes projets !

Tout fonctionne mais tout dépend de ce que tu veux tester !

Hasta la vista !
Elevé au MSX !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: test font,barre d'énergie,collision,timer

Message par Mesa »

C'est excellent !

Par contre tu recrées indéfiniment les sprites en les laissant dans une procédure, il y aura peut-être une fuite de mémoire et plantage au bout d'un certain temps, de toute façon ce n'est pas utile.

Quand on utilise un WindowEvent(), ce qui est excellent ici, il ne faut pas oublier un delay(1) dans la boucle pour que le système d'exploitation ne mobilise pas le CPU continuellement (multitâche).

Code : Tout sélectionner

;test font,barre d'energie,collision,timer
; EnableExplicit
;- Initialisations
If InitSprite()=0 Or InitKeyboard()=0 ;Or InitSound() = 0
  MessageRequester("Probleme","Initialisations impossibles",0)
  End
EndIf
;fenetre
Enumeration fenetre
  #fenetre
EndEnumeration
;font
Enumeration  
  #font
EndEnumeration
;sprite
Enumeration
  #etoile
  #etoile2
  #etoile3
  #Bg
  #ravitaillement
  #ravitaillement2
  #astronaute
  #barre_fond
  #pieces
  #fond_base
  #lune
  #dessin_intro
  #HB
EndEnumeration

Structure Star
  Xpos.i
  Ypos.i
  vit.i
  couleur.b
EndStructure

#barre = 550
#NBstar = 99
#Sas = 80

Global i,Event,ctime_oxygene,time_oxygene = 1000/8 ;timer barre oxygene
Global largeur_ecran,hauteur_ecran,ravitaillement_posx,ravitaillement_posy,Astronaute_Posx,Astronaute_Posy,t
Global oxygene,variation_oxygene,player,aff_oxygene,Boost_Oxygene
Global ctime_deplacement,time_deplacement=1000/2 
Global affiche_gameover,credits,Vies,Vies_Posx,Vies_Posy
Global Lune_posx,Lune_Posy,ravitaillement2_posx,ravitaillement2_posy,Intro_Posx,Intro_Posy,Intro_logo,Sas,Sas_variation
Global Dim stars.star(#NBstar)  ; tableau etoile                                                                                       
Global Lstar,Hstar,Lstarv,Hstarv,Score,base_x,base_y,sas_posx,sas_posy       
;variables ecran
largeur_ecran = 1024
hauteur_ecran = 768

ravitaillement_posx = 500
ravitaillement_posy = 380
ravitaillement2_posx = 500
ravitaillement2_posy = 380
Astronaute_Posx = -50
Astronaute_Posy = 380
oxygene = 550
variation_oxygene = 1
vies = 1
Vies_Posx = 10
Vies_Posy =12
credits = 1
Lune_posx = 1024
Lune_Posy = -130
Lstar = 1024
Hstar = 768
Intro_logo = #True
Intro_Posx = 120
Intro_Posy = 0
Sas = 80
Sas_variation=1
Score = 0
base_x =720
base_y = 80
sas_posx = 720
sas_posy = 0



;ecran
OpenWindow(#fenetre,0,0,largeur_ecran,hauteur_ecran,"test font,barre energie,collision,timer",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
;Bureau
; Si le bureau fait déjà 1028x768, le screen ne s'affichera pas en entier
ExamineDesktops()
BureauH = DesktopHeight(0)
If BureauH <= 768
  hauteur_ecran = WindowHeight(0,#PB_Window_InnerCoordinate)
  ; ne marche pas car les position en X et Y sont des constantes pas des variables.
EndIf

OpenWindowedScreen(WindowID(#fenetre),0,0,largeur_ecran,hauteur_ecran)

Global font
font=LoadFont(#font, "arial",15)

Procedure newfont()
  
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#font))
  DrawText(760,700,"Position astronaute X: "+Str(Vies_Posx),RGB(255,255,255))
  DrawText(760,730,"Position astronaute Y: "+Str(Vies_Posy),RGB(255,255,255))
  DrawText(450,680,"Score : " +Str(Score),RGB(125,125,255))
  DrawText(10,680,"Vie : "+Str(vies),RGB(255,255,0))
  DrawText(90,680,"Credit : "+Str(credits),RGB(0,155,55))
  If player=1
    DrawText(470,320,"PLAYER 1",RGB(255,255,155))
  EndIf
  ;si il y a collision avec le sprite ravitaillement et l'astronaute on affiche le message level up.
  If SpritePixelCollision(#ravitaillement,ravitaillement_posx,ravitaillement_posy,#astronaute,Astronaute_Posx,Astronaute_Posy):DrawText(470,320,"LEVEL UP",RGB(255,255,155)):EndIf
  ; on affiche player 1  a la position 50 en x de l'astronaute
  If Astronaute_Posx >50:player=1:EndIf
  ;on desactive le message player 1 à la position en x de 250 de l'astronaute
  If Astronaute_Posx >250:player=0:EndIf
  
  If affiche_gameover=#True: DrawText(460,320,"GAME OVER",RGB(255,255,155)):Else:affiche_gameover=#False:EndIf  
  
  If aff_oxygene=1: DrawText(250,680,"Oxygene : "+Str(oxygene),RGB(25,125,255)):EndIf
  ;si oxygene est different de 250 affiche oxygene interface
  If oxygene<>250:aff_oxygene=1:EndIf 
  ;si oxygene et plus bas que 250 affiche message critique
  If oxygene<250:DrawText(200,680,"Oxygene niveau critique ",RGB(t+255,0,0)):aff_oxygene=0:EndIf
  If Boost_Oxygene=#True:DrawText(250,655,"Boost Oxygene ",RGB(0,t+255,0)):EndIf
  ;intensité font
  If  t>0:t-255:Else:t+1:EndIf
  
  StopDrawing()
EndProcedure
;--- barre d'oxygene ---
CreateSprite(#Bg,550,10,#PB_Sprite_AlphaBlending); on ne le crée qu'ube seule fois
StartDrawing(SpriteOutput(#Bg))
For i = 0 To #barre
  Box(0,0,550,10,RGB(25,155,255))
Next i
StopDrawing()
Procedure Bg()
  
  
  ClipSprite(#Bg,0,0,oxygene,#barre)
  DisplayTransparentSprite(#Bg,largeur_ecran/2-485,hauteur_ecran-45)
EndProcedure
;--- Astronaute ---
CreateSprite(#astronaute,120,120,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(#astronaute))
Circle(28,28,18,$666666)
Circle(34,28,13,RGB(0,155,255))
Box(18,45,20,55,$666666)
Box(5,45,12,30,$ffffff)
Box(20,45,12,30,$ccffff)
Box(30,65,12,10,$ccffff)
Box(5,15,2,30,$ffffff) 
Box(15,95,35,10,$FFFFFF)
StopDrawing()

TransparentSpriteColor(#astronaute,RGB(0,0,0))
ZoomSprite(#astronaute,60,60)
Procedure astronaute()
  
  
  DisplayTransparentSprite(#astronaute,Astronaute_Posx,Astronaute_Posy)
  DisplayTransparentSprite(#astronaute,Vies_Posx,Vies_Posy+15)
EndProcedure
CreateSprite(#ravitaillement,80,80,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(#ravitaillement))
Box(0,0,80,80,RGB(175,175,175))
Box(0,0,80,3,RGB(125,125,125))
Box(0,2,3,79,RGB(125,125,125))
Box(0,80,80,3,RGB(125,125,125))
Box(77,2,3,79,RGB(125,125,125))
Box(0,15,80,3,RGB(125,125,125))
Box(3,18,74,7,RGB(0,t+255,0))
Box(0,25,80,3,RGB(125,125,125))
Box(0,50,80,3,RGB(125,125,125))
Box(3,53,74,7,RGB(255,255,115))
Box(0,60,80,3,RGB(125,125,125))
Circle(12,9,2,RGB(115,115,115))
Circle(66,9,2,RGB(115,115,115))
Circle(12,71,2,RGB(115,115,115))
Circle(66,71,2,RGB(115,115,115))
StopDrawing()

TransparentSpriteColor(#ravitaillement,RGB(0,0,0))
ZoomSprite(#ravitaillement,32,32)
Procedure ravitaillement()
  
  DisplayTransparentSprite(#ravitaillement,ravitaillement_posx,ravitaillement_posy)
EndProcedure
CreateSprite(#ravitaillement2,80,80,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
StartDrawing(SpriteOutput(#ravitaillement2))
Box(0,0,80,80,RGB(175,175,175))
Box(0,0,80,3,RGB(125,125,125))
Box(0,0,3,79,RGB(125,125,125))
Box(0,80,80,3,RGB(125,125,125))
Box(77,2,3,79,RGB(125,125,125))
Box(0,15,80,3,RGB(125,125,125))
Box(3,18,74,7,RGB(Random(255),Random(255),Random(255)))
Box(0,25,80,3,RGB(125,125,125))
Box(0,50,80,3,RGB(125,125,125))
Box(3,53,74,7,RGB(Random(255),Random(255),Random(255)))
Box(0,60,80,3,RGB(125,125,125))
Circle(12,9,2,RGB(115,115,115))
Circle(66,9,2,RGB(115,115,115))
Circle(12,71,2,RGB(115,115,115))
Circle(66,71,2,RGB(115,115,115))
StopDrawing()

Procedure ravitaillement2()
  
  StartDrawing(SpriteOutput(#ravitaillement2))
  Box(0,0,80,80,RGB(175,175,175))
  Box(0,0,80,3,RGB(125,125,125))
  Box(0,0,3,79,RGB(125,125,125))
  Box(0,80,80,3,RGB(125,125,125))
  Box(77,2,3,79,RGB(125,125,125))
  Box(0,15,80,3,RGB(125,125,125))
  Box(3,18,74,7,RGB(Random(255),Random(255),Random(255)))
  Box(0,25,80,3,RGB(125,125,125))
  Box(0,50,80,3,RGB(125,125,125))
  Box(3,53,74,7,RGB(Random(255),Random(255),Random(255)))
  Box(0,60,80,3,RGB(125,125,125))
  Circle(12,9,2,RGB(115,115,115))
  Circle(66,9,2,RGB(115,115,115))
  Circle(12,71,2,RGB(115,115,115))
  Circle(66,71,2,RGB(115,115,115))
  StopDrawing()
EndProcedure
;--- décor base
CopySprite(#ravitaillement,#fond_base)
Procedure decor_base()
  
  ;test decor base                                     
  DisplayTransparentSprite(#fond_base,0,0)
  DisplayTransparentSprite(#fond_base,480,0)
  DisplayTransparentSprite(#fond_base,800,0)
  DisplayTransparentSprite(#fond_base,960,0)
  DisplayTransparentSprite(#fond_base,160,0)
  DisplayTransparentSprite(#fond_base,320,0)
  DisplayTransparentSprite(#fond_base,640,0)
  ZoomSprite(#fond_base,80,40)
  DisplayTransparentSprite(#fond_base,80,80)
  DisplayTransparentSprite(#fond_base,0,80)
  DisplayTransparentSprite(#fond_base,160,80)
  DisplayTransparentSprite(#fond_base,240,80)
  DisplayTransparentSprite(#fond_base,320,80)
  DisplayTransparentSprite(#fond_base,400,80)
  DisplayTransparentSprite(#fond_base,480,80)
  DisplayTransparentSprite(#fond_base,560,80)
  DisplayTransparentSprite(#fond_base,640,80)
  DisplayTransparentSprite(#fond_base,base_x,base_y)
  DisplayTransparentSprite(#fond_base,800,80)
  DisplayTransparentSprite(#fond_base,880,80)
  DisplayTransparentSprite(#fond_base,960,80)
EndProcedure
;--- Lune ---
CreateSprite(#Lune,360,360,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#Lune))
Circle(178,172,37,RGB(t+255,0,0))
Circle(178,172,36,RGB(Random(255),Random(255),Random(255)))
Circle(180,172,35,RGB(125,155,155))
Circle(228,184,6,RGB(115,115,t+255))
StopDrawing()
Procedure Lune()
  
  
  
  If Lune_Posx<-250:Lune_Posx=1024:EndIf
  TransparentSpriteColor(#lune,RGB(0,0,0))
  DisplayTransparentSprite(#Lune,Lune_Posx,Lune_Posy)
  Lune_posx - 1
EndProcedure
;-- piece ---
CreateSprite(#pieces,60,60,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#pieces))
Circle(34,28,15,RGB(255,255,255))
Circle(34,28,14,RGB(155,155,0))
Circle(34,28,12,RGB(155,125,0))
Circle(34,28,8,RGB(155,155,100))
StopDrawing()
Procedure pieces()
  
EndProcedure
;fenetre base
CreateSprite(#HB,80,80,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#HB))
Box(0,0,80,80,RGB(175,175,175))
Box(0,0,80,3,RGB(125,125,125))
Box(0,0,3,79,RGB(125,125,125))
Box(0,80,80,3,RGB(125,125,125))
Box(77,2,3,79,RGB(125,125,125))
Box(0,78,80,3,RGB(125,125,125))
Box(5,15,70,50,RGB(0,0,0))
Circle(12,9,2,RGB(115,115,115))
Circle(66,9,2,RGB(115,115,115))
Circle(66,70,2,RGB(115,115,115))
Circle(12,70,2,RGB(115,115,115))
StopDrawing()
Procedure Hb()
  
  TransparentSpriteColor(#HB,RGB(0,0,0))
  DisplayTransparentSprite(#HB,480,0)
  DisplayTransparentSprite(#HB,400,0)
  DisplayTransparentSprite(#HB,240,0)
  DisplayTransparentSprite(#HB,80,0)
  DisplayTransparentSprite(#HB,560,0)
  DisplayTransparentSprite(#HB,880,0)
EndProcedure
;--- sas ----
CreateSprite(#sas,80,80,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#sas))
;Box(0,0,100,100,RGB(0,255,255))
Box(0,0,80,80,RGB(175,175,175))
Box(0,0,80,3,RGB(125,125,125))
Box(0,0,3,79,RGB(125,125,125))
Box(0,80,80,3,RGB(125,125,125))
Box(77,2,3,79,RGB(125,125,125))
Box(0,78,80,3,RGB(125,125,125))
Box(5,15,70,50,RGB(125,125,125))
Box(15,25,45,15,RGB(0,0,0))
Box(15,45,45,15,RGB(255,255,115))
Circle(12,9,2,RGB(115,115,115))
Circle(66,9,2,RGB(115,115,115))
Circle(66,70,2,RGB(115,115,115))
Circle(12,70,2,RGB(115,115,115))
StopDrawing()
Procedure Sas()
  
  TransparentSpriteColor(#sas,RGB(0,0,0))
  ClipSprite(#sas,0,0,#sas,sas)
  DisplayTransparentSprite(#Sas,sas_posx,sas_posy);:DisplayTransparentSprite(#sas,640,0)
  If sas>#sas Or sas=<20:sas_variation=-sas_variation:EndIf
EndProcedure
;--- timer oxygene ---
Procedure timer_oxygene()
  If ElapsedMilliseconds() - ctime_oxygene > time_oxygene ;timer barre oxygene
    ctime_oxygene = ElapsedMilliseconds()
    oxygene=oxygene - variation_oxygene
  EndIf 
EndProcedure
;--- Logo ---
Procedure Affiche_logo()
  ;o                    
  ZoomSprite(#Sas,16,16)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+17,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+34,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+51,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+67,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+17,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+51,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+34,Intro_Posy+264)
  ;x
  DisplayTransparentSprite(#Sas,Intro_Posx+100,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+117,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+134,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+151,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+167,Intro_Posy+248) 
  DisplayTransparentSprite(#Sas,Intro_Posx+184,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+167,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+151,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+134,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+117,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+100,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+184,Intro_Posy+264)
  ;y
  DisplayTransparentSprite(#Sas,Intro_Posx+251,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+284,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+234,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+217,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+217,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+317,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+317,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+300,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+267,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+267,Intro_Posy+264)
  ;G
  DisplayTransparentSprite(#Sas,Intro_Posx+367,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+351,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+367,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+417,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+384,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+400,Intro_Posy+231)
  ;E
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+451,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+221) 
  DisplayTransparentSprite(#Sas,Intro_Posx+519,Intro_Posy+221) 
  DisplayTransparentSprite(#Sas,Intro_Posx+468,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+485,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+502,Intro_Posy+264) 
  ;N
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+197) 
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+555,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+571,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+588,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+604,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+620,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+636,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+180) 
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+197) 
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+652,Intro_Posy+264)
  ;E
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+180)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+197)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+214)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+231)
  DisplayTransparentSprite(#Sas,Intro_Posx+684,Intro_Posy+248)
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+264)
  DisplayTransparentSprite(#Sas,Intro_Posx+700,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+716,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+732,Intro_Posy+221)
  DisplayTransparentSprite(#Sas,Intro_Posx+748,Intro_Posy+221)
EndProcedure
;--- timer deplacement astronaute
Procedure time_deplacement()
  
  If ElapsedMilliseconds() - ctime_deplacement > time_deplacement
    ctime_deplacement = ElapsedMilliseconds()
    Astronaute_Posx + 50
    If Astronaute_Posx >-50
      vies = 1
      credits=0
      affiche_gameover= #False 
      Boost_Oxygene = #False
    EndIf
    
    If Astronaute_Posx>1000
      vies = 0
      affiche_gameover=#True
      credits = 1
      score - 100
      Boost_Oxygene=#True
    EndIf
    If vies=0:aff_oxygene=0:EndIf
  EndIf
EndProcedure
;--- collisions ----
Procedure collision()
  ;si il y a collision entre le sprite astronaute et le ravitaillement.
  If SpritePixelCollision(#ravitaillement,ravitaillement_posx,ravitaillement_posy,#astronaute,Astronaute_Posx,Astronaute_Posy) 
    ;on active le boost d'oxygene
    Boost_Oxygene=#True
    oxygene=oxygene + 1
    ;on deplace le 2eme astronaute
    Vies_Posx +3
    score + 5
    TransparentSpriteColor(#ravitaillement2,RGB(0,0,0))
    ZoomSprite(#ravitaillement2,32,32)
    DisplayTransparentSprite(#ravitaillement2,ravitaillement2_posx,ravitaillement2_posy)
  EndIf
EndProcedure
;-- dessine etoiles --
Procedure dessine_star()
  CreateSprite(#etoile,1,1)
  CreateSprite(#etoile2,1,1)
  CreateSprite(#etoile3,1,1)
  StartDrawing(SpriteOutput(#etoile))
  Box(0,0,1,1,$00FFFF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile2))
  Box(0,0,1,1,$0033FF)
  StopDrawing()
  
  StartDrawing(SpriteOutput(#etoile3))
  Box(0,0,1,1,$FFCC00)
  StopDrawing()
  
EndProcedure
;----- init starfield horizontale ---------
Procedure init_star()
  Protected i
  With stars(i)
    For i = 0 To #Nbstar
      \Xpos = i*Lstar / #Nbstar
      \Ypos = i*Hstar / #Nbstar
      \vit=Random(4,2)
      \couleur=Random(2,0)
    Next
    For i = 0 To #Nbstar*5
      Swap stars(Random(#Nbstar))\Xpos, stars(Random(#Nbstar))\Xpos
      Swap stars(Random(#Nbstar))\Ypos, stars(Random(#Nbstar))\Ypos
    Next i
  EndWith
EndProcedure
;----------- affiche starfield horizontale ---------
Procedure affiche_star()
  Protected i
  For i= 0 To #nbstar
    DisplayTransparentSprite(stars(i)\couleur,stars(i)\Xpos,stars(i)\Ypos)
    stars(i)\Xpos - stars(i)\vit
    If stars(i)\Xpos < = 0
      stars(i)\Xpos + Lstar
    EndIf
  Next
EndProcedure

pieces()
dessine_star()
astronaute()
init_star()

SpriteQuality(#PB_Sprite_BilinearFiltering)
;-boucle
Repeat ; 2d
  
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
  ExamineKeyboard()
  ; on appelle les procedures
  affiche_star()
  Lune()
  ravitaillement()
  ; 	ravitaillement2()
  collision()
  astronaute()
  decor_base()
  Hb()
  sas()
  timer_oxygene()
  time_deplacement() 
  newfont()
  bg()
  
  ;si l'astraunaute sort de l'ecran en x il reapparait à la position de depart - 50 pixels
  If Astronaute_Posx>largeur_ecran:Astronaute_Posx=-50:EndIf
  ;affichage nombre de vie astronaute
  If vies=1:credits=0:DisplayTransparentSprite(#astronaute,15,600):EndIf
  ;si j'ajoute un credit on active le boost d'oxygene et on affiche la piece    
  If credits=1:oxygene=oxygene+1: DisplayTransparentSprite(#pieces,90,600):EndIf
  ;si le 2eme astronaute sort de l'ecran en x il revient a la position de depart - 50 pixels
  If Vies_Posx>1024:Vies_Posx=-50:EndIf
  If Vies_Posx>720:sas=80:base_y+1:sas_posy+1:Else:sas_posy=0:sas=sas-Sas_variation:EndIf
  If vies_posx>720:vies_posy +1:Else:base_y=80:EndIf
  If vies_posy>520:score+1000:oxygene=300:Vies_Posy=12:vies_posx=10:EndIf
  If base_y>600:base_y-1:EndIf
  If Vies_Posx>280 And Vies_Posx<720:Affiche_logo():EndIf
  
  Delay(1); IMPORTANT pour le multithreading de l'OS

  Repeat  ; fenetre
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  ;on quitte si on appuie sur echap ou la croix de la fenetre (ou si le niveau d'oxygene est à 0 modif lihne 535). 
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow ;Or oxygene = 0

End
M.
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: test font,barre d'énergie,collision,timer

Message par raven »

en faite je suis en train de reflechir pour la mise en place du code pour un projet de jeu.
un jeu avec un gameplay tres simple.j'ai voulut test ce que j'avais en tete pour avoir un petit aperçu à l'écran.

mais deja la fonte pose problème et j'ai des lacunes avec les ouvertures de fenetres.
pour la fonte,si je fait c'a y'a plus la fuite memoire,quand je regarde dans le gestionaire des taches

Code : Tout sélectionner

Procedure newfont()
  Protected font
  font=LoadFont(#font, "arial",15)
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#font))
  DrawText(5,10,"Position astronaute X: "+Str(Astronaute_Posx),RGB(255,255,255))
  DrawText(5,35,"Position astronaute Y: "+Str(Astronaute_Posy),RGB(255,255,255))
  DrawText(15,680,"Vies : "+Str(vies),RGB(255,255,255))
  
  If player=1: DrawText(450,225,"PLAYER 1",RGB(255,255,255)):EndIf
  If levelup=1:DrawText(450,255,"LEVEL UP",RGB(255,255,255)):EndIf
  If vies=0:DrawText(450,225,"GAME OVER",RGB(t+155,255,255)):EndIf
  If aff_oxygene=1:DrawText(250,690,"Oxygene : "+Str(oxygene),RGB(255,255,255)):EndIf   
  If oxygene<>250:aff_oxygene=1:EndIf 
  If oxygene<250:DrawText(200,680,"Oxygene niveau critique ",RGB(t+255,0,0)):aff_oxygene=0:EndIf
  If  t>0: t - 255:Else:t+1:EndIf
  StopDrawing()
EndProcedure
mais je charge en boulce la fonte si j'ai bien compris?au lieu de la charger une seul fois.
j'avais vu un problème similaire sur ce post http://www.purebasic.fr/french/viewtopi ... =4&t=16880
je pensais qu'en rajoutant un protected cela reglé le problème.

voici le code de départ sans le test de décor avec fuite memoire:

Code : Tout sélectionner

EnableExplicit
;- Initialisations
If InitSprite()=0 Or InitKeyboard()=0 ;Or InitSound() = 0
  MessageRequester("Probleme","Initialisations impossibles",0)
  End
EndIf

Enumeration fenetre
  #fenetre
EndEnumeration
;font
Enumeration  
  #font
EndEnumeration
;sprite
Enumeration
  #Bg
  #ravitaillement
  #astronaute
  #barre_fond
EndEnumeration

#barre = 550

Global i,Event,ctime_oxygene,time_oxygene = 1000/6
Global Ravitaillement_Posx,Ravitaillement_Posy,Astronaute_Posx,Astronaute_Posy,vies,t
Global posx,posy,oxygene,variation_oxygene,player,aff_oxygene,levelup
Global ctime_deplacement,time_deplacement=1000/2 
Global font
#largeur_ecran = 1024
#hauteur_ecran = 768
posx = 30
posy = 600
Ravitaillement_Posx = 500
Ravitaillement_Posy = 380
Astronaute_Posx = -50
Astronaute_Posy = 380
oxygene = 550
variation_oxygene = 1
vies = 1

OpenWindow(#fenetre,0,0,#largeur_ecran,#hauteur_ecran,"test barre nrj et collision",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#fenetre),0,0,#largeur_ecran,#hauteur_ecran)

CreateSprite(#Bg,550,20,#PB_Sprite_AlphaBlending):CreateSprite(#astronaute,120,120,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision)
CreateSprite(#ravitaillement,50,50,#PB_Sprite_AlphaBlending|#PB_Sprite_PixelCollision):CreateSprite(#barre_fond,560,28,#PB_Sprite_AlphaBlending)
 
  font=LoadFont(#font, "arial",15)
Procedure newfont()
 
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#font))
  DrawText(5,10,"Position astronaute X: "+Str(Astronaute_Posx),RGB(255,255,255))
  DrawText(5,35,"Position astronaute Y: "+Str(Astronaute_Posy),RGB(255,255,255))
  DrawText(15,680,"Vies : "+Str(vies),RGB(255,255,255))
  If player=1: DrawText(450,225,"PLAYER 1",RGB(255,255,255)):EndIf
  If levelup=1:DrawText(450,255,"LEVEL UP",RGB(255,255,255)):EndIf
  If vies=0:DrawText(450,225,"GAME OVER",RGB(t+155,255,255)):EndIf
  If aff_oxygene=1:DrawText(250,690,"Oxygene : "+Str(oxygene),RGB(255,255,255)):EndIf   
  If oxygene<>250:aff_oxygene=1:EndIf 
  If oxygene<250:DrawText(200,680,"Oxygene niveau critique ",RGB(t+255,0,0)):aff_oxygene=0:EndIf
  If  t>0: t - 255:Else:t+1:EndIf
  StopDrawing()
EndProcedure

Procedure Bg()
  StartDrawing(SpriteOutput(#Bg))
  For i = 0 To #barre
    Box(0,0,550,20,RGB(255,255,255))
  Next i
  StopDrawing()
EndProcedure

Procedure astronaute()
  StartDrawing(SpriteOutput(#astronaute))
  Circle(20+8,18+10,18,$666666)
  Circle(18+16,12+16,13,RGB(0,155,255))
  Box(18,45,20,55,$666666)
  Box(5,45,12,30,$ffffff)
  Box(20,45,12,30,$ccffff);antene
  Box(30,65,12,10,$ccffff)
  Box(5,15,2,30,$ffffff) ;antene
  Box(15,95,35,10,$FFFFFF)
  StopDrawing()
EndProcedure

Procedure Ravitaillement()
  StartDrawing(SpriteOutput(#ravitaillement))
  Box(0,0,50,50,RGB(Random(255),Random(255),Random(255)));$666666)
  StopDrawing()
EndProcedure

Procedure barre_fond()
  StartDrawing(SpriteOutput(#barre_fond))
  Box(0,0,560,28,$666666);$666666)
  StopDrawing()
EndProcedure

Procedure timer_oxygene()
  If ElapsedMilliseconds() - ctime_oxygene > time_oxygene ;timer barre oxygene
    ctime_oxygene = ElapsedMilliseconds()
    oxygene=oxygene - variation_oxygene
  EndIf 
EndProcedure

Procedure time_deplacement()
  If ElapsedMilliseconds() - ctime_deplacement > time_deplacement
    ctime_deplacement = ElapsedMilliseconds()
    Astronaute_Posx + 50
    If Astronaute_Posx >-50:vies=1:EndIf
    If Astronaute_Posx>1000:vies=0:EndIf 
  EndIf
EndProcedure

Procedure collision()
  If SpritePixelCollision(#ravitaillement,Ravitaillement_Posx,Ravitaillement_Posy,#astronaute,Astronaute_Posx,Astronaute_Posy)
    oxygene=oxygene +1:Ravitaillement():ZoomSprite(#ravitaillement,25,25)
  EndIf
EndProcedure

bg():Ravitaillement():barre_fond():astronaute():SpriteQuality(#PB_Sprite_BilinearFiltering)

;-boucle
Repeat
  FlipBuffers()
  ClearScreen(RGB(0,0,0))
  ExamineKeyboard()
  
  DisplayTransparentSprite(#barre_fond,#largeur_ecran/2-488,#hauteur_ecran-44)
  ClipSprite(#Bg,0,0,oxygene,#barre)
  DisplayTransparentSprite(#Bg,#largeur_ecran/36,#hauteur_ecran-40)
  DisplayTransparentSprite(#ravitaillement,Ravitaillement_Posx,Ravitaillement_Posy)
  TransparentSpriteColor(#astronaute,RGB(0,0,0))
  DisplayTransparentSprite(#astronaute,Astronaute_Posx,Astronaute_Posy)
  ZoomSprite(#astronaute,60,60)
  ZoomSprite(#ravitaillement,25,25)
  
  If Astronaute_Posx>#largeur_ecran:Astronaute_Posx=-50:EndIf
  If vies = 1
    ;affichage nombre de vie astronaute
    DisplayTransparentSprite(#astronaute,Posx,posy)
  EndIf 
  If SpritePixelCollision(#ravitaillement,Ravitaillement_Posx,Ravitaillement_Posy,#astronaute,Astronaute_Posx,Astronaute_Posy):levelup=1:Else:levelup=0:EndIf
  If Astronaute_Posx>150 And Astronaute_Posx<350:player=1:Else:player=0:EndIf
  
  newfont():timer_oxygene():collision():time_deplacement()
  Delay(1)
  Repeat 
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow Or oxygene = 0

End
je prend note pour le conseil des data,et l'explication de mesa ainsi que sa correction sur le code.
merci pour vos commentaires :wink:
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Répondre