[ok]Petit probleme avec des Sprites

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

[ok]Petit probleme avec des Sprites

Message par Bernie »

Bonjour
j'ai un petit probleme avec ce code :

Les soucoupes descendent bien aligné et soudain la ligne du milieu se décale légèrement
j'aimerai savoir pourquoi ? est ce que c'est gênant ou pas ?

https://www.dropbox.com/s/52w2g7108lpgkwx/Game.zip?dl=0


Merci de votre aide .
Dernière modification par Bernie le lun. 25/avr./2016 14:31, modifié 1 fois.
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Petit probleme avec des Sprites

Message par Bernie »

Personne peux m'aider svp
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petit probleme avec des Sprites

Message par microdevweb »

Voici avec une déplacement plus doux.

J'ai noté MCW à côté du code que j'ai ajouté; modié :wink:

NB: Il n'est pas nécessaire de faire de copie de sprite, tu peux affiché le sprite plusieurs fois et à divers positions

Code : Tout sélectionner

;-- Initilisation 
EnableExplicit 
UsePNGImageDecoder() 

If InitSprite()=0 Or InitKeyboard()=0 
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Window
  #Main_Form 
EndEnumeration

Enumeration Games
  #Invader
  
EndEnumeration


;--- Structure d'infos 
Structure NewSprite
  Sprite.i
  Posx.i
  Posy.i
  Life.i
  Total.i
EndStructure 



;---Stockage des ennemis dans une liste chainées + variables globales
Global NewList Invaders.NewSprite(),gDirection.i=1,gRow,gCol

Global Folder.s="Assets/"
Global gEvent,gWidth=800,gHeight=600,gI

