Coder sur PC Engine c'est facile ! [PART 4]
L'ensemble des cours de Gamopat
10- Créer une boucle, gérer le clavier pour bouger le sprite
Voici ce que nous avons affiché grâce aux cours précédents :
Ce qu'il serait sympa de faire maintenant, ça serait de bouger ce sprite... Pour y arriver, il faut tout simplement modifier ses coordonnées d'affichage en direct et en continu.
Dans la première partie du tuto, j'avais dit que nos codes étaient contenus
dans une boucle nommée main(). Ce "main" n'est pas vraiment une boucle mais plutôt le corps du programme. Les codes à l'intérieur y sont lu une seule fois puis le programme stoppe. C'est suffisant pour afficher le background mais pas pour bouger un sprite.
Le principe d'une boucle c'est qu'une les codes à l'intérieur soient lu "en boucle" à l'infini (ou presque). Donc il va falloir créer à l'intérieur du corps du programme une boucle qui va contenir les coordonnées du sprite, modifiées par le pad, puis son affichage.
Pour faire tout ceci, il faut quelques étapes :
10.1. Créer une boucle
on va commencer simple en créant une boucle la plus basique possible,
la voici :
while (1)
{
}
Et voila notre boucle infinie ! Le programme fera tourner en boucle tous les codes à l'intérieur des accolades. il suffit d'intégrer ces trois lignes dans un main comme ceci :
Pour l'instant cette boucle ne fait rien. Pour vérifier que ça fonctionne bien, on va lui faire afficher quelque chose. Par exemple, on va afficher une variable nommée "temps" qui augmentera de +1 à chaque boucle (ou loop). Cette variable sera utile car elle nous donnera en temps réel la vitesse de la boucle. Voici comment faire :
Pour résumer, on déclare la variable temps avant le main, puis dans le main, on crée une boucle qui fait augmenter la variable de 1, puis qui l'affiche. Testez le code, vous verrez comme ça avance vite, ça vous donne un aperçu en direct de la vitesse de votre boucle.
10.2 Contrôler sa boucle
Pour l'instant, elle est bridée à 60 boucles par secondes par défaut. Il existe trois réglages de vitesse :
- vsync(0) votre boucle sera libre mais à 60 fps maxi
- vsync(1) 60fps forcé
- vsync(2) 30fps forcé
Il est important de contrôler la vitesse de sa boucle grace à vsync, car la vitesse de votre jeu en dépend. Testez vsync(2) sur le code précédent en le mettant en fin de boucle, et vous verrez que la variable temps augmentera deux fois moins vite !
10.3 Gérer les entrées pad
Afin de bouger ce fameux sprite, il faut gérer le ou les joypad. Avec Huc, c'est assez simple, voici un exemple :
if ( joy( 0 ) & JOY_SLCT ) { temps = 0; }
Ceci vérifie si le bouton "select" du joypad 1 "joy(0)" est appuyé. Et si c'est le cas, la variable temps, sera remise à zéro. Cette vérification (ou "if") s'appelle une condition.
Les conditions sont très importantes en programmation, nous verrons ça plus en détail dans le prochain numéro du tuto.
Si vous débutez avec le C, faites bien attention à la syntaxe des ; et des accolades. Sur cet exemple j'ai tout mis sur une même ligne. Vous verrez que lorsqu'on a plusieurs lignes, le ";" ne sera pas au même endroit !
Voici cette condition intégrée à notre boucle :
while (1)
{
temps = temps + 1 ;
if ( joy( 0 ) & JOY_SLCT ) { temps = 0; }
put_number(temps,5,1,1);
}
Compilez ce code et appuyez sur la touche "s" avec Mednafen.
Vous pouvez vous amuser à changer le choix de la touche, voici la liste :
JOY_SLCT : select
JOY_STRT : start
JOY_A : bouton I
JOY_B : bouton II
JOY_UP, JOY_DOWN, JOY_LEFT, JOY_RGHT pour les fleches
joy( 0 ) : manette 1
joy( 1 ) : manette 2
vous pouvez aussi faire deux touches en meme temps, par exemple :
if ( joy( 0 ) == (JOY_A | JOY_B )) { temps = 0; }
PS: avec Mednafen, les touches I et II sont "d" et "f" pour la manette 1
Voici ce que ça donne niveau code :
Modifier la variable temps c'est bien, mais pour notre projet, il serait plus utile de modifier les coordonnées de notre sprite. Nous allons donc créer et modifier une variable qui sera la position X du sprite.
Cette variable nous la nommerons positionX. Comme d'habitude, il faut la déclarer avant le main, lui donner une valeur dans le main, puis modifier cette valeur dans la boucle.
Voici ce que ça donne :
int positionX;
int positionY;
positionX = 80;
positionY = 100;
if ( joy( 0 ) & (JOY_LEFT)) { positionX = positionX -1 ; }
if ( joy( 0 ) & (JOY_RGHT)) { positionX = positionX +1 ; }
10.4 Structurer son code
Maintenant nous savons faire une boucle, gérer le pad et modifier une valeur. Mais avant de pouvoir enfin bouger le sprite il va falloir structurer un minimum son code afin de ne pas "lacher" ses codes à la va-vite.
Voici l'architecture type qu'il nous faudra :
Si vous avez suivi depuis le début, tout vous semblera logique
- déclaration des variables
- chargement des tiles
début du main ()
- création du sprite
- affichage du background
**** début de boucle
- entrées pad
- affichage du sprite
**** fin de boucle
fin du main ()
10.5 code complet
Maintenant, il est temps de mettre toutes ces nouveautés dans notre code. Le voici, avec des commentaires pour bien visualiser les différentes parties :
#include "huc.h"
int VSyncCnt;
int TimerCnt;
int MainCnt;
int SubCnt;
/* declaration des variables */
int temps;
int positionX;
int positionY;
/* chargement du decor */
#incchr(tiles_decor,"decor.pcx",40,27 )
#incbat(map_decor,"decor.pcx",0x1000,40,27 )
#incpal(palette_decor,"decor.pcx" )
/* chargement des tiles du sprite */
#incspr(hero_debout,"debout.pcx",0,0,2,4)
#incpal(palette_hero,"debout.pcx")
main()
{
set_xres( 320 );
/* affichage du decor */
load_background(tiles_decor,palette_decor,map_decor,40,27);
/* creation du sprite */
spr_set( 1 );
set_sprpal( 0 , palette_hero);
load_vram( 0x6000 , hero_debout , 512);
spr_pattern( 0x6000 );
spr_ctrl( SIZE_MAS|FLIP_MAS , SZ_32x64|NO_FLIP );
spr_pal( 0 );
spr_pri( 1 );
/* affectation au sprite des tiles ,de la palette et de la position */
load_vram( 0x6000 , hero_debout , 512);
set_sprpal( 0 , palette_hero );
positionX = 80;
positionY = 100;
while (1)
{
temps = temps + 1 ;
/* entrée pad et modifs de la position */
if ( joy( 0 ) & (JOY_LEFT)) { positionX = positionX -1 ; }
if ( joy( 0 ) & (JOY_RGHT)) { positionX = positionX +1 ; }
/* affichage du temps */
put_number(temps,5,1,1);
/* positionnement du sprite */
spr_set( 1 );
spr_x( positionX );
spr_y( positionY );
/* synchronisation et affichage à l'ecran */
vsync( 1 );
satb_update();
disp_on();
}
}
Voilà, vous n'avez plus qu'à compiler ça et vous amuser à bouger le héros avec les flèches !
Prochaine étape du tuto, faire des conditions pour que le sprite ne sorte pas de l'écran ;)
@+