[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
2 participants
Page 1 sur 1
[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
Bonjour à tous !
Je poursuis les tutoriels sur QB64 avec aujourd'hui un petit Jeu - Tutoriel vous montrant comment gérer les éléments fixes et leur HitBox ainsi que des éléments mouvants.
Nous verrons aussi comment gérer les collisions.
Un Background a été aussi mis en place pour changer du sobre fond noir.
"Hitbox GAME" est un petit jeu ou Papi devra trouver sur les 5 pneus du tableau celui qui pourra bouger, et ensuite l'amener à la cible.
Au succès de sa terrible mission, le tableau se réinitialisera pour une autre partie.
La touche SPACE permet de réinitialiser le tableau, ESCAPE de quitter le Tutoriel.
Pour le moment, il n'y aucune gestion de score, sons, musiques ... Nous verrons ces aspects plus tard dans d'autres tutoriels.
Le code est libre, et vous avez le loisir de le modifier à votre guise pour enrichir le jeu, améliorer le code ...
Les commentaires sont là pour vous aider et vous guider au travers du code.
Je vous souhaite un bon apprentissage, de belles petites parties et surtout, de la pratique !
A bientôt pour un autre Tutoriel - Papi Commando !!
Lien de la démo : https://dl.dropboxusercontent.com/u/108143465/Papi%20Tutoriel%20-%20HitBox%20GAME.zip
Le code :
- Code:
'==================
'= Papi Tuto =
'= =
'= Avec la Lib. =
'= de Pete's =
'= (c) Vetea =
'= 2014 =
'==================
'Chargement de la librairie
'$INCLUDE:'Ressources\Lib\spritetop.bi'
'///// R‚solution de notre fenˆtre principale /////
SCREEN _NEWIMAGE(320, 200, 32) 'X - 320 & Y - 200, 32 Millions de couleur
_SCREENMOVE _MIDDLE 'On centre l'‚cran en mode fenˆtr‚
CLS 'on efface l'‚cran
'Titre de la fenˆtre
_TITLE "Papi HitBox GAME (c) 2014 Vetea" 'L'‚cran de notre fenˆtre
_FULLSCREEN _OFF 'Mode fenˆtr‚ _ON ' Mode plein ‚cran
'///// D‚claration de nos variables principales /////
CONST FALSE = 0, TRUE = NOT FALSE ' Constante bool‚enne
' Les diff‚rentes type de variables : SINGLE ( +-2.802597E-45, +-3.402823E+38 ) = variable virgule flottante de 4 bits, INTEGER ( -32768, + 32768 ) = variable type entier de 2 bits
' _BYTE ( -128,128 )= Variable type entier de 1 bit, LONG ( -2 147 483 648, 2 147 483 647 ) = Variable type entier de 4 bits
TYPE SpriteT
CoordX AS SINGLE 'Coordonn‚es X du sprite
CoordY AS SINGLE 'Coordonn‚es Y du sprite
Visible AS _BYTE 'Visibilit‚ du sprite
Tile AS LONG 'Table graphique principale - TileSet
Vitesse AS _BYTE 'Vitesse de notre sprite
Frame AS INTEGER 'Frame d'animation courante
FrameMax AS INTEGER 'Frame d'animation maxi par mouvement
SensAnimation AS INTEGER 'Sens de la frame d'animation
SensDeplacement AS STRING * 2 'Sens de d‚placement de notre sprite
NumeroAnimation AS INTEGER 'Num‚ro du sprite pour l'animation
TempoAnimation AS INTEGER 'Tempo pour la vitesse d'animation
'Le gabarit de nos objets
IntervalleXmin AS INTEGER
IntervalleXmax AS INTEGER
IntervalleYmin AS INTEGER
IntervalleYmax AS INTEGER
'Le type de notre objet
Obstacle AS _BYTE '1 si obstacle, 2 obstacle mouvant, 0 rien
HIT AS _BYTE 'Test de collision du pneu mouvant avec les obstacles
END TYPE
'Notre Tableau de carte en 2 Dimensions de 1024 x 1024, vous pourrez changer ces valeurs pour gagner un peu plus de m‚moire.
DIM SHARED Obstacle(-512 TO 512, -512 TO 512) AS _BYTE ' 1 si obstacle, 0 si rien
'Les variables de ressources
'Les sprites
DIM SHARED Spritetableau AS SpriteT 'Notre sprite principal
DIM SHARED SpriteBackGround AS SpriteT 'Notre BackGround
DIM SHARED SpritePneu(5) AS SpriteT 'Nos sprites ou 5 pneus !
DIM SHARED SpriteTarget AS SpriteT 'Notre cible !
'Les Textures
DIM SHARED TableSprite AS LONG 'Notre table ou sera stock‚ notre sprite
DIM SHARED TableBackGround AS LONG 'Notre table ou sera stock‚ notre BackGround
DIM SHARED TablePneu AS LONG 'Notre table ou sera stock‚ notre pneu
DIM SHARED TableTarget AS LONG 'Notre table ou sera stock‚ notre cible
'La variable de test clavier
DIM SHARED ModeClavier AS _BYTE
'Variables Diverses
DIM SHARED I, J, K AS INTEGER
'Les variables qui d‚finiront les d‚placements de notre sprite
DIM SHARED Droite AS _BYTE, Gauche AS _BYTE, Haut AS _BYTE, Bas AS _BYTE, BGauche AS _BYTE, BDroite AS _BYTE, HGauche AS _BYTE, HDroite AS _BYTE
DIM SHARED MoveRight AS LONG, MoveLeft AS LONG, MoveDown AS LONG, MoveUp AS LONG
DIM SHARED DirectionHaut AS _BYTE, DirectionBas AS _BYTE, DirectionDroite AS _BYTE, DirectionGauche AS _BYTE
'///// Chargement de nos Ressources /////
ChargementGraphiques
ChargementDonnees
'///// Boucle Principale /////
DO
_LIMIT 60 'INDISPENSABLE !! On limite l'affichage … 60 im/s
'Voici les diff‚rentes proc‚dures qui gŠrent notre d‚mo :
ToucheClavier 'Gestion physique Clavier
'Voyons si notre pneu mouvant n'a pas touch‚ notre cible
IF HITBOXCIBLE = 1 OR _KEYDOWN(32) THEN InitScene 'Si le pneu touche la scene, alors on r‚initialise notre scene
GestionDeplacement 'Int‚raction du clavier avec les coordonn‚es de notre sprite
LimiteZone 'Gestion des limites des zones d'‚cran
AnimationUnite 'Animation du sprite
AffichageScene
_DISPLAY 'INDISPENSABLE !!! Elimine le Flickering, et fluidifie notre rafraichisement d'‚cran.
LOOP UNTIL (_KEYDOWN(27)) 'On quitte en appuyant sur la touche Escape.
SYSTEM 'Retour bureau
'///// Gestion du Clavier - Touche /////
SUB ToucheClavier
'Association des variables / touches
'Notez que si une touche n'est plus appuy‚e, on r‚initialise la variable de direction pour ‚viter que le personnage continue de se d‚placer si on relache la touce.
'Init Clavier
ModeClavier = FALSE 'Par d‚faut, le clavier est inactif si aucune touche n'est activ‚e.
'Touches principales ( fl‚ch‚es )
IF _KEYDOWN((MoveDown)) THEN DirectionBas = 1 ELSE DirectionBas = 0 'En bas
IF _KEYDOWN((MoveUp)) THEN DirectionHaut = 1 ELSE DirectionHaut = 0 'En Haut
IF _KEYDOWN((MoveLeft)) THEN DirectionGauche = 1 ELSE DirectionGauche = 0 'A gauche
IF _KEYDOWN((MoveRight)) THEN DirectionDroite = 1 ELSE DirectionDroite = 0 'A droite
'Gestion des diagonales
IF DirectionBas = 1 AND DirectionGauche = 1 THEN BGauche = 1 ELSE BGauche = 0
IF DirectionBas = 1 AND DirectionDroite = 1 THEN BDroite = 1 ELSE BDroite = 0
IF DirectionHaut = 1 AND DirectionGauche = 1 THEN HGauche = 1 ELSE HGauche = 0
IF DirectionHaut = 1 AND DirectionDroite = 1 THEN HDroite = 1 ELSE HDroite = 0
END SUB
'///// Gestion des collisions avec le d‚cor /////
FUNCTION HITBOX (coordx, coordy)
IF Obstacle(coordx, coordy) = 1 THEN HITBOX = 1 ELSE HITBOX = 0 'Obstacle normal
END FUNCTION
'///// Collision de notre pneu mouvant avec la Cible /////
FUNCTION HITBOXCIBLE
IF (ABS(SpritePneu(1).CoordX - SpriteTarget.CoordX) <= 16 AND ABS((SpritePneu(1).CoordY + 12) - (SpriteTarget.CoordY)) <= 16) THEN HITBOXCIBLE = 1 ELSE HITBOXCIBLE = 0
END FUNCTION
'///// Init de la scŠne /////
SUB InitScene
CLS 'On efface l'‚cran
ERASE Obstacle 'On efface notre tableau principal
'Init des ‚l‚ments de la scŠne
RANDOMIZE TIMER 'On r‚g‚nŠre notre compteur RND
FOR I = 1 TO 5
SpritePneu(I).Obstacle = 1 'Notre pneu est un obstacle
SpritePneu(1).Obstacle = 2 'Notre premier pneu pourra ˆtre boug‚ !
Debut:
Test = Test + 1 'Test de v‚rification au cas ou l'algo prendrait trop de temps
SpritePneu(I).CoordX = INT((RND * 320) + 1) 'Nos coordonn‚es X seront comprises entre 0 et 320 et converties en ENTIER avec INT
SpritePneu(I).CoordY = INT((RND * 200) + 1) 'Nos coordonn‚es X seront comprises entre 0 et 200 et converties en ENTIER avec INT
'On va effectuer un petit algorithme qui va v‚rifier que nos pneus ne se chevaucheront pas
FOR J = 1 TO 5
IF I <> J THEN
IF ABS(SpritePneu(J).CoordX - SpritePneu(I).CoordX) <= 40 AND ABS(SpritePneu(J).CoordY - SpritePneu(I).CoordY) <= 40 THEN Chevauchement = TRUE ELSE Chevauchement = FALSE
IF Chevauchement = TRUE THEN GOTO Debut: 'Si les pneus se chevauchent, alors on relance le tirage
END IF
NEXT J
IF SpritePneu(I).CoordX > 320 - 32 OR SpritePneu(I).CoordX < 0 + 32 THEN Chevauchement = TRUE 'Si notre coordonn‚es X est sup‚rieure … 320 ou inf‚rieure … 0 alors on relance le tirage
IF SpritePneu(I).CoordY < 32 OR SpritePneu(I).CoordY > 200 - 32 THEN Chevauchement = TRUE 'Si notre coordonn‚es Y est sup‚rieure … 200 ou inf‚rieure … 0 alors on relance le tirage
IF Chevauchement = TRUE THEN GOTO Debut:
Chevauchement = FALSE
'Calcul de notre Hitbox par rapport aux coordonn‚es du pneu
FOR J = SpritePneu(I).IntervalleXmin TO SpritePneu(I).IntervalleXmax
FOR K = SpritePneu(I).IntervalleYmin TO SpritePneu(I).IntervalleYmax
Obstacle((SpritePneu(I).CoordX + J), (SpritePneu(I).CoordY + K)) = 1
NEXT K
NEXT J
NEXT I
'Sprite de notre cible
SpriteTarget.CoordX = INT((RND * (320 - 32)) + 1)
SpriteTarget.CoordY = INT((RND * (200 - 32)) + 1)
'Position de notre Papi au d‚part de notre d‚mo, on va v‚rifier qu'il n'est pas sur un obstacle et n'est pas non plus aux extremes limite du tableau
Calcul:
Spritetableau.CoordX = INT((RND * 320) + 1)
Spritetableau.CoordY = INT((RND * 200) + 1)
IF Spritetableau.CoordX > 320 - 32 OR Spritetableau.CoordX < 0 + 32 THEN GOTO Calcul: 'Test de limite coordX
IF Spritetableau.CoordY < 32 OR Spritetableau.CoordY > 200 - 32 THEN GOTO Calcul: 'Test de limite Coordy
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 THEN GOTO Calcul: 'Test avec la pr‚sence d'obstacle
END SUB
'///// Gestion du pneu mouvant /////
SUB PneuMouvant (SpeedPapi AS _BYTE)
IF (ABS(SpritePneu(1).CoordX - Spritetableau.CoordX) <= 16 AND ABS((SpritePneu(1).CoordY - 24) - (Spritetableau.CoordY)) <= 12) THEN
SELECT CASE Spritetableau.SensDeplacement
CASE "H "
SpritePneu(1).CoordY = SpritePneu(1).CoordY - SpeedPapi
IF HITBOX(SpritePneu(1).CoordX, SpritePneu(1).CoordY - 16) = 1 THEN
SpritePneu(1).HIT = 1
ELSE
SpritePneu(1).HIT = 0
END IF
CASE "B "
SpritePneu(1).CoordY = SpritePneu(1).CoordY + SpeedPapi
IF HITBOX(SpritePneu(1).CoordX, SpritePneu(1).CoordY - 16) = 1 THEN
SpritePneu(1).HIT = 1
END IF
CASE "D "
SpritePneu(1).CoordX = SpritePneu(1).CoordX + SpeedPapi
IF HITBOX(SpritePneu(1).CoordX, SpritePneu(1).CoordY - 16) = 1 THEN
SpritePneu(1).HIT = 1
ELSE
SpritePneu(1).HIT = 0
END IF
CASE "G "
SpritePneu(1).CoordX = SpritePneu(1).CoordX - SpeedPapi
IF HITBOX(SpritePneu(1).CoordX, SpritePneu(1).CoordY - 16) = 1 THEN
SpritePneu(1).HIT = 1
ELSE
SpritePneu(1).HIT = 0
END IF
END SELECT
END IF
END SUB
'///// Gestion d‚placement du Sprite /////
SUB GestionDeplacement
'D‚finition des directions H,B,G,D
IF DirectionBas = 1 THEN
ModeClavier = TRUE 'Clavier actif !
Spritetableau.NumeroAnimation = 0 'On attribue la frame de d‚part du sprite relatif … son d‚placement.
Spritetableau.SensDeplacement = "B " 'On lui attribue ensuite la direction … prendre ( inutile dans le cadre de notre d‚mo, mais fort utile pour diverses am‚liorations et ajouts annexes. )
Spritetableau.CoordY = Spritetableau.CoordY + (Spritetableau.Vitesse)
'Gestion du pneu mouvant
PneuMouvant Spritetableau.Vitesse
'On teste s'il n'y a pas d'obstacles
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 OR SpritePneu(1).HIT = 1 THEN
Spritetableau.CoordY = Spritetableau.CoordY - (Spritetableau.Vitesse)
IF SpritePneu(1).HIT = 1 THEN SpritePneu(1).CoordY = SpritePneu(1).CoordY - (Spritetableau.Vitesse)
SpritePneu(1).HIT = 0
END IF
END IF
IF DirectionHaut = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 9
Spritetableau.SensDeplacement = "H "
Spritetableau.CoordY = Spritetableau.CoordY - (Spritetableau.Vitesse)
'Gestion du pneu mouvant
PneuMouvant Spritetableau.Vitesse
'On teste s'il n'y a pas d'obstacles
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 OR SpritePneu(1).HIT = 1 THEN
Spritetableau.CoordY = Spritetableau.CoordY + (Spritetableau.Vitesse)
IF SpritePneu(1).HIT = 1 THEN SpritePneu(1).CoordY = SpritePneu(1).CoordY + (Spritetableau.Vitesse)
SpritePneu(1).HIT = 0
END IF
END IF
IF DirectionGauche = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 3
Spritetableau.SensDeplacement = "G "
Spritetableau.CoordX = Spritetableau.CoordX - (Spritetableau.Vitesse)
'Gestion du pneu mouvant
PneuMouvant Spritetableau.Vitesse
'On teste s'il n'y a pas d'obstacles
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 OR SpritePneu(1).HIT = 1 THEN
Spritetableau.CoordX = Spritetableau.CoordX + (Spritetableau.Vitesse)
IF SpritePneu(1).HIT = 1 THEN SpritePneu(1).CoordX = SpritePneu(1).CoordX + (Spritetableau.Vitesse)
SpritePneu(1).HIT = 0
END IF
END IF
IF DirectionDroite = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 6
Spritetableau.SensDeplacement = "D "
Spritetableau.CoordX = Spritetableau.CoordX + (Spritetableau.Vitesse)
'Gestion du pneu mouvant
PneuMouvant Spritetableau.Vitesse
'On teste s'il n'y a pas d'obstacles
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 OR SpritePneu(1).HIT = 1 THEN
Spritetableau.CoordX = Spritetableau.CoordX - (Spritetableau.Vitesse)
IF SpritePneu(1).HIT = 1 THEN SpritePneu(1).CoordX = SpritePneu(1).CoordX - (Spritetableau.Vitesse)
SpritePneu(1).HIT = 0
END IF
END IF
'Selection des sprite d'animations si d‚placement en diagonale
IF HGauche = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 21
Spritetableau.SensDeplacement = "HG"
END IF
IF HDroite = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 18
Spritetableau.SensDeplacement = "HD"
END IF
IF BDroite = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 15
Spritetableau.SensDeplacement = "BD"
END IF
IF BGauche = 1 THEN
ModeClavier = TRUE
Spritetableau.NumeroAnimation = 12
Spritetableau.SensDeplacement = "BG"
END IF
END SUB
'///// Gestion Limite Zone /////
SUB LimiteZone
'Dans le cadre des limites du tableau, on prend en compte la taille du sprite ( Hauteur : 48px, Largeur : 32px ) que l'on divise par 2 pour ne pas que le sprite d‚borde des limites.
IF Spritetableau.CoordX > 320 - (16 / 2) THEN Spritetableau.CoordX = 320 - (16 / 2)
IF Spritetableau.CoordX < 0 + (16 / 2) THEN Spritetableau.CoordX = 0 + (16 / 2)
IF Spritetableau.CoordY > 200 THEN Spritetableau.CoordY = 200
IF Spritetableau.CoordY < 0 THEN Spritetableau.CoordY = 0
END SUB
'///// Gestion de l'animation du sprite /////
SUB AnimationUnite
'Si aucun appui touche, alors on r‚initialise la frame d'animation et on quitte la proc‚dure.
IF ModeClavier = FALSE THEN
Spritetableau.Frame = 2
EXIT SUB
ELSE
'Si appui touche, on fait tourner les 3 frames d'animations ( Spritetableau.FrameMax = 3 ) de notre sprite.
Spritetableau.TempoAnimation = Spritetableau.TempoAnimation + 1 'On incr‚mente notre tempo d'animation
IF Spritetableau.TempoAnimation > 4 THEN
Spritetableau.Frame = Spritetableau.Frame + 1 * Spritetableau.SensAnimation 'Routine principale de l'animation
IF Spritetableau.Frame > Spritetableau.FrameMax THEN
Spritetableau.Frame = Spritetableau.FrameMax
Spritetableau.SensAnimation = -1 'Si l'on arrive … la fin des frame maxi alors on d‚cr‚mente le sens de l'animation
END IF
IF Spritetableau.Frame < 1 THEN 'Quand on arrive … la frame 1 on change … nouveau le sens de l'animation
Spritetableau.Frame = 1
Spritetableau.SensAnimation = 1
END IF
Spritetableau.TempoAnimation = 0 'Init du timer en fin de frame
END IF
END IF
END SUB
'///// Gestion de l'affichage du sprite /////
SUB AffichageSprite (CoordX AS SINGLE, CoordY AS SINGLE, Animation AS INTEGER, TILE AS LONG)
'On s‚lectionne les diff‚rentes frame de notre table principal
SPRITESET TILE, Animation 'S‚lection du sprite dans la table
'On affiche notre joli sprite … l'‚cran
SPRITESTAMP CoordX, CoordY, TILE 'Affichage du sprite
END SUB
'///// Affichage du BackGround /////
SUB AffichageSol
SPRITEPUT 256, 0, SpriteBackGround.Tile
END SUB
'///// Affichage de notre Scene /////
SUB AffichageScene
'En premier lieu, on affichage notre Background
AffichageSol
'Ensuite notre cible
AffichageSprite SpriteTarget.CoordX, SpriteTarget.CoordY, 1, SpriteTarget.Tile 'Affichage de notre cible
'On affiche nos 5 pneus
FOR I = 1 TO 5
AffichageSprite SpritePneu(I).CoordX, SpritePneu(I).CoordY, 1, SpritePneu(I).Tile 'Affichage du sprite
NEXT I
'On affiche ensuite nos sprite
AffichageSprite Spritetableau.CoordX, Spritetableau.CoordY, Spritetableau.Frame + Spritetableau.NumeroAnimation, Spritetableau.Tile 'Affichage du sprite
_DISPLAY
END SUB
'////// Chargement Graphiques /////
SUB ChargementGraphiques
TableSprite = SPRITESHEETLOAD("Papi Tuto - HitBox Game\Ressources\Textures\PapiCommandoSprite32x48.png", 32, 48, AUTOTRANSPARENCY) 'Ici on charge notre table de sprite qui est compos‚ de rectangle de 11 px X 16 px avec un canal alpha.
TableBackGround = SPRITESHEETLOAD("Papi Tuto - HitBox Game\Ressources\Textures\BackGround_512x512.png", 512, 512, AUTOTRANSPARENCY) 'On charge notre fond d'‚cran d'une taille unique de 512x512
TablePneu = SPRITESHEETLOAD("Papi Tuto - HitBox Game\Ressources\Textures\Pneu_32x32.png", 32, 32, AUTOTRANSPARENCY) 'On charge notre pneu d'une taille de 32x32
TableTarget = SPRITESHEETLOAD("Papi Tuto - HitBox Game\Ressources\Textures\Target32x32.png", 32, 32, AUTOTRANSPARENCY) 'On charge notre Cible d'une taille de 32x32
END SUB
'///// Chargement Donn‚es /////
SUB ChargementDonnees
DIM DoublonX(5) AS INTEGER, DoublonY(5) AS INTEGER, Chevauchement AS _BYTE, Test AS INTEGER
'Traitement de nos pneus
RANDOMIZE TIMER 'On r‚g‚nŠre notre compteur RND
FOR I = 1 TO 5
SpritePneu(I).Tile = SPRITENEW(TablePneu, I, SAVE) 'On stocke le pneu avec nos 5 sprites
SpritePneu(I).Obstacle = 1 'Notre pneu est un obstacle
SpritePneu(1).Obstacle = 2 'Notre premier pneu pourra ˆtre boug‚ !
'Le gabarit de notre pneu, vous pouvez peaufiner vos r‚glages en modifiant le rectangle de collision ( Xmin -> Xmax, Ymin -> Ymax ), le pneu mouvant aura un autre traitement
IF SpritePneu(I).Obstacle = 1 THEN
SpritePneu(I).IntervalleXmin = -20
SpritePneu(I).IntervalleXmax = 20
SpritePneu(I).IntervalleYmin = -35
SpritePneu(I).IntervalleYmax = 5
END IF
Debut:
Test = Test + 1 'Test de v‚rification au cas ou l'algo prendrait trop de temps
SpritePneu(I).CoordX = INT((RND * 320) + 1) 'Nos coordonn‚es X seront comprises entre 0 et 320 et converties en ENTIER avec INT
SpritePneu(I).CoordY = INT((RND * 200) + 1) 'Nos coordonn‚es X seront comprises entre 0 et 200 et converties en ENTIER avec INT
'On va effectuer un petit algorithme qui va v‚rifier que nos pneus ne se chevaucheront pas
FOR J = 1 TO 5
IF I <> J THEN
IF ABS(SpritePneu(J).CoordX - SpritePneu(I).CoordX) <= 40 AND ABS(SpritePneu(J).CoordY - SpritePneu(I).CoordY) <= 40 THEN Chevauchement = TRUE ELSE Chevauchement = FALSE
IF Chevauchement = TRUE THEN GOTO Debut: 'Si les pneus se chevauchent, alors on relance le tirage
END IF
NEXT J
IF SpritePneu(I).CoordX > 320 - 32 OR SpritePneu(I).CoordX < 0 + 32 THEN Chevauchement = TRUE 'Si notre coordonn‚es X est sup‚rieure … 320 ou inf‚rieure … 0 alors on relance le tirage
IF SpritePneu(I).CoordY < 32 OR SpritePneu(I).CoordY > 200 - 32 THEN Chevauchement = TRUE 'Si notre coordonn‚es Y est sup‚rieure … 200 ou inf‚rieure … 0 alors on relance le tirage
IF Chevauchement = TRUE THEN GOTO Debut:
Chevauchement = FALSE
'Calcul de notre Hitbox par rapport aux coordonn‚es du pneu ( Seulement dans le cas d'un Pneu fixe )
IF SpritePneu(I).Obstacle = 1 THEN
FOR J = SpritePneu(I).IntervalleXmin TO SpritePneu(I).IntervalleXmax
FOR K = SpritePneu(I).IntervalleYmin TO SpritePneu(I).IntervalleYmax
Obstacle((SpritePneu(I).CoordX + J), (SpritePneu(I).CoordY + K)) = 1
NEXT K
NEXT J
END IF
NEXT I
'Sprite de notre cible
SpriteTarget.Tile = SPRITENEW(TableTarget, 1, SAVE)
SpriteTarget.CoordX = INT((RND * (320 - 32)) + 1)
SpriteTarget.CoordY = INT((RND * (200 - 32)) + 1)
'Sprite de notre papi
Spritetableau.Tile = SPRITENEW(TableSprite, 1, SAVE)
SpriteBackGround.Tile = SPRITENEW(TableBackGround, 1, SAVE)
Spritetableau.Obstacle = 0 'Notre sprite n'est pas un obstacle
Spritetableau.NumeroAnimation = 9 'Frame d'animation de d‚part ( Sprite vu de derriŠre )
Spritetableau.Visible = TRUE 'Sprite visible … l'‚cran
Spritetableau.Vitesse = 2 'Vitesse du sprite
Spritetableau.SensAnimation = 1
Spritetableau.FrameMax = 3
Spritetableau.Frame = 1
'Position de notre Papi au d‚part de notre d‚mo, on va v‚rifier qu'il n'est pas sur un obstacle et n'est pas non plus aux extremes limite du tableau
Calcul:
Spritetableau.CoordX = INT((RND * 320) + 1)
Spritetableau.CoordY = INT((RND * 200) + 1)
IF Spritetableau.CoordX > 320 - 32 OR Spritetableau.CoordX < 0 + 32 THEN GOTO Calcul: 'Test de limite coordX
IF Spritetableau.CoordY < 32 OR Spritetableau.CoordY > 200 - 32 THEN GOTO Calcul: 'Test de limite Coordy
IF HITBOX(Spritetableau.CoordX, Spritetableau.CoordY) = 1 THEN GOTO Calcul: 'Test avec la pr‚sence d'obstacle
'D‚finition des touches de d‚placement ( Touches fl‚ch‚es ) - Il s'agit du code des touches. Vous pourrez les trouver sur le Wiki ou bien dans l'onglet "Help"
MoveUp = 18432
MoveDown = 20480
MoveLeft = 19200
MoveRight = 19712
END SUB
'$INCLUDE:'Ressources\Lib\sprite.bi'
Invité- Invité
Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
2 premiers commentaires :
- la déclaration des variables ne sert pas à grand chose (ca semble compliqué pour un débutant)
- pour le deplacement je pense qu'il faut faire beaucoup plus simple, comme par exemple :
xx=0:yy=0
IF _KEYDOWN(MoveDown) THEN yy=1
IF _KEYDOWN(MoveUp) THEN yy=-1
IF _KEYDOWN(MoveLeft) THEN xx=-1
IF _KEYDOWN(MoveRight) THEN xx=1
et apres tu déplaces ton perso x=x+xx:y=y+yy
- la déclaration des variables ne sert pas à grand chose (ca semble compliqué pour un débutant)
- pour le deplacement je pense qu'il faut faire beaucoup plus simple, comme par exemple :
xx=0:yy=0
IF _KEYDOWN(MoveDown) THEN yy=1
IF _KEYDOWN(MoveUp) THEN yy=-1
IF _KEYDOWN(MoveLeft) THEN xx=-1
IF _KEYDOWN(MoveRight) THEN xx=1
et apres tu déplaces ton perso x=x+xx:y=y+yy
_______________________________________________________
Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
Juste un petit mot pour féliciter ton initiative de proposer des tutos comme ça
Quand je vois ce qu'il est possible de faire en QB64, j'aurais presque envie de m'y mettre
Doc, déclarer ses variables, c'est une bonne habitude à prendre ! La permissivité, le manque de rigueur du basic m'a toujours un peu rebuté.
Quand je vois ce qu'il est possible de faire en QB64, j'aurais presque envie de m'y mettre
Doc, déclarer ses variables, c'est une bonne habitude à prendre ! La permissivité, le manque de rigueur du basic m'a toujours un peu rebuté.
Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
Bonjour et merci Urbinou !
Et bien, j'aime bien faire partager mon expérience et mon enthousiasme quant à cette fabuleuse technologie !
On peut faire beaucoup de chose, et quand tu vois les projets du Doc, de F.L et les miens, on ne réalise pas assez les possibilités ludiques de QB64 !
Ce week end, j'ai développé un véritable "petit" jeu en à peine 5h ( TIRE GAME que tu trouveras sur ce forum. ) et encore, j'aurai pu gérer du scrolling multi directionnel.
Mais saches que les "Jedi" qui maitrise la puissance machine au travers de l'assembleur, tel que toi, 65c02, m'ont toujours et m'impressionneront toujours autant.
J'ai un très grand respect pour vous car vous prenez en compte un tel panel de contrainte matérielle ( Ram, Process, etc ... ) qui semble complétement surannée de nos jours avec nos I7, que je trouve que vous êtes un peu les "veilleurs" d'un art qui se perdra avec le temps.
Respect.
Et bien, j'aime bien faire partager mon expérience et mon enthousiasme quant à cette fabuleuse technologie !
On peut faire beaucoup de chose, et quand tu vois les projets du Doc, de F.L et les miens, on ne réalise pas assez les possibilités ludiques de QB64 !
Ce week end, j'ai développé un véritable "petit" jeu en à peine 5h ( TIRE GAME que tu trouveras sur ce forum. ) et encore, j'aurai pu gérer du scrolling multi directionnel.
Mais saches que les "Jedi" qui maitrise la puissance machine au travers de l'assembleur, tel que toi, 65c02, m'ont toujours et m'impressionneront toujours autant.
J'ai un très grand respect pour vous car vous prenez en compte un tel panel de contrainte matérielle ( Ram, Process, etc ... ) qui semble complétement surannée de nos jours avec nos I7, que je trouve que vous êtes un peu les "veilleurs" d'un art qui se perdra avec le temps.
Respect.
Invité- Invité
Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
Urbinou a écrit:
Doc, déclarer ses variables, c'est une bonne habitude à prendre ! La permissivité, le manque de rigueur du basic m'a toujours un peu rebuté.
oui dans l'absolu c'est vrai, pour un programmeur maniaque
_______________________________________________________
Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )
Vetea a écrit:
Ce week end, j'ai développé un véritable "petit" jeu en à peine 5h ( TIRE GAME que tu trouveras sur ce forum. ) et encore, j'aurai pu gérer du scrolling multi directionnel.
exact, perso j'ai fait un test en 2h sur un jeu de sport avec scrolling multidirectionnel et gestion intelligente de la "caméra"... d'ailleurs je vous le dévoilerais bientot.
Mais c'est fou à la vitesse à laquelle on peut avoir des résultats !
il n'y a aucune limite autre que son imagination ! (du moins pour des projets orientés rétro)
_______________________________________________________
Sujets similaires
» [ QB64 ] - Les tutos de Papi Commando ! ( Version Windows Uniquement )
» [SMS] Papi Commando In CPP Land
» Papi Commando - Arcade edition !
» Super Papi Commando
» Papi Commando sur Amstrad CPC+ / GX4000 !
» [SMS] Papi Commando In CPP Land
» Papi Commando - Arcade edition !
» Super Papi Commando
» Papi Commando sur Amstrad CPC+ / GX4000 !
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum