comment faire tirer mon vaisseau

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

comment faire tirer mon vaisseau

Message par Micheao »

...
Dernière modification par Micheao le mer. 04/nov./2015 14:59, modifié 2 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: comment faire tirer mon vaisseau

Message par microdevweb »

Je vais te faire un exemple...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: comment faire tirer mon vaisseau

Message par microdevweb »

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 :wink: (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
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: comment faire tirer mon vaisseau

Message par Micheao »

Merc imicrodevweb pour tes explications

Pourquoi avoir crée une Structure pour le tire?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: comment faire tirer mon vaisseau

Message par Ar-S »

@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.

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
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: comment faire tirer mon vaisseau

Message par Patrick88 »

dans le dossier d'install de pb voir le jeu Examples\Sources - Advanced\Waponez II

très instructif, mais pas commenté du tout...

Pat
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: comment faire tirer mon vaisseau

Message par Micheao »

Patrick88 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
Merci Impossbile de lancer le code il me marque Impossible d'ouvrir un screen 640 x 480
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: comment faire tirer mon vaisseau

Message par G-Rom »

Si le problème c'est déjà d'ouvrir l'écran...
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")
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: comment faire tirer mon vaisseau

Message par microdevweb »

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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: comment faire tirer mon vaisseau

Message par microdevweb »

@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é.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: comment faire tirer mon vaisseau

Message par Micheao »

merci G-Rom ça marche

Merci microdevweb pour tes explications
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: comment faire tirer mon vaisseau

Message par Ar-S »

@microdevweb
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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: comment faire tirer mon vaisseau

Message par Anonyme2 »

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
Ar-S,
Il y a de forte chances pour que ton problème soit DeleteElement (BB())
la doc dit ceci :
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 effacer à un moment le 1er élément et la liste n'a plus d'élément courant bien qu'elle ne soit pas vide.
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 
va planter à cause de l'accès à la liste.

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.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: comment faire tirer mon vaisseau

Message par Ar-S »

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 verif

Code : Tout sélectionner

If ListSize(BB()) > 0
  delete....
Endif
Mais ç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.
~~~~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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: comment faire tirer mon vaisseau

Message par Anonyme2 »

Tu peux me l'envoyer en MP, je regarderais si je trouve quelque chose.
Répondre