PB vs The World

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

PB vs The World

Message par Ar-S »

Voilà le code de mon petit shoot

datas toujours ici : http://pb.ldvmultimedia.com/PB_vs_THE_WORLD_by_Ar-S.zip

Code : Tout sélectionner

;*****************************************************************************
;*
;* Birthday Punch : PureBasic 15 years of happiness
;* PureBasic 5.31 x86
;* 192 lines of 80 chars of code or data as you want
;*
;* Name     : PB vs THE WORLD
;* Author   : Ar-S - Music made with Music Maker Jam
;* Date     : Nov/Oct 2015
;* Notes    : Dedicated To my mom Apr 1940 - Sept 2015
;*
MessageRequester("Info","Use Arrows to move, space to shoot and left ctrl to use shield"+Chr(10)+"Left Mouse Button to restart"+Chr(10)+Chr(10)+"Fleches pour se diriger, ctrl : bouclier, Espace:Feu, Bouton de gauche souris pour recommencer",#PB_MessageRequester_Ok) ; LIGNE NON PRIS EN COMPTE
     
UseOGGSoundDecoder()

Macro m:Macro:EndMacro
m dec:decoder():EndMacro
m e:examine:EndMacro
m s(n,l,h,x,y):EndMacro
m _s:Structure:EndMacro


InitSprite():InitKeyboard():InitMouse():UseOGGSound#dec:UsePNGImage#dec
InitSound()

_S BB
x.i
y.i
ID.b
End#_S

_S SP
x.i
y.i
n.i
LL.i
HH.i
v.b
r.f
End#_S

_S St
x.i
y.i
v.b
n.b
End#_S

_S SN
D.i
F.i
End#_S

M R:random:EndMacro

M P(S)
PlaySound(S,#PB_Sound_MultiChannel,70)
EndMacro

M PP(S)
PlaySound(S,#PB_Sound_Loop,80)
EndMacro

m _k(k)
KeyboardPushed(k)
EndMacro

M G(z):Global.Z:EndMacro

M CS(n,x,y,l,h)
ClipSprite(n,x,y,l,h)
sp(n)\LL=l/2
sp(n)\HH=h/2
ZoomSprite(n,l/2,h/2)
v(n)
EndMacro

m v(n)
sp(n)\v = R(6,2)
EndMacro

m SX(n)
sp(n)\x
EndMacro

m SY(n)
sp(n)\y
EndMacro

M Redo(n)
SX(n)=820
SY(n) = R(500,100)
v(n)
EndMacro

m EX(n)
St(n)\x
EndMacro

m EY(n)
St(n)\y
EndMacro

m EN(Z)
St(Z)\n
EndMacro

m EV(n)
St(n)\v
EndMacro

m _r(n,d)
SpriteQuality(1)
RotateSprite(n,d,#PB_Absolute)
EndMacro

Global NewList BB.BB()
Global F=LoadFont(16, "Arial", R(80,50))
Global F1=LoadFont(17, "Arial", 24)

Global.b feu,NF,ENNEMI,VIZ,ShotOn.b=#True
Global.i x,y,xi,T
Global SCORE,LIFE
Global Dim sp.SP(16)
Global Dim st.st(100)
Global TimeElapset=ElapsedMilliseconds()

LoadSound(20,"01.ogg") ; laser
LoadSound(21,"02.ogg") ; impact
LoadSound(22,"03.ogg") ; shield
LoadSound(23,"04.ogg") ; shield

SCORE = 0
LIFe = 3
x= 150
y = 350
NF = 9 ; numero du sprite PB en cours
xi = 2500

t1$ = "PURE BASIC VS THE WORLD !"
t2$ = "HAPPY PURE BIRTHDAY"



; Positionnement des étoiles dans tableau
For i   = 0 To 100
  EX(i) = R(820)
  EY(i) = R(600)
Next

For i = 0 To 20
  EN(i) = 13
  EV(i) = 3
Next


For i = 21 To 60
  EN(i) = 14
  EV(i) = 6
Next

For i = 61 To 100
  EN(i) = 15
  EV(i) = 10
Next



OpenScreen(800,600,32,"", #PB_Screen_SmartSynchronization)
LoadSprite(0,"im.png",8|4)

For i = 1 To 15
  CopySprite(0,i,8|4) 
Next


CS(1,7,142,232,133) ; ship D
CS(2,289,135,234,139) ; SHIELD


CS(3,0,1,129,128) ; Logo PYTHON
CS(4,129,1,128,128) ; Logo RUBY
CS(5,257,0,118,130) ; Logo C#
CS(6,379,0,101,131) ; Logo JAVA
CS(7,478,1,115,130) ; Logo JavaScript
CS(8,595,8,250,126) ; Logo VB
CS(9,533,213,53,62) ; PB LOGO
ClipSprite(10,675,138,140,136) ; PLanete
CS(11,606,231,25,43)           ; Big reac
CS(12,631,231,25,43)           ; Smal reac

CS(13,840,266,8,8) ; big etoile
CS(14,833,270,6,5) ; med etoile
CS(15,824,271,3,3) ; sm etoile

FreeSprite(0)

txt.s = t1$
xtx = r(500,100)
ColT = RGB(R(255),R(255),R(255))
sx(10) = 1500
sy(10) = r(460,140)



PS = 1

Repeat
  
  ; Chrono
  StartTime.i = ElapsedMilliseconds()
  
  ClearScreen(0)
  E#Mouse()
  E#Keyboard()
  
  ; TEMPORISATION DES TIRS --------------
  If ElapsedMilliseconds()-TimeElapset>=350
    ShotOn=#True
    TimeElapset=ElapsedMilliseconds()
  EndIf
  ; -------------------------------------
  
  
  If GO = 0
    If PS = 1
      PP(23)
      ps+1
    EndIf
    
    For i = 0 To 100
      DisplayTransparentSprite(Random(15,13), EX(i), EY(i),255)
      EX(i) - EV(i)
      
      If EX(i) < 0
        EX(i) = 805 : ey(i) = R(600)
      EndIf
    Next
    
    DisplayTransparentSprite(10, SX(10), SY(10),255)  ; Planete
    
    ; GESTION DU SCROLL TEXT
    StartDrawing(ScreenOutput())
    
    DrawingFont(f)
    DrawingMode(#PB_2DDrawing_Transparent )
    
    If xi < -2500
      NT+1
      
      If NT<2
        txt.s = t1$
      ElseIf NT = 2
        txt.s = t2$
      Else
        NT=0
      EndIf 
      
      xi = 2500
      xtx = r(500,100)
      ColT = RGB(R(255),R(255),R(255))
    EndIf
    
    DrawText(xi, xtx,txt.s ,ColT, $0)
    
    StopDrawing()
    ; ////
    
    
    Xi-6
    
    
    ; Position Vaisseau et Vaisseau shield
    sx(2) = sx(1)
    sy(2) = sy(1)
    
    ; Affichage des logos ennemis
    For S = 3 To 8 
      DisplayTransparentSprite(S, SX(S), SY(S),255)
    Next
    
    
    ;-----------------------------------------
    
    ; DIRECTION VAISSEAU avec diagonales
    
    ;-----------------------------------------
    
    If _K(#PB_Key_Up)
      y-5
      ViZ = 1
      
      If _K(#PB_Key_Left)
        x-5
        ViZ = 0
      ElseIf _K(#PB_Key_Right)
        X+5
        ViZ = 1
      EndIf
      
      
    ElseIf _K(#PB_Key_Down)
      y+5
      ViZ = 1
      If _K(#PB_Key_Left)
        x-5
        ViZ = 0
      ElseIf _K(#PB_Key_Right)
        X+5
        ViZ = 1
      EndIf
      
      
    ElseIf _K(#PB_Key_Left)
      x-5
      VIZ = 0
      
    ElseIf _K(#PB_Key_Right)
      SX(1)=x
      x+5
      ViZ = 1
    EndIf
    
    If y < 25
      y=25
    ElseIf y > 530
      y = 530
    EndIf
    If x < 0
      x = 0
    ElseIf x > 700
      x = 700
    EndIf
    
    ; Vaisseau
    SX(1)=x
    Sy(1)=y
    ; Reacteurs
    Sx(11)=x-10
    Sy(11)=y+23
    Sx(12)=Sx(11)
    Sy(12)=Sy(11)
    
    ;-----------------------------------------
    
    ;-----------------------------------------
    ; TIRS si ESPACE
    ;-----------------------------------------

    If _k(#PB_Key_Space) And ShotOn
      
      AddElement(BB())
      BB()\X=SX(1)+120
      BB()\Y=SY(1)+15
      BB()\ID = 9 ; logo PBbullet
      Debug "NbrBalle : " + ListSize(BB())
      ShotOn=#False
      
      ;feu = 2
      P(20)
    EndIf
    
    ;-----------------------------------------
    ; BOUCLIER si CTRL
    ;-----------------------------------------
    
    If _K(#PB_Key_LeftControl)
      shield = 1
      P(22)
    Else
      shield = 0
    EndIf
    
    If shield = 0
      ship = 1
    Else
      ship = 2
    EndIf 
    
    ;-----------------------------------------
    ; AFFICHAGE
    ;-----------------------------------------
    ; Sprite vaiseau + reacteurs
    DisplayTransparentSprite(ship, x, y, 255)
    RE = R(12,11)
    DisplayTransparentSprite(RE, sx(RE), Sy(RE),200)
    
    ; Tirs logos PB et Collisions
    ;     If feu = 2
    ForEach BB()
      BB()\X + 6
      DisplayTransparentSprite(BB()\ID, BB()\X, BB()\Y,255)
    Next     
    ; TESTS DES COLLISIONS AVEC LOGO PB
    For ENNEMI = 3 To 8
      ForEach BB()       
        If SpriteCollision(9, BB()\X, BB()\Y, ENNEMI, sx(ENNEMI), sy(ENNEMI) ) <> 0
          T = ENNEMI
          SCORE+1
          redo(ENNEMI)
          If ListSize(BB()) > 0
            DeleteElement (BB())
          EndIf 
          ;           feu = 0
          P(21)
        EndIf
      Next
    Next
    
    
    If ListSize(BB()) > 0 And BB()\X > 810
      DeleteElement (BB()) ;sx(9) = x+130
    EndIf
    
    
    
    
    ;     EndIf
    
    
    ; DEFILEMENT DES ENNEMIS
    For i = 3 To 8
      SX(i) - sp(i)\v
      SpriteQuality(1)
      RotateSprite(i, ROT.f,#PB_Absolute)
      ROT.f-0.5
      If SX(i)< -100
        redo(i)
      EndIf
    Next
    
    ; TESTS DES COLLISIONS AVEC ship 
    For COL = 3 To 8
      If SpriteCollision(1, sx(1), sy(1), COL, sx(col), sy(col) ) <> 0
        If shield = 1
          score-1
          If Score <= 0
            Score = 0
          EndIf
          
        ElseIf shield = 0
          life-1
          If Life <= 0
            GO = 1
          EndIf
        EndIf 
        P(21)
        redo(col)
        
      EndIf 
    Next
    
    
    
    
    
    
    
    ;Affichage  texte
    StartDrawing(ScreenOutput())
    DrawText(0, 0, "SCORE : " + Str(SCORE),$0000FF, $0)
    DrawText(150, 0, "LIFE : " + Str(LIFE),$0000FF, $0)
    DrawText(650, 0, "ESCAPE to EXIT",$ffffff, $0)
    
    StopDrawing()
    
    SX(10) -1
    If sx(10) < -160
      sx(10) = 1500
      sy(10) = r(460,140) 
    EndIf
    
    
    
  ElseIf GO = 1 ; Si GAME OVER
    
    StopSound(23)
    PS = 0
    ;Affichage Texte
    StartDrawing(ScreenOutput())
    DrawingFont(f)
    TG$ = "GAME OVER "
    DrawText( R(400,398) - TextWidth(TG$)/2 , R(280,278), tg$, $FFFFFF, $0)
    DrawingFont(f1)
    DrawText(R(250,248), R(510,508), "Press LMB to restart", $FFFFFF, $0)
    DrawText(R(290,288), R(120,118), "SCORE : "+Str(score), $FFFFFF, $0)
    StopDrawing()
    
    If MouseButton(#PB_MouseButton_Left)
      score = 0
      Life = 3
      x = 5 : sx(1) = x
      PS = 1
      GO=0
      
    EndIf
    
  EndIf
  
  FlipBuffers()
  
  deltatime = (ElapsedMilliseconds() - StartTime) / 1000
  
  
Until KeyboardPushed(#PB_Key_Escape)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PB vs The World

Message par Kwai chang caine »

C'est comme les edredons dans les sacs que tu aspires
Quand tu ouvres le bouchon, ça prend quand même plus de place
Merci du partage et surtout "Beravo" for the "ouineur" 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: PB vs The World

Message par Micheao »

Merci Ar-S
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: PB vs The World

Message par Cool Dji »

"Mon chinois n'aime pas le old-school..."

Traduction :
"Mon Lenovo refuse de compiler du 800x600"

j'ai ajouté un caractère de plus et ça marche (1024,768) :D

Enjoy
Only PureBasic makes it possible
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: PB vs The World

Message par Micheao »

Bonsoir Ar-S
Comment tu as crée le scrolling étoilé ? svp
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: PB vs The World

Message par Ar-S »

J'ai indiqué dans le code, au début, que les sprites étoiles sont les 13,14,15
Ensuite tu regardes dans la boucle principale et là tu vois :

Code : Tout sélectionner

For i = 0 To 100 
      DisplayTransparentSprite(Random(15,13), EX(i), EY(i),255) ;;; <<<< ici
      EX(i) - EV(i)
     
      If EX(i) < 0
        EX(i) = 805 : ey(i) = R(600)
      EndIf
    Next
en gros j'affiche 101 sprites au hasard entre 13,14,15 ( le Random(15,13) )
et on les positionne dans l'espace écran ( EX(i), EY(i) )
On les repositionne au début de l’écran si ils sortent.

Code : Tout sélectionner

 If EX(i) < 0
        EX(i) = 805 : ey(i) = R(600)
      EndIf
Faut chercher un peu plus mon gars quand tu coinces.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: PB vs The World

Message par Micheao »

Merci mais j'ai rien compris desoler
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: PB vs The World

Message par Ar-S »

Regarde les CS (macro pour clipspritre) au début
CS(13,840,266,8,8) ; big etoile
CS(14,833,270,6,5) ; med etoile
CS(15,824,271,3,3) ; sm etoile

Ensuite EX(n) c'est une macro pour la position des etoiles en X dans le tableau :
EX(n) = EtoileX(numero dans le tableau)
Pareil pour EY(n) qui indique la position en Y des etoiles.

Je ne peux pas t'aider plus.

essaye de comprendre les macros de mon code. C'est pas évident vu que pour un punch j'ai mis le minimum mais tout de même, c'est pas si sorcier. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: PB vs The World

Message par Micheao »

Merci de ton aide mais je sais pas que c'est une macro j'ai jamais utiliser
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: PB vs The World

Message par Ar-S »

Et bien regarde la doc !
Un macro ça te permet de simplifier une commande en la renommant.

Exemple, je créé une macro MS qui simplifie MessageRequester()

Code : Tout sélectionner

Macro MS(Titre,Message)
   MessageRequester(Titre,Message,#PB_MessageRequester_Ok|#MB_ICONEXCLAMATION)
EndMacro

; J'essaye ma macro MS
MS("coucou","Vite fait bien fait")
End
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: PB vs The World

Message par Bernie »

Bonsoir Ar/s j'ai essaye comprendre ton code depuis des jours , j'aimerai bien avoir le code avec des commentaires
ton code est très intéressant à étudier .
Répondre