[2D] Sprites Exercices. (Niveau débutant)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Bernie a écrit :est ce que c'est possible un nouveau cours comme faire bouger un ennemi en le faisant tirer sur le joueur par exemple?
Normalement tu aurais du savoir coder cette demande car ça revient à faire la même chose que le tireur mais en sens inverse.

L'ennemi se déplace de gauche à droite et vice-versa.
  - Il ne doit pas sortir des limites gauche et droite de la surface du jeu

Code : Tout sélectionner

If EnemyX < 0  Or  EnemyX > ScreenWidth() - SpriteWidth(Enemy) 
  EnemyDirection * -1 ;Direction sera égale alternativement à 1 ou -1
EndIf

EnemyX - 2 * EnemyDirection
L'ennemi tire aléatoirement.

Code : Tout sélectionner

    If Random(50, 1) = 1
      ;On ajoute ce tir dans la liste des tirs de l'ennemi EnemyShoots()
      AddElement(EnemyShoots())
      
      ;Création du nouveau sprite de tir à partir du sprite Shoot
      EnemyShoots()\Sprite = CopySprite(Shoot, #PB_Any) 
      
      ;Le nouveau tir est effectuté à partir du milieu bas de l'ennemi 
      EnemyShoots()\x = EnemyX + SpriteWidth(Enemy)/2 - SpriteWidth(EnemyShoots()\Sprite)/2
      EnemyShoots()\y = EnemyY + SpriteHeight(Enemy)
    EndIf
  EndIf 
Affichage des tirs de l'ennemi.
  - Chaque shoot de l'ennemi descend de deux pixels.
  - Si le shoot sort en bas de l'ecran, suppression du sprite représentant le tir.
  - Si Collision entre un tir et le vaisseau, suppression du sprite.
  - Si Collision entre un tir et le vaisseau, une vie de moins pour le vaisseau.

Code : Tout sélectionner

;-Affichage des shoots de l'ennemi
  ForEach EnemyShoots()
    EnemyShoots()\y + 2 ;Chaque shoot de l'ennemi descend de deux  pixels
    
    ;Ce tir sort t'il en bas de l'écran ?
    If EnemyShoots()\y > 600
      FreeSprite(EnemyShoots()\Sprite) ;Destruction du tir
      DeleteElement(EnemyShoots(), #True) ;Destruction des information du tir
      
    Else
      
      DisplaySprite(EnemyShoots()\Sprite, EnemyShoots()\x, EnemyShoots()\y)    
      If ShipLife > 0 And SpriteCollision(Ship, ShipX, ShipY, EnemyShoots()\Sprite, EnemyShoots()\x, EnemyShoots()\y)    
        FreeSprite(EnemyShoots()\Sprite) ;Destruction du tir
        DeleteElement(EnemyShoots(), #True) ;Destruction des information du tir
        
        ;Diminution du nombre de vie ou destruction du vaisseau (Player)
        ShipLife - 1
        If ShipLife = 1
          FreeSprite(Ship) ;C'est terminé pour lui
        EndIf
      EndIf
    EndIf    
  Next
Le code complet est dans l'archive : 06 - On nous attaque.pb

Modification de l'archive.
Mise à jour du code 03 - Exercice de tir.pb
Mise à jour du code 04 - Dessiner dans un sprite.pb
Mise à jour du code 05 - Rotation d'un sprite.pb
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

Merci falsam pour ton super cours

il y a pas de lien pour :06 - On nous attaque.pb
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Bernie a écrit :il y a pas de lien pour :06 - On nous attaque.pb
Dans le message précédent
falsam a écrit :Le code complet est dans l'archive : 06 - On nous attaque.pb
Bon c'est vrai que je n'ai pas écrit que le lien de l'archive est indiqué dans le premier message.

:arrow: https://github.com/pbcodex/2D-Tutoriels ... master.zip

Tu peux en profiter pour relire les codes précédents. Ils sont plus simples à comprendre.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

Merci Falsam
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

@Bernie : Suite à ta question sur Freechat concernant un tir double. Reprends le tuto 06 - On nous attaque.pb

On considére que le tir par à - 30 pixels sur la gauche et +30 pixels sur la droite.

Cherche le bloc d'instruction

Code : Tout sélectionner

If KeyboardPushed(#PB_Key_Space) And ShootAuthorization = #True      
   ....
   ....             
EndIf  
et remplace là par

Code : Tout sélectionner

 If KeyboardPushed(#PB_Key_Space) And ShootAuthorization = #True      
      ;Chaque tir part du milieu du vaisseau
           
      ;On ajoute le tir de gauche dans la liste des tirs du joueur PlayerShoots() 
      AddElement(PlayerShoots())
      
      PlayerShoots()\Sprite = CopySprite(Shoot, #PB_Any) 

      PlayerShoots()\x = ShipX + (SpriteWidth(Ship)/2 - SpriteWidth(PlayerShoots()\Sprite)/2) - 30 ;Decalage à gauche de -30
      PlayerShoots()\y = 500
      
      ;On ajoute le tir de droite dans la liste des tirs du joueur PlayerShoots() 
      AddElement(PlayerShoots())
      PlayerShoots()\Sprite = CopySprite(Shoot, #PB_Any) 

      PlayerShoots()\x = ShipX + (SpriteWidth(Ship)/2 - SpriteWidth(PlayerShoots()\Sprite)/2) + 30 ;Decalage à droite de +30
      PlayerShoots()\y = 500
      
      ShootTime = ElapsedMilliseconds()
    EndIf  
le reste ne change pas.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

Merci pour ton cours
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Hello les codeurs :)

Un septième exercice dans lequel vous allez créer une vague d'ennemis que vous devez détruire avant que ceux çi vous détruisent.

Image

:arrow: https://github.com/pbcodex/2D-Tutoriels
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

Bonjour falsam

dis moi comment faire pour quand on a tué tous les ennemis ensuite on affiche un message du genre You WIN

ensuite si un ennemi touche le vaisseau le vaisseau perd une vie et les ennemis remonte au point de départ en et resdescendent de nouveau
et ensuite si le vaisseau a plus de vies afficher le texte Game Over
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Bernie a écrit :dis moi comment faire pour quand on a tué tous les ennemis ensuite on affiche un message du genre You WIN
Tu sais tester si il reste des ennemis ? (Compteurs, ArraySize(), ListSize(), ....)

Quand tu es à 0, alors tu affiche un sprite dans lequel tu a écris "You WIN".
Bernie a écrit :ensuite si un ennemi touche le vaisseau le vaisseau perd une vie et les ennemis remonte au point de départ en et resdescendent de nouveau
Je n'ai pas su si c'était une question ou pas.

Si je me souviens bien, tes ennemis sont référencés dans un tableau qui contient les coordonnées x et y de chaque sprite ennemi.

Quand un ennemi touche le vaisseau, tu loops ton tableau et tu modifies le parametre y en retranchant pour chacun - 300 par exemple.
Bernie a écrit :et ensuite si le vaisseau a plus de vies afficher le texte Game Over
Meme réponse que pour "You WIN"

See you soon Bernie.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Ar-S »

Bernie en gros dans ta boucle principale d'affichage des sprite tu affiche un etat.
Selon cet état, tu affiches telle ou telle partie.

En début de code tu crées un "drapeau" "Etat"

Code : Tout sélectionner

Global ETAT.b
Tu fais 3 constantes.

#ENJEU = 1
#PERDU = 2
#GAGNE = 3


Donc dans ta boucle

Apres on clearscreen et avant ton flipbuffer, tu ajoutes

Code : Tout sélectionner

If ETAT = #GAGNE 
 ; tu affiches ton sprite YOU WIN
 ; si clique :  ETAT = #ENJEU
elseif ETAT = #PERDU
 ; tu affiches ton sprite GAME OVER
 ; si clique :  ETAT = #ENJEU
 else
; Tu affiches ton jeu avec tes sprites vaisseau etc...
; Si nombrevie = 0 alors ETAT = #PERDU
; Si nombreEnnemi = 0 alors ETAT = #GAGNE
Endif
~~~~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: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

merci ar/s

mais comment savoir combien d'ennemis on a à l'écran?
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Ar-S »

Bien comme t'as dit falsam,
"Si je me souviens bien, tes ennemis sont référencés dans un tableau "
Je n'ai pas regardé le code du space invader donc je ne peux pas être plus précis.
~~~~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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Bernie a écrit :mais comment savoir combien d'ennemis on a à l'écran?
Regarde attentivement ce code plus simple que le tien afin de mieux appréhender la collision de sprites.

■ Objectif
- Afficher un joueur matérialisé par un carré rouge et se déplaçant avec les flèches du clavier.
- Afficher 10 ennemis matérialisés par des carrés blancs et ne se déplaçant pas.
- Revoir les collisions entres deux sprites.
- Afficher le score.
Bernie a écrit :dis moi comment faire pour quand on a tué tous les ennemis ensuite on affiche un message du genre You WIN
- Afficher "You Win" en fin de jeu.

Code : Tout sélectionner

; Définition d'un sprite
; Cette structure NewSprite servira pour le joueur, les ennemies, le score et You Win
Structure NewSprite
  IDSPrite.i    ;Identification du sprite
  x.i           ;Position x
  y.i           ;Position y
  v.i           ;Valeur : Score ou vie ou etc ...
  actif.i       ;Le sprite est actif ou pas (#True ou #False)
EndStructure

; Définition du Joueur
Global Player.NewSprite

; Definition du model d'ennemie qui servira aux autres ennemis
Global Enemy.NewSprite

; Définition des 10 ennemies dans un tableau (Le premier élément démarre à 0)
Global Dim Enemies.NewSprite(9), Index.i

; Definition du score
Global Score.NewSprite

; Definition You WIn
Global YouWin.NewSprite

; Fonts pour le score et YouWin
FontScore = LoadFont(#PB_Any, "", 12)
FontYouWin= LoadFont(#PB_Any, "", 30)

; Initialisation 2D
If InitSprite()
  InitKeyboard()
  InitMouse()
Else
  End
EndIf

;- Creation du screen
OpenWindow(0, 0, 0, 800, 600, "Galaxy", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

;- Création des sprites

; Creation du sprite joueur matérialisé par un carré rouge
Player\IDSPrite = CreateSprite(#PB_Any, 32, 32)
Player\x        = 100
Player\y        = 100
Player\actif    = #True
StartDrawing(SpriteOutput(Player\IDSPrite))
Box(0, 0, 32, 32, RGB(255, 0, 0))
StopDrawing()

; Creation du model d'ennemi matérialisé par un carré blanc
; Ce model va servir de copie pour le tableau de 10 ennemis
Enemy\IDSPrite = CreateSprite(#PB_Any, 32, 32)
StartDrawing(SpriteOutput(Enemy\IDSPrite))
Box(0, 0, 32, 32, RGB(255, 255, 255))
StopDrawing()

; Creation des 10 ennemis : On va copier le model d'ennemi 10 fois
For Index = 0 To 9
  Enemies(Index)\IDSPrite = CopySprite(Enemy\IDSPrite, #PB_Any)
  Enemies(Index)\x = Random(700, 100) ;Position x aléatoire
  Enemies(Index)\y = Random(500, 100) ;Position y aléatoire
  Enemies(Index)\actif = #True        ;L'ennemi est actif
Next

; Creation du score
Score\IDSPrite  = CreateSprite(#PB_Any, 128, 32)
Score\x         = 700
Score\y         = 10
StartDrawing(SpriteOutput(Score\IDSPrite))
Box(0, 0, 128, 32, RGB(135, 206, 235))
StopDrawing()

; Création you win
YouWin\IDSPrite = CreateSprite(#PB_Any, 256, 256)
YouWin\x        = 300
YouWin\y        = 300
StartDrawing(SpriteOutput(YouWin\IDSPrite))
Box(0, 0, 256, 256, RGB(135, 206, 235))
DrawingFont(FontID(FontYouWin))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(0, 0, "You Win :)", RGB(255, 255, 255))
StopDrawing()

;-
;- Boucle evenementielle
Repeat  ;Evenement jeu
  Repeat;Evenement fenetre
    Event = WindowEvent()
    
    Select Event    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Event=0
  
  ClearScreen(RGB(135, 206, 235))
  
  ;- Affichage des sprites
  
  ; Joueur si actif sinon alors on affiche "You Win"
  If Player\actif = #True
    DisplaySprite(Player\IDSPrite, Player\x, Player\y)
  Else
    DisplaySprite(YouWin\IDSPrite, YouWin\x, YouWin\y)  
  EndIf
  
  ; Ennemis si actif
  For Index = 0 To ArraySize(Enemies())
    If Enemies(Index)\actif
      DisplaySprite(Enemies(Index)\IDSPrite, Enemies(Index)\x, Enemies(Index)\y)
    EndIf
  Next
  
  ; Score (Une bonne ocasion de revoir comment dessiner dans un sprite)
  StartDrawing(SpriteOutput(Score\IDSPrite))
  Box(0, 0, 128, 32, RGB(135, 206, 235))
  DrawingFont(FontID(FontScore))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(0, 0, "Score : " + Str(Score\v), RGB(255, 0, 0))
  StopDrawing()
  DisplaySprite(Score\IDSPrite, Score\x, Score\y) 
  
  ;- Evenements clavier
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Up) And Player\y > 0 ;Player se déplace vers le haut
    Player\y - 5
  EndIf
  
  If KeyboardPushed(#PB_Key_Down) And Player\y < ScreenHeight() - 32 ;Player se déplace vers le bas
    Player\y + 5
  EndIf
  
  If KeyboardPushed(#PB_Key_Left) And Player\x > 0  ;Player se déplace vers la gauche
    Player\x - 5
  EndIf
  
  If KeyboardPushed(#PB_Key_Right) And Player\x < ScreenWidth() - 32  ;Player se déplace vers la droite
    Player\x + 5
  EndIf
  
  ;- COLLISIONS DE SPRITES 
  ;  On va parcourir le tableau des ennemis 
  ;  L'ennemi devra encore etre actif pour tester la collision avec le joueur
  ;  Chaque fois que le joueur entre en collision avec un ennemi : 
  ;  - l'ennemi sera détruit en le rendant inactif
  ;  - Le score augmente de 1
  For index = 0 To ArraySize(Enemies()) ;Parcours des ennemis 
    If Enemies(Index)\actif = #True     ;L'ennemi doit etre actif
      If SpriteCollision(Player\IDSPrite, Player\x, Player\y, Enemies(Index)\IDSPrite, Enemies(Index)\x, Enemies(Index)\y)
        Enemies(Index)\actif = #False ;Il y a collision : Le sprite de l'ennemi n'est plus actif
        Score\v + 1                   ;Le score augmente de 1
      EndIf
    EndIf 
  Next
  
  ; Si le score atteint 10 alors fin du jeu et désactivation du joueur
  If Score\v = 10
    Player\actif = #False ;Désactivation du joueur
  EndIf
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par Bernie »

merci falsam si 'j'ai bien compris à la place de la liste tu crée un tableau ?

Pour la gestion j'utilise la procédure de Taz
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [2D] Sprites Exercices. (Niveau débutant)

Message par falsam »

Bernie a écrit :si 'j'ai bien compris à la place de la liste tu crée un tableau ?
Oui mais le principe est le même pour une liste.

Au lieu de désactiver l'ennemi qui est entrée en collision, tu peux supprimer l'élément de la liste correspondant à l'ennemi.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre