Posté le 15/07/2017 13:54
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 89 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 27/05/2021 00:39 | #
Done, y'a plus qu'à update
Pour info, gint 3.5.0 nécessitant fxlibc, normalement tu n'as même pas besoin d'installer cette dépendance explicitement : elle va être directement cherchée et installée via la mise à jour de gint.
Citer : Posté le 27/05/2021 17:17 | #
Ouaip, c'est ce qu'il s'est passé, merci !
J'ai encore un problème, mais je pense que ça vient de mon de code xD j'ai le convertisseur Python :
with open(input_name, "r") as file:
# Extract informations
lines = file.read().splitlines()
mutation_matrix = [i.split(" | ") for i in lines]
# Encode information into bytes
data = bytes()
for i in mutation_matrix:
for j in i:
data += fxconv.u32(int(j))
fxconv.elf(data, output, "_" + params["name"], **target)
L'idée est de stocker les octets dans des tableaux C de 4 cases par 8 (4 cases en ordonnée et 8 en abscisse)
Quand je vais dans le menu qui est sensé être généré par les données encodées par le script la calto… s'éteint
J'ai essayé de remplacer data = fxconv.ObjectData() mais le compilo ne passe pas… De même quand je remplace data += fxconv.u32(int(j)) par data += bytes(int(j)) ça compile, mais le menu est blanc (pas affiché)
Faut-il faire subir aux données un traitement spécial du fait qu'elles seront stockées dans un tableau ? (y a une partie du tuto sur les conversions avec des pointeurs, mais j'ai pas trop compris ^^')
Citer : Posté le 27/05/2021 17:24 | #
Ça a l'air bon. Tu peux toujours afficher len(data) dans ton script pour vérifier que ça fait bien (4×8)×4 = 128 octets.
Dans le code C, tu dois bien récupérer une structure de ce genre :
int table[4][8];
};
extern struct mutation_table la_variable;
Ici, tous les octets de la structure (c'est-à-dire la valeur des entiers) sont connus à la compilation, donc il n'y a pas besoin de ObjectData(). Ce n'est nécessaire que si tu as des pointeurs, et là il n'y a que des int. Il n'y a pas de traitement spécial ; en C, un tableau c'est juste des éléments mis bout à bout (et alignés), donc ici il n'y a rien à faire.
Pour information bytes(int(j)) ça ne fait pas du tout ce que tu penses. bytes(10) ça crée une séquence de 10 octets vides. Autrement dit, si les valeurs dans ton tableau sont 12, 37 et 54, utiliser bytes(int(j)) créerait une structure de 12+37+54=103 octets, ce qui n'a rien à voir avec ce que tu veux (32 int).
Par contre, le fait que ça marche avec l'autre taille suggère que soit data n'est pas de la bonne taille dans la version que tu as postée, soit le code C s'en sert mal. Le redémarrage de la calculatrice est un crash, vérifie que ton code côté C est correct aussi.
Citer : Posté le 27/05/2021 17:55 | #
Ok !
Côté code python, toutes les tables converties sont de la bonne tailles !
Côté code C, j'ai bien une structure de cette forme… Et je m'en sert normalement : extern struct mutation_table mt_symptoms_1; (c'est une déclaration parmi les 9, mais elles sont toutes pareilles)
Ensuite que j'ai déclaré toute mes tables, je déclare un tableau (qui correspondra à la table à afficher)
if (mutation_menu == 1)
{
if (current_game->symptoms < 4) init_mat(8, 4, table, mt_symptoms_1.data);
else if (current_game->symptoms < 8) init_mat(8, 4, table, mt_symptoms_2.data);
else init_mat(8, 4, table, mt_symptoms_3.data);
}
La fonction init_mat change la valeur d'un tableau en copiant les case une à une :
{
for (int i = 0 ; i < x ; i++)
{
for (int j = 0 ; j < y ; j++)
{
dest[j][i] = src[j][i];
}
}
}
En dernière source d'erreur possible, il reste la partie affichage :
for (int i = 0 ; i < 4 ; i++)
{
for (int j = 0 ; j < 8; j++)
{
if (table[i][j]) dsubimage(i*16, j*16, &img_mutations, 16 * (mutation_menu - 1), 0, 16 * (table[i][j] - 1), 15, 15);
}
}
Dans le doute, j'ai essayé en faisant aller i de 0 à 8 et j de 0 à 4, mais même problème : la calto crash…
Citer : Posté le 27/05/2021 18:26 | # | Fichier joint
Pas de problème en vue ; ci-joint une archive qui démontre un exemple très similaire.
Ajouté le 27/05/2021 à 18:38 :
Dis donc ton dsubimage() il a des paramètres un peu douteux sur la fin, tu as un 15 en double à la place d'avoir les paramètres (DIMAGE_NONE en général)
Citer : Posté le 27/05/2021 20:50 | #
Ah oui tient, bien vu ! Ça marche bien maintenant
'fin bien, ça n'affiche rien comme prévu, mais ça affiche des trucs et ça ne crash plus !
Citer : Posté le 27/05/2021 20:53 | #
Le 15 activait DIMAGE_NOCLIP qui contient des optimisations pour les cas où les images ne dépassent pas de l'écran ; je suppose que 16 * (table[i][j] - 1) était assez grand dans certains cas pour dépasser de l'écran par la droite et poser des problèmes.
Citer : Posté le 27/05/2021 20:54 | #
Normalement non, il s'agit en fait d'une spritesheet le 16 * (table[i][j] - 1) correspond juste à un sprite c'est le 0 un peu avant sur la ligne qui n'a rien à faire là
Citer : Posté le 27/05/2021 20:57 | #
Oui, je comprends bien. C'est juste qu'à cause du 0 tous les arguments étaient décalés et du coup cette quantité était la largeur au lieu de la position verticale, donc tu affichais une sous-image de largeur variable.
Citer : Posté le 27/05/2021 21:02 | #
Ouaip !
Bon ben il ne reste plus qu'à peaufiner tout ça pour avoir ce que je veux et c'est bien partit !
Ajouté le 04/07/2021 à 09:37 :
Hey o/
Je sais pas trop si c'est un bug de Gint ou juste moi qui ne sait pas programmer xD
J'aimerais faire un bouger un petit personnage animé sur un écran, avec la répétition des touches fléchées (pour pas bourriner les touches quand on veut traverser la map)
Comme je le disait, le personnage est animé, donc j'utilise un timer et une gestion des touches en temps réel que je délègue à une fonction :
{
int opt = GETKEY_DEFAULT & ~GETKEY_MOD_SHIFT & ~GETKEY_MOD_ALPHA;
int timeout = 1;
key_event_t ev = getkey_opt(opt, &timeout);
if (ev.type == KEYEV_NONE) return 0;
return ev.key;
}
Ensuite, la touche est analysée grâce à une autre fonction :
{
game->total_tick += ENGINE_TICK;
switch (last_key)
{
case 0:
if (!(game->total_tick % 500)) game->player.animation_frame = (game->player.animation_frame + 1) % 2;
break;
case KEY_UP:
game->player.direction = UP;
game->player.map_y -= 2;
break;
case KEY_RIGHT:
game->player.direction = RIGHT;
game->player.map_x += 2;
break;
case KEY_DOWN:
game->player.direction = DOWN;
game->player.map_y += 2;
break;
case KEY_LEFT:
game->player.direction = LEFT;
game->player.map_x -= 2;
break;
}
}
Toutes ces fonctions sont appelées depuis une fonction main_loop :
{
extern const struct map_t map_one;
int key = 0;
static volatile int tick = 0;
int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000, GINT_CALL(callback_tick, &tick));
if (t >= 0) timer_start(t);
struct player player = {0, 0, 8, 0, 2, 0};
struct game game = {map_one, player, 0};
while (key != KEY_EXIT)
{
while (!tick) sleep();
tick = 0;
dclear(C_WHITE);
draw_map(game);
draw_player(game);
dupdate();
key = rtc_key();
analyze_input(&game, key);
}
if (t >= 0) timer_stop(t);
}
Maintenant le problème en lui-même : quand je presse les touches fléchées de manière discontinue tout marche très bien (le personnage bouge, l'animation de repos, la seule programmée pour l'instant, marche bien). Et quand je reste appuyé, le personnage de déplace de manière continue, sans animation (ça c'est normal), mais quand je relâche, le personnage continue de bouger, et aucune autre entrée clavier n'est gérée (je suis obligé de reset la calto pour quitter ^^')
Voila, si quelqu'un a des idées… merci d'avance !
Citer : Posté le 04/07/2021 13:14 | #
Je soupçonne que getkey_opt() génère des répétitions plus vite que tu ne les lis. Est-ce que tu peux essayer d'appuyer de façon continue mais pendant une courte période pour voir si le personnage s'arrête à un moment ?
Tu peux aussi désactiver GETKEY_REP_ARROWS dans les options de getkey_opt() pour tester cette hypothèse.
Dans tous les cas, je suggère pour du temps réel de lire les événements directement, ça te posera moins de difficultés je pense.
Citer : Posté le 04/07/2021 13:47 | #
Merci !
En désactivant GETKEY_REP_ARROWS, ça marche comme prévu : j'ai beau rester appuyé, le personnage ne bouge qu'une fois.
Entre temps, je suis parti sur un autre système qui permet une gestion plus pratique des maps : la map bouge et le personnage reste au centre, en déplaçant non pas d'un pixel, mais d'une case à chaque pression de la touche, la rémanence est très tolérable… (en fait, le gros avantage est que je n'ai qu'une seule map à faire et pas 2500 csv ^^' )
Avec ce nouveau système, les animations de marche n'auront plus trop lieu d'être je reviens ici, si je croise d'autres problème
Ajouté le 04/07/2021 à 14:25 :
Re ^^'
C'est pour les collisions, j'ai pas mal de tuiles sur lesquelles je peux marcher, et encore plus sur les quelles je ne peux pas marcher… Quand je converti le csv en objet struct map, j'utilise un convertisseur python pour fxconv :
def convert(input_name, output, params, target):
if params["custom-type"] == "map":
convert_map(input_name, output, params, target)
return 0
else:
return 1
def convert_map(input_name, output, params, target):
# Read informations
with open(input_name, "r") as file:
csv_data = file.read().splitlines()
walkable = [-1, 11, 12, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 30, 31, 37, 43, 44, 45, 62, 63, 64]
# Convertion into bytes
tiles = bytes()
collision = bytes()
for line in csv_data:
for value in line.split(","):
tiles += fxconv.u32(int(value))
collision += fxconv.u8(value in walkable)
data = fxconv.ObjectData()
data += tiles + collision
fxconv.elf(data, output, "_" + params["name"], **target)
Et le compilo me renvoie une erreur que je comprends pas… :
[ 10%] Building FXCONV object CMakeFiles/myaddin.dir/assets-fx/map/world.csv
sh-elf-objcopy: error: the input file '/tmp/tmp0t45s38s' is empty
error: objcopy returned 1
make[2]: *** [CMakeFiles/myaddin.dir/build.make:148 : CMakeFiles/myaddin.dir/assets-fx/map/world.csv] Erreur 1
make[1]: *** [CMakeFiles/Makefile2:83 : CMakeFiles/myaddin.dir/all] Erreur 2
make: *** [Makefile:91 : all] Erreur 2
Citer : Posté le 04/07/2021 14:37 | #
Je crois que c'est ce bug que j'ai corrigé il y a quelques temps. Est-ce que tu peux essayer avec la branche dev ? Si oui, je publie un patch et on n'en parle plus.
Citer : Posté le 04/07/2021 17:19 | #
Merci
J'utilise MiddleEarth ^^' Je suis pas trop sûr de moi pour ré-installer que le fxsdk ? Si c'est simple et propre, je peux essayer sinon je vais attendre la prochaine mise à jour stable
Citer : Posté le 04/07/2021 17:36 | #
Ah oui, désolé ! Bah écoute j'ai poussé le patch (version 2.5.2), si je me souviens bien le script de Darks devrait le packager plus ou moins automatiquement dans un futur proche, tu pourras tester à ce moment-là.
Citer : Posté le 04/07/2021 18:00 | #
Ok, merci beaucoup ! Je te redis si c'était bien ça
Citer : Posté le 11/07/2021 17:43 | #
J'ai une petite question stupide, comment on récupere les informations utilisateurs(celles qui s'affiche quand on éteint la calto, EDIT: sur graph 90+E)?
Citer : Posté le 11/07/2021 18:02 | #
Je ne sais pas, il y a peut-être un syscall mais un scan rapide de la liste de SimLo ne révèle rien d'évident.
Citer : Posté le 12/07/2021 08:43 | #
L'add-in Utility permet de changer ses infos (et même de retrouver/ modifier le mot de passe) donc ça doit être possible, mais je ne sais pas si le code est dispo…
Citer : Posté le 12/07/2021 09:29 | #
https://www.planet-casio.com/Fr/forums/topic13342-2-g35g75-comment-recuperer-le-nom-dutilisateur.html
Ça peut peut-être aider ?
Citer : Posté le 14/07/2021 21:33 | #
J'ai essayé de faire un truc comme Utilities(https://github.com/gbl08ma/utilities/blob/master/src/memsysGUI.cpp#L373)(ca me lache juste un your thing is: et rien d'autre)
void getUserInfo(char* output) {
char* flagpointer = (char*)0x80BE0000;
int counter = 0;
while(*flagpointer == 0x0F) {
flagpointer += 0x40;
counter++;
}
if(counter) {
flagpointer = flagpointer - 0x40;
if(*(flagpointer+0x18) != '\0') {
output = (flagpointer+0x18);
}
}
}
mais ca marche pas(meme avec un gint_world_switch)
int main(void) {
dclear(C_WHITE);
char* e = malloc(32);
for(int i = 0; i < 32; i++) *(e + i) = '\0';
gint_world_switch(GINT_CALL(getUserInfo, e));
dprint(1, 16 * 1, C_BLACK, "your thing is: %s", e);
dupdate();
getkey();
return 1;
}
(me tuez pas parceque y a une fuite de mémoire parceque je le sais déja)