Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Tutoriels d'utilisation de gint (commentaires)
Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

Tutoriels d'utilisation de gint (commentaires)

Posté le 15/07/2017 13:54

Les tutoriels d'utilisation de gint sont sur ce topic.

Pour garder les tutoriels ensemble dans les posts du topic d'origine (et surtout pas créer un topic par tuto...), je vous propose de poster vos questions/commentaires/etc ici. Merci !


Précédente 1, 2, 3 ··· 10 ··· 13, 14, 15, 16, 17, 18, 19, 20 ··· 25, 26, 27 Suivante
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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 :
def convert_mt(input_name, output, params, target):
    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 ^^')
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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 :

struct mutation_table {
    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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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)
    int table[4][8];
    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 :
void init_mat(int x, int y, int dest[][x], int src[][x])
{
    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 :
    dclear(C_WHITE);
    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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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)
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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 !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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à
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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 rtc_key(void)
{
    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 :
void analyze_input(struct game *game, const int last_key)
{
    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 :
void main_loop(void)
{
    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 !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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 :
import 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… :
[sha-chan@Kili project]$ fxsdk build-fx
[ 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

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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à.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

Citer : Posté le 04/07/2021 18:00 | #


Ok, merci beaucoup ! Je te redis si c'était bien ça
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Loieducode Hors ligne Membre Points: 192 Défis: 6 Message

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)?
Trickswriting(sort le 1er avril):
   100%
Lephenixnoir En ligne Administrateur Points: 24673 Défis: 170 Message

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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Shadow15510 Hors ligne Administrateur Points: 5504 Défis: 18 Message

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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Wsedcft Hors ligne Membre Points: 104 Défis: 0 Message
Loieducode Hors ligne Membre Points: 192 Défis: 6 Message

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)
Trickswriting(sort le 1er avril):
   100%
Précédente 1, 2, 3 ··· 10 ··· 13, 14, 15, 16, 17, 18, 19, 20 ··· 25, 26, 27 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 129 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