GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

2 participants

Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par Invité Sam 8 Mar 2014 - 0:47

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) 14030812452413261112045451

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 ... Wink
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 !!  rambo 

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'
avatar
Invité
Invité


Revenir en haut Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par drfloyd Sam 8 Mar 2014 - 10:38

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

_______________________________________________________
[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181466
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par Urbinou Mer 12 Mar 2014 - 16:14

Juste un petit mot pour féliciter ton initiative de proposer des tutos comme ça thumleft 
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é.
Urbinou
Urbinou
Docteur agrégé **
Docteur agrégé **

Masculin Nombre de messages : 12632
Age : 55
Localisation : Liège, Belgique
Date d'inscription : 12/02/2013

http://cambouisdelatari.wordpress.com

Revenir en haut Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par Invité Mer 12 Mar 2014 - 16:22

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.
avatar
Invité
Invité


Revenir en haut Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par drfloyd Ven 14 Mar 2014 - 23:45

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  Mr. Green

_______________________________________________________
[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181466
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Empty Re: [ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows )

Message par drfloyd Ven 14 Mar 2014 - 23:48

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)

_______________________________________________________
[ QB64 ] - Les Tutos de Papi Commando ! ( Compilé sous Windows ) Giphy10





drfloyd
drfloyd
DOYEN ET PROFESSEUR FOU DE L'HOPITAL

Masculin Nombre de messages : 181466
Age : 54
Localisation : Dpt 62
Date d'inscription : 05/12/2004

http://www.gamopat.com

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum