(cours 4) Programmer sur PcEngine, c'est facile !
+6
Tryphon
upsilandre
Hpman
Orion_
drfloyd
F.L
10 participants
Page 1 sur 2
Page 1 sur 2 • 1, 2
(cours 4) Programmer sur PcEngine, c'est facile !
cours 1 >>> installation et debut avec Huc
cours2 >>> afficher un background
cours3 >>> afficher un sprite
10 - créer une boucle, gerer le clavier pour bouger le sprite
voici ce que nous avons affiché grace 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 premiere partie du tuto, j'avais dit que nos codes etaient contenus
dans une boucle nommée main()
ce main n'est pas vraiment une boucle mais plutot le corps du programme.
les codes à l'interieur du main y sont lu une seule fois puis le programme s'arette.
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 en boucle infinie tous les codes à l'intérieur des accolades.
il suffit d'integrer ces trois lignes dans un main comme ceci :
pour l'instant cette boucle ne fait rien.
pour verifier 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 :
on declare 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 controler sa boucle
pour l'instant, elle est bridée à 60 boucles par secondes par defaut.
il existe trois reglages de vitesse :
- vsync(0) votre boucle sera libre mais à 60 fps maxi
- vsync(1) 60fps forcé
- vsync(2) 30fps forcé
il est important de controler la vitesse de sa boucle grace à vsync,
car la vitesse de votre jeu en depend
testez vsync(2) sur le code precedent en le mettant en fin de boucle ,
et vous verrez que la variable temps augmentera deux fois moins vite !
10.3 gerer les entrées pad
afin de bouger ce fameux sprite, il faut gerer le ou les joypad
avec Huc, c'est assez simple, voici un exemple :
if ( joy( 0 ) & JOY_SLCT ) { temps = 0; }
ceci verifie 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 verification (ou "if") s'apelle une condition.
les conditions sont tres importantes en programmation,
nous verrons ça plus en détail dans le prochain numéro du tuto.
si vous debutez avec le C, faites bien attention à la synthaxe des ; et des accolades
sur cet exemple j'ai tout mis sur une meme ligne.
vous verrez que quand on a plusieures lignes, le ";" ne sera pas au meme 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 declarer avant le main,
lui donner une valeur dans le main, puis modifier cette valeur dans la boucle.
et 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 debut, tout vous semblera logique
-declaration des variables
-chargement des tiles
debut du main ()
- creation du sprite
- affichage du background
**** debut 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 differentes 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();
}
}
voila, vous n'avez plus qu'à compiler ça et vous amuser à bouger le héros avec les fleches.
prochaine étape du tuto, faire des conditions pour que le sprite ne sorte pas de l'écran.
@+
cours2 >>> afficher un background
cours3 >>> afficher un sprite
10 - créer une boucle, gerer le clavier pour bouger le sprite
voici ce que nous avons affiché grace 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 premiere partie du tuto, j'avais dit que nos codes etaient contenus
dans une boucle nommée main()
ce main n'est pas vraiment une boucle mais plutot le corps du programme.
les codes à l'interieur du main y sont lu une seule fois puis le programme s'arette.
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 en boucle infinie tous les codes à l'intérieur des accolades.
il suffit d'integrer ces trois lignes dans un main comme ceci :
pour l'instant cette boucle ne fait rien.
pour verifier 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 :
- Code:
#include "huc.h"
int VSyncCnt;
int TimerCnt;
int MainCnt;
int SubCnt;
int temps;
main()
{
while (1)
{
temps = temps + 1 ;
put_number(temps,5,1,1);
}
}
on declare 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 controler sa boucle
pour l'instant, elle est bridée à 60 boucles par secondes par defaut.
il existe trois reglages de vitesse :
- vsync(0) votre boucle sera libre mais à 60 fps maxi
- vsync(1) 60fps forcé
- vsync(2) 30fps forcé
il est important de controler la vitesse de sa boucle grace à vsync,
car la vitesse de votre jeu en depend
testez vsync(2) sur le code precedent en le mettant en fin de boucle ,
et vous verrez que la variable temps augmentera deux fois moins vite !
10.3 gerer les entrées pad
afin de bouger ce fameux sprite, il faut gerer le ou les joypad
avec Huc, c'est assez simple, voici un exemple :
if ( joy( 0 ) & JOY_SLCT ) { temps = 0; }
ceci verifie 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 verification (ou "if") s'apelle une condition.
les conditions sont tres importantes en programmation,
nous verrons ça plus en détail dans le prochain numéro du tuto.
si vous debutez avec le C, faites bien attention à la synthaxe des ; et des accolades
sur cet exemple j'ai tout mis sur une meme ligne.
vous verrez que quand on a plusieures lignes, le ";" ne sera pas au meme 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 declarer avant le main,
lui donner une valeur dans le main, puis modifier cette valeur dans la boucle.
et 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 debut, tout vous semblera logique
-declaration des variables
-chargement des tiles
debut du main ()
- creation du sprite
- affichage du background
**** debut 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 differentes 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();
}
}
voila, vous n'avez plus qu'à compiler ça et vous amuser à bouger le héros avec les fleches.
prochaine étape du tuto, faire des conditions pour que le sprite ne sorte pas de l'écran.
@+
Dernière édition par F.L le Lun 15 Mai 2017 - 22:27, édité 3 fois
Bizcuite offre 1 suppo à ce post!
Re: (cours 4) Programmer sur PcEngine, c'est facile !
attention, tu as fais une boucle de répétition à la fin de ton cours
Merci pour ce nouveau cours !
Merci pour ce nouveau cours !
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
oui, j'ai vu : une boucle dans le cours sur les boucles, ça c'est pas mal !
sinon, cette partie là est un peu plus complexe, j'espere avoir été assez clair !
sinon, cette partie là est un peu plus complexe, j'espere avoir été assez clair !
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Metal Slug bientot sur PC Engine !
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
drfloyd a écrit:Metal Slug bientot sur PC Engine !
ça serait un vrai reve !
refaire seulement le niveau 1 sur pce ça serait possible, il y aurait beaucoup de boulot.
mais j'ai peur qu'il faille faire des grosses concessions sur le jeu, du genre zapper le scrolling et faire ecran par ecran, comme pour gryzor sur CPC, et aussi avoir moins d'animations du héros.
à la fin ça ne serait plus trop le meme jeu.... mais ça serait quand meme génial
Re: (cours 4) Programmer sur PcEngine, c'est facile !
le gros soucis sera le scrolling en effet... impossible à mon sens d'avoir le meme rendu que sur NeoGeo.
C'est possible avec un scrolling en remodelant tous les graphismes sauce "8bit et demi", avec des décors épurés.
C'est possible avec un scrolling en remodelant tous les graphismes sauce "8bit et demi", avec des décors épurés.
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Le soucis ne serrait pas que sur PCE, car il faudrait une très grosse cartouche, et faire bcp de concessions sur les anims et les sprites à l'écran .
Franchement les MS sont infaisables sur console 16 bits de salon sans pertes massives, vu que le gros attrait du jeu ce sont les sprites colossaux et nombreux mixés à des patterns d'anims super chiadés en plus d'être en très grand nombre,et je parle même pas du nombre de couleurs,c'est à mon avis pour ça qu'aucune version 16 bits n'existe .
Donc quitte à tout retravailler, autant faire un jeu nouveau qui exploite la machine.
Sinon super tuto F.L
Franchement les MS sont infaisables sur console 16 bits de salon sans pertes massives, vu que le gros attrait du jeu ce sont les sprites colossaux et nombreux mixés à des patterns d'anims super chiadés en plus d'être en très grand nombre,et je parle même pas du nombre de couleurs,c'est à mon avis pour ça qu'aucune version 16 bits n'existe .
Donc quitte à tout retravailler, autant faire un jeu nouveau qui exploite la machine.
Sinon super tuto F.L
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
le C sur PC Engine c'est pratique, mais ça ne marche que pour des toute petite démo
dès que vous allez vouloir ajouter beaucoup de graphisme et des grandes map vous allez être ultra limité par la mémoire disponible et les bank de 8ko
la librairie HuC prend beaucoup de place et faire de bankswitching de 8ko en C ça va vite être très contraignant
dès que vous allez vouloir ajouter beaucoup de graphisme et des grandes map vous allez être ultra limité par la mémoire disponible et les bank de 8ko
la librairie HuC prend beaucoup de place et faire de bankswitching de 8ko en C ça va vite être très contraignant
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Oui le C n'est pas génial, et Huc n'est absolument pas fait pour de gros projets (dixit son auteur), il a été fait à la base pour mettre les gens à l'étrier pour ensuite passer à l'ASM .
Mais y'a pas mal de jeux hombrews qui sont sont sortis et 100% C et d'autres en cours de dev.
Cependant la nouvelle version peut permettre d'aller bcp plus loin, mais bon même en ASM faut oublier MS .
Mais y'a pas mal de jeux hombrews qui sont sont sortis et 100% C et d'autres en cours de dev.
ATLANTEAN : Aetherbyte : Action/Shooting
BARBARIAN : F.L : Beat 'em up conversion
BUG HUNT : Cabbage : Action
HYPERNOVA BLAST : Mindrec : Shooting
INSANITY : Aetherbyte : Action (pressed CD)
INSANTATY : Aetherbyte : Action (Free ISO)
MYSTERIOUS SONG : Frozen Utopia : RPG (pressed CD)
PROTOCADE : Aetherbyte : Action/Compilation (AbCARD)
PYRAMID PLUNDER : Aetherbyte : Action (pressed CD)
REFLECTRON : Aetherbyte : Action (Free download)
REVIVAL CHASE : BFG : Action (comes bundled with Revival magazine) (pressed CD)
SANTATLANTEAN : Aetherbyte : Shooting (Free download)
Cependant la nouvelle version peut permettre d'aller bcp plus loin, mais bon même en ASM faut oublier MS .
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
heuuu t'est sur que MYSTERIOUS SONG est en C ?
ça me parait tellement impossible de gerer des maps et la complexité d'un RPG avec HuC
ça me parait tellement impossible de gerer des maps et la complexité d'un RPG avec HuC
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Je me permet une correction, il faut utiliser un et logique pour tester les contrôles, pas une égalité (if(joy(0)&(JOY_LEFT)) {blah}). Sinon il risque fort de se passer d'étranges choses
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: (cours 4) Programmer sur PcEngine, c'est facile !
pour les controles le code est le meme que dans mes barbarian sur pce,,donc il marche. mais je testerais quand meme pour voir avec un &
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Sur à 100% son auteur ne code qu'en C .Orion_ a écrit:heuuu t'est sur que MYSTERIOUS SONG est en C ?
ça me parait tellement impossible de gerer des maps et la complexité d'un RPG avec HuC
@F.L: pour les tests hpman à raison car la fonction joy(0) te revoie toute l'entrée pad dans une même valeur(chaque bit correspond à une entrée)
Donc si tu veux tester une valeur en particulier il faut faire un &
Sinon avec un = tu peux pas tester un appuis sur I ou II pendant que tu avances par exemple,mais ça marche si seul I ou II sont pressés .
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Ok je vais tester ça et mettre à jour le cours.
C'est ballo d'apprendre ça maintenant alors que j'ai fini les remakes de barbarian
Enfin, tu me diras, ils fonctionnent tres bien au niveau pad. Va comprendre ginette !
C'est ballo d'apprendre ça maintenant alors que j'ai fini les remakes de barbarian
Enfin, tu me diras, ils fonctionnent tres bien au niveau pad. Va comprendre ginette !
Re: (cours 4) Programmer sur PcEngine, c'est facile !
salut
je viens d'editer le cours, avec les & à la place des ==
par contre, le & ne marche pas pour l'appui simultané entre deux touches du genre:
if ( joy( 0 ) & (JOY_A | JOY_B )) { temps = 0; }
car il suffit qu'on ne touche à une seule touche pour que ça remette le temps à zero
pourquoi ?
je viens d'editer le cours, avec les & à la place des ==
par contre, le & ne marche pas pour l'appui simultané entre deux touches du genre:
if ( joy( 0 ) & (JOY_A | JOY_B )) { temps = 0; }
car il suffit qu'on ne touche à une seule touche pour que ça remette le temps à zero
pourquoi ?
Re: (cours 4) Programmer sur PcEngine, c'est facile !
En tout cas c'est une bonne idée d'utiliser le pixel art de Metal Slug pour motiver les gens, ca donne forcement envie.
upsilandre- Interne
- Nombre de messages : 5138
Age : 49
Localisation : val de marne 94
Date d'inscription : 31/05/2015
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Tente :
Explicassion :
joy(0) doit te renvoyer l'état du contrôleur joypad. C'est un octet dont chaque bit est à 1 si le bouton correspondant est appuyé, 0 sinon.
Par exemple, de mémoire, le contrôleur joypad de la MD (mais je me plante certainement, de toutes façons c'est certainement pas cette forme là sur PCE mais c'est le même principe) c'est quelque chose comme :
Si tu appuies sur A+B, tu obtiens
JOY_A, JOY_B sont des constantes qui valent l'état de cet octet contrôleur si seulement A (resp. B) est appuyé :
Quand tu fais un | entre deux octets, tu obtiens un octet où les bits sont à 1 si l'un des deux, ou les deux bits correspondants dans les deux octets sont à 1 :
Quand tu fais un & entre deux octets, tu obtiens un octet dont les bits sont à 1 lorsque les deux bits correspondants sont à 1. Autrement dit on s'en sert pour effacer les bits qui ne servent pas. Quand tu fais :
tu récupères un octet de la forme 00AB0000 qui contient l'état des boutons A et B et rien d'autre.
Donc si t'appuies sur A et pas B, tu as :
si ton test est uniquement :
ça revient au même que d'écrire :
le test réussit si le résultat n'est pas 0, donc là il passe.
Toi tu vérifier que les 2 bits de A et B sont à 1, donc un simple test de non-nullité ne suffit pas. Tu dois donc taper :
Attention ça devient technique :
Tu aurais aussi pu faire :
car le && est différent du & : il ne fait pas une opération bit à bit, mais regarde si les deux conditions sont vraies simultanément.
C'est peut-être plus clair de cette façon, mais c'est un chouilla moins efficace, déjà parce que tu appelles deux fois la fonction joy.
Ce serait plus rapide d'écrire :
Bon la fin c'est pas forcément nécessaire à comprendre quand on débute, mais les opérations sur les bits et les résultats d'un test où tu mets pas de == ou de !=, c'est très courant (surtout en programmation console).
- Code:
if ( joy(0) & (JOY_A | JOY_B ) == JOY_A | JOY_B) {
temps = 0;
}
Explicassion :
joy(0) doit te renvoyer l'état du contrôleur joypad. C'est un octet dont chaque bit est à 1 si le bouton correspondant est appuyé, 0 sinon.
Par exemple, de mémoire, le contrôleur joypad de la MD (mais je me plante certainement, de toutes façons c'est certainement pas cette forme là sur PCE mais c'est le même principe) c'est quelque chose comme :
- Code:
S0CABRLDU
S = Start
A, B, C : les boutons
U, D, L, R : haut bas gauche droite
Si tu appuies sur A+B, tu obtiens
- Code:
00110000 -> 0x30 = 48
JOY_A, JOY_B sont des constantes qui valent l'état de cet octet contrôleur si seulement A (resp. B) est appuyé :
- Code:
JOY_A = 00100000 = 0x20 = 32
JOY_B = 00010000 = 0x10 = 16
Quand tu fais un | entre deux octets, tu obtiens un octet où les bits sont à 1 si l'un des deux, ou les deux bits correspondants dans les deux octets sont à 1 :
- Code:
JOY_A : 00100000
JOY_B : 00010000
JOY_A | JOY_B : 00110000
Quand tu fais un & entre deux octets, tu obtiens un octet dont les bits sont à 1 lorsque les deux bits correspondants sont à 1. Autrement dit on s'en sert pour effacer les bits qui ne servent pas. Quand tu fais :
- Code:
joy(0) & (JOY_A | JOY_B)
tu récupères un octet de la forme 00AB0000 qui contient l'état des boutons A et B et rien d'autre.
Donc si t'appuies sur A et pas B, tu as :
- Code:
joy(0) : 00100000
JOY_A | JOY_B : 00110000
joy(0) & (JOY_A | JOY_B) : 00100000
si ton test est uniquement :
- Code:
if (joy(0) & (JOY_A | JOY_B))
ça revient au même que d'écrire :
- Code:
if (joy(0) & (JOY_A | JOY_B) != 0)
le test réussit si le résultat n'est pas 0, donc là il passe.
Toi tu vérifier que les 2 bits de A et B sont à 1, donc un simple test de non-nullité ne suffit pas. Tu dois donc taper :
- Code:
if (joy(0) & (JOY_A | JOY_B) == JOY_A | JOY_B)
Attention ça devient technique :
Tu aurais aussi pu faire :
- Code:
if ((joy(0) & JOY_A) && (joy(0) & JOY_B))
car le && est différent du & : il ne fait pas une opération bit à bit, mais regarde si les deux conditions sont vraies simultanément.
C'est peut-être plus clair de cette façon, mais c'est un chouilla moins efficace, déjà parce que tu appelles deux fois la fonction joy.
Ce serait plus rapide d'écrire :
- Code:
j = joy(0);
if ((j & JOY_A) && (j & JOY_B))
Bon la fin c'est pas forcément nécessaire à comprendre quand on débute, mais les opérations sur les bits et les résultats d'un test où tu mets pas de == ou de !=, c'est très courant (surtout en programmation console).
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Bon la réponse de tryphon à l'air très complète (trop peut être ?)par contre, le & ne marche pas pour l'appui simultané entre deux touches du genre:
if ( joy( 0 ) & (JOY_A | JOY_B )) { temps = 0; }
car il suffit qu'on ne touche à une seule touche pour que ça remette le temps à zero
pourquoi ?
sinon & ou | font des opérations binaires, donc il faut penser en binaire, et non en valeur décimale .
En gros JOY_A va avoir un bit qui lui est propre,et JOY_B un autre .
Si on dit que le bit 0 correspond à JOY_A et le 1 à JOY_B on aura comme valeur:
si on presse seuleument JOY_A alors bit 0 = 1 => valeur décimale= 1
si on presse seuleument JOY_B alors bit 1 = 1 => valeur
décimale = 2
si on presse JOY_A et JOY_B alors bit 0 = 1 et bit 1 = 1
=> valeur décimale = 3
Donc tu peux voir que tu as 0 seulement quand aucun bouton n'est pressé,et dans ce cas il faut bien mettre un == et pas un & car tu testes la pression sur les 2 boutons .
Pour ton cas il faudrait faire:
- Code:
if ( joy( 0 ) == (JOY_A | JOY_B ) ) { temps = 0; }
Donc le & est la bonne méthode pour tester 1 seule entrée .
Et donc c'est pareil pour les autres tests avec haut,bas,etc ..
Dernière édition par TOUKO le Mar 16 Mai 2017 - 9:49, édité 1 fois
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
J'ai essayé de détailler la signification de JOY_A et JOY_B (ce sont des masques, des entiers dont l'écriture binaire est à 1 sur ce qu'on veut garder et 0 sur ce qu'on veut ignorer) et ce qu'on obtenait quand on faisait un & avec joy(0) parce que la technique de masquer des bits se retrouve un peu partout en prog bas niveau.
Au passage, la confusion entre & et && en C (parce que c'est un peu ça aussi son erreur : il a pensé "&" comme "et", alors que c'est "et bit à bit", le vrai "et logique" c'est &&) c'est un classique. Perso je la fais au moins une fois par semaine (python, toujours lui, est mieux foutu, il utilise "&" et "and").
Au passage, la confusion entre & et && en C (parce que c'est un peu ça aussi son erreur : il a pensé "&" comme "et", alors que c'est "et bit à bit", le vrai "et logique" c'est &&) c'est un classique. Perso je la fais au moins une fois par semaine (python, toujours lui, est mieux foutu, il utilise "&" et "and").
Tryphon- Docteur *
- Nombre de messages : 26166
Age : 47
Localisation : Un peu plus à l'Ouest
Date d'inscription : 23/07/2016
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Oui c'est vrai la confusion entre le & binaire et le logique est fréquente .
D'ailleurs j'y avais même pas pensé à cette probable confusion .
D'ailleurs j'y avais même pas pensé à cette probable confusion .
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
TOUKO a écrit:
Donc tu peux voir que tu as 0 seulement quand aucun bouton n'est pressé,et dans ce cas il faut bien mettre un == et pas un & car tu testes la pression sur les 2 boutons .
Pour ton cas il faudrait faire:
- Code:
if ( joy( 0 ) == (JOY_A | JOY_B ) ) { temps = 0; }
Donc le & est la bonne méthode pour tester 1 seule entrée .
Ça pose le même problème, ça ne marchera pas si le joueur appuie sur autre chose en même temps (une touche de direction pour avancer par exemple).
Hpman- Patient contaminé
- Nombre de messages : 679
Age : 47
Localisation : Lille
Date d'inscription : 22/08/2014
Re: (cours 4) Programmer sur PcEngine, c'est facile !
C'est vrai, il faut faire le test complet:
- Code:
if ( joy( 0 ) & (JOY_A | JOY_B ) == (JOY_A | JOY_B ) ) { temps = 0; }
Invité- Invité
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Merci à vous trois pour toutes ces precisions !
Mon prochain numéro du tuto sera sur les if, j'integrerais ceci
Sinon, est ce qu'il y a encore des debutants qui ont testé ce nouveau cours ?
J'aimerais savoir si je suis resté clair car ce cours là ça commence à faire reflechir
Mon prochain numéro du tuto sera sur les if, j'integrerais ceci
Sinon, est ce qu'il y a encore des debutants qui ont testé ce nouveau cours ?
J'aimerais savoir si je suis resté clair car ce cours là ça commence à faire reflechir
Re: (cours 4) Programmer sur PcEngine, c'est facile !
le débutant doit commencer à avoir un peu mal au crane
Qu'il ne se décourage pas, et qu'il retape 5ou 10 x le code, il finira par tout comprendre et il sortira ensuite ce code comme il écrit ou parle... Deja si vous arrivez à maitriser les 4 premiers chapitres, le plus dur est presque passé, car vous etes en train de comprendre la programmation, et c'est l'étape décisive à passer.
Qu'il ne se décourage pas, et qu'il retape 5ou 10 x le code, il finira par tout comprendre et il sortira ensuite ce code comme il écrit ou parle... Deja si vous arrivez à maitriser les 4 premiers chapitres, le plus dur est presque passé, car vous etes en train de comprendre la programmation, et c'est l'étape décisive à passer.
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
j'ai publié le cours, surtout si je fais les boulettes de recopie dites le moi
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Je commence me mettre doucement au c.
je vais garder c'es cour sous le coude pour peu être de futur projet
en tout cas merci pour toute ces infos
je vais garder c'es cour sous le coude pour peu être de futur projet
en tout cas merci pour toute ces infos
kikich- Patient en incubation
- Nombre de messages : 92
Age : 46
Localisation : Romilly sur seine
Date d'inscription : 06/02/2015
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Merci ! En effet, c'est un super outil pour se mettre au C .
Meme si le principal est là, il manque qq infos encore. Comme les conditions. Il faudra que je trouve le temps de la rajouter !
@+
Meme si le principal est là, il manque qq infos encore. Comme les conditions. Il faudra que je trouve le temps de la rajouter !
@+
Re: (cours 4) Programmer sur PcEngine, c'est facile !
je suis surprit par la faciliter d'importer des images. une simple image pcx suffi
kikich- Patient en incubation
- Nombre de messages : 92
Age : 46
Localisation : Romilly sur seine
Date d'inscription : 06/02/2015
Re: (cours 4) Programmer sur PcEngine, c'est facile !
kikich a écrit:je suis surprit par la faciliter d'importer des images. une simple image pcx suffi
c'est plus cool que sur Megadrive
_______________________________________________________
Re: (cours 4) Programmer sur PcEngine, c'est facile !
Et surtout, pas de librairie à charger, ce qui rebute souvent le débutant...
Tout est compris en local dans un petit dossier qui peut par exemple etre executé sur une clé usb.
Tout est compris en local dans un petit dossier qui peut par exemple etre executé sur une clé usb.
Page 1 sur 2 • 1, 2
Sujets similaires
» [cours 3 ] Programmer sur PCengine, c'est facile
» [COURS 1] Coder sur PCengine, c'est facile !
» [COURS 2] Coder sur PCengine, c'est facile !
» [RECH] PcEngine LT Boxed + pcengine GT boxed + Coryoon
» Cest grave docteur?
» [COURS 1] Coder sur PCengine, c'est facile !
» [COURS 2] Coder sur PCengine, c'est facile !
» [RECH] PcEngine LT Boxed + pcengine GT boxed + Coryoon
» Cest grave docteur?
Page 1 sur 2
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum