Page 1 sur 2

comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 10:33
par Micheao
...

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 10:48
par microdevweb
Je vais te faire un exemple...

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 11:15
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)

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 13:22
par Micheao
Merc imicrodevweb pour tes explications

Pourquoi avoir crée une Structure pour le tire?

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 13:40
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

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 13:50
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

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 14:17
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

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 14:46
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")

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 15:33
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

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 15:40
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é.

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 15:54
par Micheao
merci G-Rom ça marche

Merci microdevweb pour tes explications

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 16:11
par Ar-S
@microdevweb
Je t'ai fait un petit MP

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 16:15
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.

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 16:20
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.

Re: comment faire tirer mon vaisseau

Publié : lun. 05/oct./2015 16:22
par Anonyme2
Tu peux me l'envoyer en MP, je regarderais si je trouve quelque chose.