;---Création de la surface du jeu
OpenWindow(#Main_Form,0,0,gWidth,gHeight,"Game test ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gWidth,gHeight)

;--- Chargement des Assets du jeu :
;---Chargement des Images

LoadSprite(#Invader,Folder + "Ufo.png",#PB_Sprite_AlphaBlending)

;---Création des ennemis sur 3 rangées et 5 colonnes soit au total 15 invaders
For gRow = 1 To 3
  For gCol =1 To 5   
    AddElement(Invaders())
    With Invaders()
;       \Sprite = CopySprite(#Invader,#PB_Any) MCW pas besoin de faire de copie de sprite
      \Posx = gCol*120
      \Posy = gRow*60
      \Life =2
      \Total = 15
    EndWith
  Next   
Next


 Global DpY.f=800/(SpriteWidth(#Invader)*5) ; MCW

;---Boucle principale du jeu 
Repeat
  ;--- Partie pour la fenetre window   
  Repeat 
    gEvent = WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  ;---Partie pour la 2D
  ClearScreen(RGB(0,0,0))
 
  

  
  ;---Affichage des ennemis
  ForEach Invaders()
    If gDirection <>0
      Invaders()\Posx+1*gDirection
      If Invaders()\Posx =0 Or Invaders()\Posx>ScreenWidth()-SpriteWidth(Invaders()\Sprite)
        gDirection *-1
        PushListPosition(Invaders())
        ForEach Invaders()
;             Invaders()\Posy+20 ;MCW
            Invaders()\Posy+DpY ;MCW
        Next
        PopListPosition(Invaders())
      EndIf
    EndIf
    ;     DisplayTransparentSprite(Invaders()\Sprite,Invaders()\Posx,Invaders()\Posy) ;MCW
    DisplayTransparentSprite(#Invader,Invaders()\Posx,Invaders()\Posy) ;MCW 
  Next
  
  ;--- Evenements  du clavier
  ExamineKeyboard()
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Petit probleme avec des Sprites

Message par Bernie »

Merci microdevweb mais il y a toujours le déclage ( voir l'image ) :


Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petit probleme avec des Sprites

Message par djes »

Ce qui se passe est que tu calcules pour chaque sprite un changement de direction. Donc, cela se produit plusieurs fois, même si cela ne se voit pas. Comme ce changement est global, ce serait mieux de le calculer à part, en dehors de la boucle, cela sera plus rapide et tu n'auras pas de bug. Tu peux tester ce qui se passe avec le debugger avec une seule colonne, en pas à pas.
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Petit probleme avec des Sprites

Message par Bernie »

djes a écrit :Ce qui se passe est que tu calcules pour chaque sprite un changement de direction. Donc, cela se produit plusieurs fois, même si cela ne se voit pas. Comme ce changement est global, ce serait mieux de le calculer à part, en dehors de la boucle, cela sera plus rapide et tu n'auras pas de bug. Tu peux tester ce qui se passe avec le debugger avec une seule colonne, en pas à pas.
merci j'avoue que je sais pas faire ça .
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Petit probleme avec des Sprites

Message par djes »

Tiens, voilà un code "tuto"

Code : Tout sélectionner

;-- Initialisation 
EnableExplicit 
EnableDebugger
UsePNGImageDecoder() 

If InitSprite()=0 Or InitKeyboard()=0 
  MessageRequester("Erreur", "Impossible d'initialiser le programme ")
  End
EndIf

;---Constantes
Enumeration Window
  #Main_Form 
EndEnumeration

Enumeration Games
  #Invader
  
EndEnumeration


;--- Structure d'infos 
Structure NewSprite
  Sprite.i
  Posx.i
  Posy.i
  Life.i
  Total.i
EndStructure 



;---Stockage des ennemis dans une liste chainées + variables globales
Global NewList Invaders.NewSprite(),gDirection.i=1,gRow,gCol

Global Folder.s="Assets/"
Global gEvent,gWidth=800,gHeight=600,gI

;---Création de la surface du jeu
OpenWindow(#Main_Form,0,0,gWidth,gHeight,"Game test ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,gWidth,gHeight)

;--- Chargement des Assets du jeu :
;---Chargement des Images

LoadSprite(#Invader,Folder + "Ufo.png",#PB_Sprite_AlphaBlending)

;---Création des ennemis sur 3 rangées et 5 colonnes soit au total 15 invaders
For gRow = 1 To 3
  
  ;-!!!!!!!!!!!!!! CHANGEMENT djes
  For gCol = 1 To 1   
    AddElement(Invaders())
    With Invaders()
;       \Sprite = CopySprite(#Invader,#PB_Any) MCW pas besoin de faire de copie de sprite
      \Posx = gCol*120
      \Posy = gRow*60
      \Life =2
      \Total = 15
    EndWith
  Next   
Next


Global DpY.f=800/(SpriteWidth(#Invader)*5) ; MCW

;---Boucle principale du jeu 
Repeat
  ;--- Partie pour la fenetre window   
  Repeat 
    gEvent = WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until gEvent=0
  ;---Partie pour la 2D
  ClearScreen(RGB(0,0,0))
  
  ClearDebugOutput()
  ;---Affichage des ennemis
  ForEach Invaders()
    Debug "Travail (première boucle) sur le sprite N°" + ListIndex(Invaders())
    Debug " Ancien X : " + Invaders()\Posx
    If gDirection <>0
      Invaders()\Posx+1*gDirection
      Debug " Nouveau X : " + Invaders()\Posx
      If Invaders()\Posx =0 Or Invaders()\Posx>ScreenWidth()-SpriteWidth(Invaders()\Sprite)
        Debug " On a touché un bord"
        Debug " Maintenant, pas à pas en appuyant plusieurs fois sur F8"
        CallDebugger
        gDirection *-1
        Debug " On change de sens..."
        PushListPosition(Invaders())
        ForEach Invaders()
          Debug " Sprite" + ListIndex(Invaders())
          Debug " X actuel : " + Invaders()\Posx
    ;             Invaders()\Posy+20 ;MCW
            Invaders()\Posy+DpY ;MCW
        Next
        PopListPosition(Invaders())
      EndIf
    EndIf
    ;     DisplayTransparentSprite(Invaders()\Sprite,Invaders()\Posx,Invaders()\Posy) ;MCW
    DisplayTransparentSprite(#Invader,Invaders()\Posx,Invaders()\Posy) ;MCW 
  Next
  Debug "On reprend en appuyant sur F7"  

  ;--- Evenements  du clavier
  ExamineKeyboard()
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Petit probleme avec des Sprites

Message par Bernie »

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

Re: Petit probleme avec des Sprites

Message par falsam »

Djes a donné un code intéressant mettant en oeuvre la façon de déboguer une application.
Les soucoupes descendent bien aligné et soudain la ligne du milieu se décale légèrement
j'aimerai savoir pourquoi ? est ce que c'est gênant ou pas ?
est ce que c'est gênant ou pas ? à toi de le dire :mrgreen:

Tu as suivi ce que j'avais fait dans un de mes tutos et visiblement j'ai fait une erreur dans les déplacements de mes sprites. Par chance dans mon tuto visuellement ça ne se voit pas.

Dans ton code, tu déplaces tes ennemis de gauche à droite et tu inverses le mouvement quand un ennemi a dépassé le bord gauche ou droit.

Avant d'inverser le sens du mouvement de l'ensemble des sprites, il faut que l'ennemi qui a franchi le bord gauche ou droite revient à la place qu'il occupé précédemment.

Voici la portion de code corrigé qui permet de déplacer les ennemis de gauche à droite et inversement.

Code : Tout sélectionner

;---Affichage des ennemis
  ForEach Invaders()
    ;Déplacement d'un ennemi de 1 pixel à gauche ou à droite
    ;Tout va dépendre de la direction horizontale qui est égale à -1 (A gauche) ou  1 (A droite)
    ;Si Direction = 0, alors fin du jeu.
    If gDirection <> 0  
      Invaders()\Pos_X + 1 * gDirection ;(1)
      
      ;Si un ennemi atteint le bord droit ou gauche de la surface de jeu
      ;La direction change et tous les ennemis descendent de 20 pixels.      
      If Invaders()\Pos_X = 0 Or Invaders()\Pos_X > ScreenWidth() - SpriteWidth(Invaders()\Sprite)
        ;On Change de direction
        gDirection *-1      
        
        ;Souviens toi que ligne 145 (1) ton invader a déja fait un déplacement à droite ou à gauche 
        ;L'invader qui est allé trop à gauche ou à droite  revient à sa position initial 
        Invaders()\Pos_X + 1 * gDirection
        
        ;STOP!! Gardons en mémoire la position de l’élément (l'invader) courant afin de revenir dessus.
        ;L'instruction PushListPosition() permet de mémoriser la position de l'élément de la liste des ennemis. 
        PushListPosition(Invaders())
        ;On parcourt une nouvelle fois la liste chaînée des ennemis.
        ;Chaque ennemi descend de 20 pixels
        ForEach Invaders()
          Invaders()\Pos_Y + 20
        Next
        ;Retour à la position mémoriser afin de continuer le traitement de chaque sprite. 
        ;L'instruction PopListPosition() permet pointer sur élément mémorisé de la liste des ennemis.
        PopListPosition(Invaders())
      EndIf
    EndIf
    
    DisplayTransparentSprite(Invaders()\Sprite,Invaders()\Pos_X,Invaders()\Pos_Y)
  Next  
Configuration : Windows 11 Famille 64-bit - PB 6.20 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: Petit probleme avec des Sprites

Message par Bernie »

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

Re: Petit probleme avec des Sprites

Message par falsam »

Bernie a écrit :Merci falsam
De rien.
Affiche en bas de ton jeu une ligne d'aide pour indiquer qu'il faut tirer avec la touche Ctrl Gauche. C'est le même principe que l'affichage des scores.

je corrigerais mes tutos :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 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: Petit probleme avec des Sprites

Message par Bernie »

falsam a écrit :
Bernie a écrit :Merci falsam
De rien.
Affiche en bas de ton jeu une ligne d'aide pour indiquer qu'il faut tirer avec la touche Ctrl Gauche. C'est le même principe que l'affichage des scores.

je corrigerais mes tutos :wink:


j'ai rajouter ceci dans le titre ma fenetre :

Code : Tout sélectionner

SetWindowTitle(#Main_Window,"INVADERS   "+ "  Touche CTRL Gauche pour le tir")
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [ok]Petit probleme avec des Sprites

Message par falsam »

Bernie tu es une fainéasse :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 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: [ok]Petit probleme avec des Sprites

Message par Bernie »

falsam a écrit :Bernie tu es une fainéasse :wink:
non pourquoi pour moi c'est mieux
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [ok]Petit probleme avec des Sprites

Message par falsam »

Bernie a écrit :non pourquoi pour moi c'est mieux
C'est ton jeu et tu fais comme tu veux. Pour toi c'était juste une histoire de t’entraîner à dessiner ou écrire dans un sprite.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre