comment faire tirer mon vaisseau
Publié : lun. 05/oct./2015 10:33
...
Forums PureBasic - Français
http://forums.purebasic.com/french/
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)
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
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
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")
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
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()).
Code : Tout sélectionner
If SpriteCollision(9, BB()\X, BB()\Y, ENNEMI, sx(ENNEMI), sy(ENNEMI) ) <> 0
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.
Code : Tout sélectionner
If ListSize(BB()) > 0
delete....
Endif