IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Projets Discussion :

[ QB64 ] - Les Tutos de Papi Commando - Chapitre II - Gestion des HitBox : HitBox GAME !


Sujet :

Projets

  1. #1
    Expert éminent
    Avatar de Vetea
    Homme Profil pro
    Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Inscrit en
    Février 2005
    Messages
    2 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2005
    Messages : 2 061
    Points : 6 443
    Points
    6 443
    Par défaut [ QB64 ] - Les Tutos de Papi Commando - Chapitre II - Gestion des HitBox : HitBox GAME !


    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/...Box%20GAME.zip

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    '==================
    '=   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'
    Développeur - Créateur Amateur de Jeux vidéos
    Visitez ma page dédiée
    Visitez mon espace Itch.io
    Mon canal Discord

  2. #2
    Expert éminent
    Avatar de Vetea
    Homme Profil pro
    Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Inscrit en
    Février 2005
    Messages
    2 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Test - Maintenance - Production - BE dans une PME d'electronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2005
    Messages : 2 061
    Points : 6 443
    Points
    6 443
    Par défaut
    Bonsoir,

    Je voulais savoir si le format et l'idée vous plaisent pour de futurs Tutoriels sur le même thème de petits jeux 2D ?
    Merci.
    Développeur - Créateur Amateur de Jeux vidéos
    Visitez ma page dédiée
    Visitez mon espace Itch.io
    Mon canal Discord

Discussions similaires

  1. [Windows Phone 8] [TUTO] Trucs et astuces pour la gestion des langues pour Universal Apps (Windows Phone 8.1)
    Par ChickenJim dans le forum Windows Phone
    Réponses: 3
    Dernier message: 15/02/2015, 15h41
  2. [AC-2013] [Tuto] Base de données d'exemple - Gestion des bugs de projets
    Par vduvernet dans le forum Contribuez
    Réponses: 4
    Dernier message: 16/11/2014, 23h08
  3. Réponses: 11
    Dernier message: 24/08/2014, 23h27
  4. Réponses: 3
    Dernier message: 12/08/2007, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo