comment faire tirer mon vaisseau
comment faire tirer mon vaisseau
...
Dernière modification par Micheao le mer. 04/nov./2015 14:59, modifié 2 fois.
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: comment faire tirer mon vaisseau
Je vais te faire un exemple...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: comment faire tirer mon vaisseau
Voila un exemple avec ton code comme base, si tu ne comprend pas n’hésite pas à demandé mais stp sois précis pour que la réponse le soit aussi
(j'ai ajouté MCW la j'ai modifié ou créé du code)

Code : Tout sélectionner
;---- Teste de Sprite-----
EnableExplicit
; Une structure pour la position des bales MCW
Structure bulet
X.i
Y.i
EndStructure
; Une liste chainée qui va contenir toutes les bales MCW
Global NewList myBulet.bulet()
; petite variable pour un chrono pour placer un espace en tre chaque tir MCW
Global TimeElapset.i=ElapsedMilliseconds()
; Flag qui autorise ou non le tir MCW
Global ShotOn.b=#True
;--- on initialise les sprites,le clavier et la souris
InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
;---Contantes
Enumeration
#Main_Form
#Ship
#Missile
EndEnumeration
;---Déclaration des variables
Global Event,Ship,ShipX=400,ShipY=420
;---Création et affichage des 2 fenetres
OpenWindow(#Main_Form,0,0,800,600,"Sprite test ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Form),0,0,800,600)
LoadSprite(#Ship,"Vaisseau.png",#PB_Sprite_AlphaBlending)
TransparentSpriteColor(#Ship,RGB(255,255,255)) ; MCW pour que ton vaisseau apparaisse transparent
CreateSprite(#Missile,30,30)
StartDrawing(SpriteOutput(#Missile))
Circle(6,6,6,RGB(255,255,255))
StopDrawing()
;---Boucle pour la fenetre écran qui sera de couleur noire , on utilisera la touche Esc pour fermer les fenetres
Repeat
;---Boucle pour la premiere fenetre qui contient la petite croix pour fermer les fenetres
Repeat
Event=WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event=0
; Gestion du chrono pour permettre le tir MCW
; Augmente la valeur à ton gout
If ElapsedMilliseconds()-TimeElapset>=150
ShotOn=#True
TimeElapset=ElapsedMilliseconds()
EndIf
;Affichage du vaisseau
DisplayTransparentSprite(#Ship,ShipX,ShipY)
ExamineKeyboard()
;---Touche pour faire bouger de gauche à droite le vaisseau
If KeyboardPushed(#PB_Key_Left)
ShipX-5
EndIf
If KeyboardPushed(#PB_Key_Right)
ShipX+5
EndIf
;---Si on appuie sur Space bar on fait tirer le vaisseau
If KeyboardPushed(#PB_Key_Space) And ShotOn ; MCW
AddElement(myBulet())
myBulet()\X=ShipX+SpriteWidth(#Ship)/2
myBulet()\Y=ShipY-30
; On ne peut plus tirré avant le temps écoulé
ShotOn=#False
EndIf
; Affiche toutes les bales MCW
ForEach myBulet()
With myBulet()
; On fait remonté le prite
\Y-5
DisplaySprite(#Missile,\X,\Y)
; Si la bale sort du jeux on la supprime
If \Y<-10
DeleteElement(myBulet())
EndIf
EndWith
Next
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
Until KeyboardPushed(#PB_Key_Escape)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: comment faire tirer mon vaisseau
Merc imicrodevweb pour tes explications
Pourquoi avoir crée une Structure pour le tire?
Pourquoi avoir crée une Structure pour le tire?
Re: comment faire tirer mon vaisseau
@Micheao
Parce que tu as 1 balle que tu affiches pleins de fois, il faut donc gérer les coordonnées de chaque tirs pour afficher ta balles à différents endroits.
-------------------------
@microdevweb ou a qui pourrait me décoincer.
je me greffe à ce topic. De mon coté je suis en train d'ajouter des tirs multiples à mon petits punch. J'ai repris la liste chainée mais je ne pige pas pourquoi il me dit qu'il ni a pas d'éléments alors que j'en ajoute bien un à chaque shoot.
ma liste est BB() ma structure aussi
Voilà la partie du code qui chie.
Si ça te suffit pas je te ferai un zip.
Parce que tu as 1 balle que tu affiches pleins de fois, il faut donc gérer les coordonnées de chaque tirs pour afficher ta balles à différents endroits.
-------------------------
@microdevweb ou a qui pourrait me décoincer.
je me greffe à ce topic. De mon coté je suis en train d'ajouter des tirs multiples à mon petits punch. J'ai repris la liste chainée mais je ne pige pas pourquoi il me dit qu'il ni a pas d'éléments alors que j'en ajoute bien un à chaque shoot.
ma liste est BB() ma structure aussi
Voilà la partie du code qui chie.
Si ça te suffit pas je te ferai un zip.
Code : Tout sélectionner
If KeyboardPushed(#PB_Key_Space)
Feu = 1
EndIf
If KeyboardReleased(#PB_Key_Space) And feu = 1
AddElement(BB())
BB()\X=X+120
BB()\Y=Y+15
feu = 2
EndIf
; AFFICHAGE
;-----------------------------------------
; Sprite vaiseau + reacteurs
DisplayTransparentSprite(ship, x, y, 255)
RE = R(12,11)
DisplayTransparentSprite(RE, sx(RE), Sy(RE),200)
; ICI y'a une couille
; Tirs logos PB et Collisions
If feu = 2
ForEach BB()
BB()\X + 6
DisplayTransparentSprite(9, BB()\X, BB()\Y,255)
If BB()\X > 810
DeleteElement (BB())
EndIf
; TESTS DES COLLISIONS AVEC LOGO PB
For ENNEMI = 3 To 8
If SpriteCollision(9, BB()\X, BB()\Y, ENNEMI, sx(ENNEMI), sy(ENNEMI) ) <> 0
redo(ENNEMI) ; Une macro qui replace les ennemis en dehors de l'ecran de façon aléatoire en Y
DeleteElement (bb())
feu = 0
EndIf
Next
Next
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: comment faire tirer mon vaisseau
dans le dossier d'install de pb voir le jeu Examples\Sources - Advanced\Waponez II
très instructif, mais pas commenté du tout...
Pat
très instructif, mais pas commenté du tout...
Pat
Re: comment faire tirer mon vaisseau
Merci Impossbile de lancer le code il me marque Impossible d'ouvrir un screen 640 x 480Patrick88 a écrit :dans le dossier d'install de pb voir le jeu Examples\Sources - Advanced\Waponez II
très instructif, mais pas commenté du tout...
Pat
Re: comment faire tirer mon vaisseau
Si le problème c'est déjà d'ouvrir l'écran...
tiens en mode "windowed"
remplace :
tiens en mode "windowed"
remplace :
Code : Tout sélectionner
; SetRefreshRate(60)
OpenWindow(0,0,0,640,480,"Waponez II")
If OpenWindowedScreen(WindowID(0),0,0,640,480)
; If OpenScreen(640, 480, 16, "Waponez II")
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: comment faire tirer mon vaisseau
Bonjour ARS,
N'ayant pas tous le code j'ai difficile à testé, mais il est possible que du fait que tu ne met pas de temporisation sur l'appui de la touche espace Feux revienne à 1. Essaie de débugé ta variable Feu
N'ayant pas tous le code j'ai difficile à testé, mais il est possible que du fait que tu ne met pas de temporisation sur l'appui de la touche espace Feux revienne à 1. Essaie de débugé ta variable Feu
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: comment faire tirer mon vaisseau
@Michaeo,
Ar-s à répondu à ta question, on aurais peu également utilisé un tableau mais personnellement je préfère les structure combinée avec une liste chainée ou une map. Retiens ceci, un sprite peut être affiché plusieurs fois à des coordonnées totalement différentes, temps que le graphisme reste le même. Raison pour la quel on gère les coordonnées en mémoire(strucutre, liste, tableau). Il suffis par après de parcourir la liste ou le tableau et d'afficher les sprinte au endroits mémorisé.
Ar-s à répondu à ta question, on aurais peu également utilisé un tableau mais personnellement je préfère les structure combinée avec une liste chainée ou une map. Retiens ceci, un sprite peut être affiché plusieurs fois à des coordonnées totalement différentes, temps que le graphisme reste le même. Raison pour la quel on gère les coordonnées en mémoire(strucutre, liste, tableau). Il suffis par après de parcourir la liste ou le tableau et d'afficher les sprinte au endroits mémorisé.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: comment faire tirer mon vaisseau
merci G-Rom ça marche
Merci microdevweb pour tes explications
Merci microdevweb pour tes explications
Re: comment faire tirer mon vaisseau
@microdevweb
Je t'ai fait un petit MP
Je t'ai fait un petit MP
~~~~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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: comment faire tirer mon vaisseau
Ar-S,Ar-S a écrit : @microdevweb ou a qui pourrait me décoincer.
je me greffe à ce topic. De mon coté je suis en train d'ajouter des tirs multiples à mon petits punch. J'ai repris la liste chainée mais je ne pige pas pourquoi il me dit qu'il ni a pas d'éléments alors que j'en ajoute bien un à chaque shoot.
ma liste est BB() ma structure aussi
Voilà la partie du code qui chie.
Si ça te suffit pas je te ferai un zip.
Code : Tout sélectionner
If KeyboardPushed(#PB_Key_Space) Feu = 1 EndIf If KeyboardReleased(#PB_Key_Space) And feu = 1 AddElement(BB()) BB()\X=X+120 BB()\Y=Y+15 feu = 2 EndIf ; AFFICHAGE ;----------------------------------------- ; Sprite vaiseau + reacteurs DisplayTransparentSprite(ship, x, y, 255) RE = R(12,11) DisplayTransparentSprite(RE, sx(RE), Sy(RE),200) ; ICI y'a une couille ; Tirs logos PB et Collisions If feu = 2 ForEach BB() BB()\X + 6 DisplayTransparentSprite(9, BB()\X, BB()\Y,255) If BB()\X > 810 DeleteElement (BB()) EndIf ; TESTS DES COLLISIONS AVEC LOGO PB For ENNEMI = 3 To 8 If SpriteCollision(9, BB()\X, BB()\Y, ENNEMI, sx(ENNEMI), sy(ENNEMI) ) <> 0 redo(ENNEMI) ; Une macro qui replace les ennemis en dehors de l'ecran de façon aléatoire en Y DeleteElement (bb()) feu = 0 EndIf Next Next EndIf
Il y a de forte chances pour que ton problème soit DeleteElement (BB())
la doc dit ceci :
tu dois effacer à un moment le 1er élément et la liste n'a plus d'élément courant bien qu'elle ne soit pas vide.Après l'appel de cette fonction, le nouvel élément courant est celui qui précédait l'élément supprimé. Si l'élément supprimé était le premier, alors il n'y a plus d'élément courant (la position dans la liste est avant le premier élément, comme après un ResetList()).
Tu dois tester le résultat de DeleteElement (BB())
car ensuite
Code : Tout sélectionner
If SpriteCollision(9, BB()\X, BB()\Y, ENNEMI, sx(ENNEMI), sy(ENNEMI) ) <> 0
DeleteElement fonctionne sans soucis si on scrute la liste à partir de la fin (while previouselement() ... wend.
DeleteElement a un paramètre optionnel qui n'existait pas dans les premières versions, j'avais soulevé le problème à l'époque avec Fred.
Liste() La liste à utiliser.
Options (optionnel) Si ce paramètre est égal à 1, le nouvel élément courant sera le suivant.
Cette option veille à ce que il y aie toujours un élément en cours de validité après une suppression aussi longtemps que il y a encore des éléments de la liste.
Re: comment faire tirer mon vaisseau
Merci Denis, j'avais aussi essayé avec le ,1 comme option.
Ce que je trouve étrange c'est qu'en mettant un compteur au debug j'ai bien un élément par tire qui s'incrémente à BB(). Et à la 1ère collision j'ai le message d'erreur comme quoi il ni a pas d’élément dans la liste.
En plus j'ai aussi ajouter la verifMais ça ne change rien.
J'ai envoyé le code à microdevweb pour qu'il jette un oeil. Si tu souhaites le voir aussi fais moi signe.
Ce que je trouve étrange c'est qu'en mettant un compteur au debug j'ai bien un élément par tire qui s'incrémente à BB(). Et à la 1ère collision j'ai le message d'erreur comme quoi il ni a pas d’élément dans la liste.
En plus j'ai aussi ajouter la verif
Code : Tout sélectionner
If ListSize(BB()) > 0
delete....
Endif
J'ai envoyé le code à microdevweb pour qu'il jette un oeil. Si tu souhaites le voir aussi fais moi signe.
~~~~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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: comment faire tirer mon vaisseau
Tu peux me l'envoyer en MP, je regarderais si je trouve quelque chose.