Posté le 28/10/2020 14:56
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 67 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 30/10/2020 16:27 | #
Ah c'est un problème de name mangling. Les en-têtes de gint ne sont pas gardés avec le extern "C", mais tu peux t'en sortir sans trop de difficultés.
#include <gint/keyboard.h>
#include <gint/display.h>
}
Tu peux trouver facilement des infos sur ce problème avec les termes que je t'ai donnés.
Citer : Posté le 30/10/2020 16:55 | #
a oui... j'ai déjà utilisé ça avec lua 5.1
Ajouté le 30/10/2020 à 16:56 :
en effet ça marche, mes projets vont aller plus vite
(au sens que j'airais moins de problèmes)
Citer : Posté le 30/10/2020 16:59 | #
Tant mieux si ça aide ! Normalement le runtime C++ est pas trop exigeant, mais si tu vois des bugs du genre « constructeurs pas appelés pour des objets globaux » qui semblent contrevenir aux règles de C++ il se peut qu'un ajout dans gint soit nécessaire. Dans ce cas je regarderai.
Ah oui, les exceptions ne marcheront pas je pense.
Citer : Posté le 30/10/2020 17:30 | #
c'est pas grave j'ai jamais utilisé les exceptions en c++
Ajouté le 30/10/2020 à 18:18 :
le jeu avance j'ai converti mon programme en c++, mais le joueur ne s'affiche plus!
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;
class Animation{
public:
int frame_1;
int frame_2;
int frame_3;
int frame_4;
int frame_5;
int get_data(int frame){
int f;
if(frame==0){f=frame_1;}
if(frame==1){f=frame_2;}
if(frame==2){f=frame_3;}
if(frame==3){f=frame_4;}
if(frame==4){f=frame_5;}
return f;
}
};
class Player{
public:
/* Position in map */
int x, y;
/* Direction currently facing */
int dir;// 0: left, 1: right
//int animdata[10][5][2];
Animation anim_walk_left;
Animation anim_walk_right;
/* Animation and frame */
Animation anim_playing;
int twait;
int frame;
int anim;
int status; //1: normal, 2: roket, 3: code manipulation
void init(){
anim_walk_right = {0,1,2,3,4};
anim_walk_left = {5,6,7,8,9};
anim_playing = anim_walk_right;
status = 1;
dir = 1;
}
void check_anim(){
if(status==1){
if(dir==0){anim_playing = anim_walk_left;}
if(dir==1){anim_playing = anim_walk_right;}
}
if(twait == 15){
twait = 0;
frame = frame + 1;
if(frame > 4){
frame = 0;
}
}
twait = twait + 1;
anim = anim_playing.get_data(frame);
}
void print(){
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
}
};
//int opt = GETKEY_DEFAULT & GETKEY_REP_ARROWS;
int select = 1;
int main(void){
extern bopti_image_t img_logo;
extern bopti_image_t img_button;
int playing = 1;
int key = 0;
Player player;
player.init();
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;
while(playing==1){
while(key != KEY_SHIFT){
dclear(C_WHITE);
dimage(25, 3, &img_logo);
//dsubimage(40, 40,&img_player,0* 11, 0, 11, 11, DIMAGE_NONE);
if(select==1){dsubimage(35, 33,&img_button,0, 10, 42, 10, DIMAGE_NONE);}
else{dsubimage(35, 33,&img_button,0, 0, 42, 10, DIMAGE_NONE);}
if(select==2){dsubimage(35, 45,&img_button,0, 30, 42, 10, DIMAGE_NONE);}
else{dsubimage(35, 45,&img_button,0, 20, 42, 10, DIMAGE_NONE);}
dupdate();
key = getkey_opt(opt, NULL).key;
if(key == KEY_UP){select=1;}
if(key == KEY_DOWN){select=2;}
}
while(1==1){
dclear(C_WHITE);
player.check_anim();
player.print();
dupdate();
key = getkey_opt(opt, NULL).key;
if(key == KEY_RIGHT){player.x = player.x + 2;}
if(key == KEY_LEFT){player.x = player.x - 2;}
if(key == KEY_UP){player.y = player.y - 2;}
if(key == KEY_DOWN){player.y = player.y + 2;}
}
}
return 1;
}
Citer : Posté le 30/10/2020 18:19 | #
Beau travail ! As-tu réduit le code ? Vérifié que l'appel à dsubimage() est appelé ? Qu'elle est appelée avec des paramètres qui sont dans les bornes de l'image ? etc etc.
Citer : Posté le 30/10/2020 18:22 | # |
Fichier joint
oui tout est bon
voici l'image en fichier joint
Citer : Posté le 30/10/2020 18:25 | #
Alors si c'est bon écris un mini-programme qui affiche cette image toute seule avec les mêmes coordonnées et les mêmes valeurs que dans le gros programme ci-dessus, et soumets un rapport de bug à gint.
Citer : Posté le 30/10/2020 18:26 | #
ok...
Ajouté le 31/10/2020 à 14:17 :
je fais pause sur le développement car je fais des trucks mais ça marche pas
Ajouté le 01/11/2020 à 16:26 :
j'ai bien testé dsubimage et il marche plus...
Citer : Posté le 01/11/2020 16:34 | #
Encore une fois, c'est tout à fait possible, mais je ne peux tester que si tu me fournis ton appel exact, du genre
Avec une copie de l'image.
Citer : Posté le 01/11/2020 16:38 | # |
Fichier joint
y = 0;
anim = 0;
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
Citer : Posté le 01/11/2020 16:44 | # |
Fichier joint
Merci ! Ça c'est super utile, ça me permet de tester immédiatement et de m'attaquer au bug s'il y en a un. Pour l'instant j'ai testé dans un add-in vide et ça marche de mon côté (j'ai bien le joueur qui s'affiche). Projet ci-joint. Qu'est-ce que tu observes et qu'est-ce que tu voudrais observer ? Est-ce que tu as bien appelé dupdate() à la fin ?
PS. Je te l'ai déjà dit mais les GIFs tordus ne sont pas bienvenus en avatars.
Citer : Posté le 01/11/2020 18:05 | #
Est-ce que tu as bien appelé dupdate() à la fin ?
apeller?
Citer : Posté le 01/11/2020 18:12 | #
Permet de mettre à jour l'écran de ta calculatrice. Pour par exemple afficher une image
Tu as juste besoin de le mettre à la fin de ta boucle par exemple.
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 01/11/2020 18:20 | #
oui je l'ai mis, voici mon code
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;
class Animation{
public:
int frame_1;
int frame_2;
int frame_3;
int frame_4;
int frame_5;
int get_data(int frame){
int f;
if(frame==0){f=frame_1;}
if(frame==1){f=frame_2;}
if(frame==2){f=frame_3;}
if(frame==3){f=frame_4;}
if(frame==4){f=frame_5;}
return f;
}
};
class Player{
public:
/* Position in map */
int x, y;
/* Direction currently facing */
int dir;// 0: left, 1: right
//int animdata[10][5][2];
Animation anim_walk_left;
Animation anim_walk_right;
/* Animation and frame */
Animation anim_playing;
int twait;
int frame;
int anim =0;
int status; //1: normal, 2: roket, 3: code manipulation
void init(){
anim_walk_right = {0,1,2,3,4};
anim_walk_left = {5,6,7,8,9};
anim_playing = anim_walk_right;
status = 1;
dir = 1;
}
void check_anim(){
if(status==1){
if(dir==0){anim_playing = anim_walk_left;}
if(dir==1){anim_playing = anim_walk_right;}
}
if(twait == 15){
twait = 0;
frame = frame + 1;
if(frame > 4){
frame = 0;
}
}
twait = twait + 1;
anim = anim_playing.get_data(frame);
}
void print(){
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
}
};
int select = 1;
int main(void){
extern bopti_image_t img_logo;
extern bopti_image_t img_button;
int playing = 1;
int key = 0;
Player player;
player.init();
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;
while(playing==1){
while(key != KEY_SHIFT){
dclear(C_WHITE);
dimage(25, 3, &img_logo);
//dsubimage(40, 40,&img_player,0* 11, 0, 11, 11, DIMAGE_NONE);
if(select==1){dsubimage(35, 33,&img_button,0, 10, 42, 10, DIMAGE_NONE);}
else{dsubimage(35, 33,&img_button,0, 0, 42, 10, DIMAGE_NONE);}
if(select==2){dsubimage(35, 45,&img_button,0, 30, 42, 10, DIMAGE_NONE);}
else{dsubimage(35, 45,&img_button,0, 20, 42, 10, DIMAGE_NONE);}
dupdate();
key = getkey_opt(opt, NULL).key;
if(key == KEY_UP){select=1;}
if(key == KEY_DOWN){select=2;}
}
if(select==1){
while(key != KEY_SHIFT){
dclear(C_WHITE);key = getkey_opt(opt, NULL).key;
dsubimage(20, 15,&img_button,0, 50, 42, 10, DIMAGE_NONE);
dupdate();
key = getkey_opt(opt, NULL).key;
}
while(1==1){
player.check_anim();
dclear(C_WHITE);
player.print();
dupdate();
key = getkey_opt(opt, NULL).key;
if(key == KEY_RIGHT){player.x = player.x + 2;}
if(key == KEY_LEFT){player.x = player.x - 2;}
if(key == KEY_UP){player.y = player.y - 2;}
if(key == KEY_DOWN){player.y = player.y + 2;}
}
}
if(select==2){
while(1==1){
dclear(C_WHITE);
player.print();
dupdate();
}
}
}
return 1;
}
Citer : Posté le 01/11/2020 18:31 | #
Pas ton code complet, ton code minimal ! Celui où les coordonnées sont explicites.
Citer : Posté le 01/11/2020 20:44 | #
ça va être un peu dur
Ajouté le 01/11/2020 à 20:45 :
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gint/timer.h>
#include <gint/clock.h>
}
extern bopti_image_t img_player;
class Animation{
public:
int frame_1;
int frame_2;
int frame_3;
int frame_4;
int frame_5;
int get_data(int frame){
int f;
if(frame==0){f=frame_1;}
if(frame==1){f=frame_2;}
if(frame==2){f=frame_3;}
if(frame==3){f=frame_4;}
if(frame==4){f=frame_5;}
return f;
}
};
class Player{
public:
/* Position in map */
int x, y;
/* Direction currently facing */
int dir;// 0: left, 1: right
//int animdata[10][5][2];
Animation anim_walk_left;
Animation anim_walk_right;
/* Animation and frame */
Animation anim_playing;
int twait;
int frame;
int anim =0;
int status; //1: normal, 2: roket, 3: code manipulation
void init(){
anim_walk_right = {0,1,2,3,4};
anim_walk_left = {5,6,7,8,9};
anim_playing = anim_walk_right;
status = 1;
dir = 1;
}
void check_anim(){
if(status==1){
if(dir==0){anim_playing = anim_walk_left;}
if(dir==1){anim_playing = anim_walk_right;}
}
if(twait == 15){
twait = 0;
frame = frame + 1;
if(frame > 4){
frame = 0;
}
}
twait = twait + 1;
anim = anim_playing.get_data(frame);
}
void print(){
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
}
};
int select = 1;
int main(void){
extern bopti_image_t img_logo;
extern bopti_image_t img_button;
int playing = 1;
int key = 0;
Player player;
player.init();
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS & GETKEY_MENU;
while(1==1){
player.check_anim();
dclear(C_WHITE);
player.print();
dupdate();
key = getkey_opt(opt, NULL).key;
if(key == KEY_RIGHT){player.x = player.x + 2;}
if(key == KEY_LEFT){player.x = player.x - 2;}
if(key == KEY_UP){player.y = player.y - 2;}
if(key == KEY_DOWN){player.y = player.y + 2;}
}
return 1;
}
Citer : Posté le 01/11/2020 20:55 | #
Do you set the player's position to (0, 0) in Player::init? Player.x and Player.y aren't guaranteed to be 0 if you only declare them.
Citer : Posté le 02/11/2020 07:36 | #
je vais tester,mais voici la compilation:
:: Making into build-fx
sh-elf-g++ -c src/main.c -o build-fx/src/main.c.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Wno-missing-field-initializers -Os -D FX9860G -m3 -I include -MMD -MT build-fx/src/main.c.o -MF build-fx/src/main.c.d -MP
src/main.c: In function 'int main()':
src/main.c:68:14: warning: 'f' may be used uninitialized in this function [-Wmaybe-uninitialized]
68 | anim = anim_playing.get_data(frame);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.c:18:13: note: 'f' was declared here
18 | int f;
| ^
fxconv --bopti-image assets-fx/img/player.png -o build-fx/assets/img/player.png.o --fx --toolchain=sh-elf name:img_player
sh-elf-g++ -o build-fx/link.elf build-fx/src/main.c.o build-fx/assets/img/button.png.o build-fx/assets/img/logo.png.o build-fx/assets/img/player.png.o -mb -ffreestanding -nostdlib -fstrict-volatile-bitfields -Wall -Wextra -Wno-missing-field-initializers -Os -D FX9860G -m3 -I include -T fx9860g.ld -lgint-fx -lgint-fx -lgcc -Wl,-Map=build-fx/map
sh-elf-objcopy -O binary -R .bss -R .gint_bss build-fx/link.elf build-fx/link.bin
fxg1a build-fx/link.bin -o link.g1a -i "assets-fx/icon-fx.png" -n "link" --internal="@link"
Ajouté le 02/11/2020 à 08:02 :
après test, l'affichage isolé marche, mais pas dans la boucle de déplacement
Citer : Posté le 02/11/2020 14:45 | #
Voilà qui progresse significativement ! Tu as un warning sur une variable non initialisée, a priori sans rapport, mais pense à t'en défaire.
As-tu affiché les coordonnées où tu affiches ton joueur à l'écran ? Tu peux le faire de façon un peu bourrinne comme ceci :
dsubimage(x, y,&img_player,0,anim*12,11, 11, DIMAGE_NONE);
dprint(1, 50, C_BLACK, "x=%d y=%d", x, y);
}
Citer : Posté le 02/11/2020 18:08 | #
ok je vais tester
Ajouté le 02/11/2020 à 18:24 :
j'essaye de le faire mais j'arrive pas a convertir mes int en const char * pour les afficher
Ajouté le 03/11/2020 à 07:29 :
le bug est trouvé, la variable anim est dans les 210000
mais je ne comprends pas pourquoi
(peu-être dans l'initialisation des valeurs de l'animation right)
Citer : Posté le 03/11/2020 09:26 | #
j'essaye de le faire mais j'arrive pas a convertir mes int en const char * pour les afficher
C'est un problème classique. Et le premier conseil que je peux donner c'est de ne jamais dire "convertir" parce que dès qu'on prononce ce mot magique on se fait aveugler par l'idée que ça doit être simple, automatique, et bijectif. Et souvent ce n'est pas le cas.
Tu as un int qui est un nombre encodé en base 2 sur 4 octets. Tu veux un const char * qui pointe vers une zone de mémoire contenant une représentation textuelle de cet entier en base 10, sur autant d'octets qu'il y a de chiffres, avec un octet 0 à la fin (pour indiquer la fin du texte).
Tu n'es pas obligé de comprendre tout ce qui se passe, mais tu dois remarquer que :
1. On passe de la base 2 à la base 10.
2. Il faut obtenir ou fournir de la mémoire pour stocker le texte.
3. On passe de 4 octets à un nombre variable (entre 2 et 12 selon le nombre de chiffres dans le résultat).
Toutes ces différences te montrent que cette action de représenter un entier par du texte est difficile et donc ça ne peut pas être automatique comme en écrivant juste (const char *)mon_entier (ce qui est faux).
Si tu as déjà codé en C tu sauras que la fonction printf() sait faire cette représentation, avec ses formats qui ressemblent à "x=%d" où le %d se fait remplacer par la représentation textuelle d'en entier.
gint n'as pas de terminal mais il y a une fonction dprint() qui fait pareil, et je t'ai montré à l'instant comment t'en servir pour afficher des entiers :
Bravo ! Voilà en quoi ça consiste, le debuggage : vérifier progressivement que tout se comporte correctement jusqu'à isoler quelque chose qui ne marche pas.
Voilà un indice : l'attribut frame de ton animation n'est pas initialisé, donc ton anim_playing.get_data(frame) non plus puisque dans cette méthode tu déclares une variable f mais comme frame ne vaut ni 1, ni 2, ni 3, ni 4, ni 5, tu renvoies f sans l'initialiser, et ça devient ta nouvelle valeur de anim.