Page 1 sur 2
[ok]Petit probleme avec des Sprites
Publié : dim. 24/avr./2016 17:18
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 .
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 6:36
par Bernie
Personne peux m'aider svp
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 8:55
par microdevweb
Voici avec une déplacement plus doux.
J'ai noté MCW à côté du code que j'ai ajouté; modié
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)
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 9:14
par Bernie
Merci microdevweb mais il y a toujours le déclage ( voir l'image ) :

Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 11:24
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.
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 13:05
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 .
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 13:43
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)
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 13:50
par Bernie
merci djes
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 14:05
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
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
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 14:31
par Bernie
Merci falsam
Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 14:34
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

Re: Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 16:08
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

j'ai rajouter ceci dans le titre ma fenetre :
Code : Tout sélectionner
SetWindowTitle(#Main_Window,"INVADERS "+ " Touche CTRL Gauche pour le tir")
Re: [ok]Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 16:40
par falsam
Bernie tu es une fainéasse

Re: [ok]Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 16:42
par Bernie
falsam a écrit :Bernie tu es une fainéasse

non pourquoi pour moi c'est mieux
Re: [ok]Petit probleme avec des Sprites
Publié : lun. 25/avr./2016 16:45
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.