Posté le 15/07/2017 13:54
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 121 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 04/05/2021 20:27 | # | Fichier joint
@Ninestars J'ai commencé à regarder pour compiler libstdc++. Mais ça dépend de beauuucoup de trucs dans la lib standard. Ce sera probablement un grind avant que j'y arrive. Je ne sais pas encore quelles sont les options, le plus direct pourrait être par exemple de ressortir newlib... c'est clairement un problème ouvert.
Citer : Posté le 04/05/2021 20:53 | #
Ok excellent, je suis allé voir les différents tuto, et c'est en effet plus actuel avec CMakeFiles.
D'accord, ça n'a pas l'air si simple, mais je sens que tu comptes surmonter le défi
Qu'est ce que tu appelles un grind ?
Citer : Posté le 04/05/2021 20:55 | #
Je vais tenter, mais disons que pour l'instant je ne sais pas si j'y arriverai ni en combien de temps (surtout vu la priorité des tâches qui passent en ce moment). Je pense que c'est faisable, mais ça me gêne de couper ton projet jusque-là.
Un grind → comme dans un jeu vidéo, long et laborieux pour obtenir toutes les fonctions (probablement).
Citer : Posté le 21/05/2021 14:25 | #
Hey o/
Je redécouvre Gint, c'est une sensation géniale
Ça me donne envie de remettre au C
Trève de rêve, j'ai quand même une remarque je sais pas si c'est juste moi, mais en lisant les tutos (surtout le 2e, mais j'ai pas encore lu le 3e) j'ai du mal à savoir dans quel fichier je dois mettre le code parfois ^^' J'arrive à m'y retrouver entre les définitions de fonctions qui ressemblent pas à des prototypes et les définitions des structures. Mais régulièrement je fouille dans les fichiers de Gitea pour être sûr…
Citer : Posté le 21/05/2021 14:27 | #
C'est vrai que ce n'est pas toujours mentionné, surtout quand c'est le code C. Je referai une passe pour préciser, merci
Citer : Posté le 21/05/2021 14:28 | #
Merci à toi !
Autre question plus tournée vers le C, certaines fonctions sont de types struct void quel intérêt par rapport à une fonction void ?
Citer : Posté le 21/05/2021 14:29 | #
struct void n'existe pas, il faudrait que tu précises.
Citer : Posté le 21/05/2021 14:30 | #
Euh ah oui pardon, static void x)
Citer : Posté le 21/05/2021 14:32 | #
Ici le static ne s'applique pas au void mais à toute la fonction. C'est une fonction qui renvoie un void, et qui prend des paramètres, et en plus de tout ça elle est statique.
Dans ce contexte, ça signifie que la fonction est invisible hors du fichier où elle est codée. C'est une sorte de fonction « privée » si tu veux. Si la fonction n'est pas statique tu peux l'appeler depuis n'importe où dans le programme, ce qui est un peu gênant parfois (pour faire les choses bien il faut un prototype, mais tu peux l'appeler même sans prototype). Il y a aussi le risque de polluer l'espace de noms : si tu mets une fonction max() dans un fichier ce nom est bloqué pour tout le reste du programme.
Citer : Posté le 21/05/2021 14:37 | #
Ok, une manière de réserver une fonction à un fichier particulier donc ?
Quand j'avais vu les structures je me souviens avoir utilisé une syntaxe avec un point pour accéder aux "attributs" ça faisait une syntaxe un peu comme ça :
{
int x, y;
};
struc ma_structure a;
a.x;
a.y;
Alors que dans le tuto tu utilises des flèches, c'est deux syntaxes qui font la même choses ou alors il y en a une qui est désuète ?
Citer : Posté le 21/05/2021 14:39 | #
C'est pas tout à fait pareil, on utilise la flèche quand on a un pointeur.
a.x;
a.y;
struct ma_structure *b = &a;
b->x; // raccourci pour (*b).x
b->y; // raccourci pour (*b).y
Citer : Posté le 21/05/2021 14:39 | #
Ah ok !
Merci !
Ajouté le 21/05/2021 à 22:14 :
Dans le second tutoriel (section Boucle de jeu principale animée), tu appelles une fonction engine_tick(&game, ENGINE_TICK); mais elle n'est pas définie dans le tutoriel… ?
Citer : Posté le 21/05/2021 22:19 | #
À la fin de cette partie, il est noté que « la fonction engine_tick() est utilisée pour faire avancer les animations du délai spécifié ». Le code est d'ailleurs dans la section d'après.
Tout le code n'est pas dans le tutoriel cela dit, ce serait beaucoup trop long : je donne les éléments principaux, mais après le reste est juste sur le dépôt. Par exemple les détails sordides du code d'animation ne sont pas pertinents dans un tutoriel gint ; il y a plein de façons de faire des animations et c'est pas pour ça que vous êtes là en général.
Citer : Posté le 21/05/2021 22:21 | #
Ah oui autant pour moi, j'avais pas vu…
Je découvre un peu tout là : animations, méthode avec les struct, conception du jeu… xD
Ajouté le 21/05/2021 à 22:56 :
J'ai encore un petit problème… ^^'
Quand je tente de compiler (fin de second tuto) j'ai une erreur au niveau de l'appel à timer_configure
Consolidate compiler generated dependencies of target myaddin
[ 14%] Building C object CMakeFiles/myaddin.dir/src/main.c.obj
/home/sha-chan/Bureau/mystere_noir_et_blanc/src/main.c:12:9: error: initializer element is not constant
12 | int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000, GINT_CALL(callback_tick, &tick));
|
Je comprends pas trop ?
Citer : Posté le 21/05/2021 23:09 | #
Cette ligne-là (ligne 12) elle n'est dans aucune fonction n'est-ce pas ?
Dans un programme C tu ne peux exécuter du code que quand tu es dans une fonction. Tu as le droit de déclarer des variables en-dehors mais dans ce cas la valeur initiale doit être une constante (c'est parce que la valeur initiale doit être déterminée à la compilation et comme le programme n'est pas encore sur la calto on ne peut pas exécuter de code).
Dans le tutoriel, le timer est créé à l'intérieur de la fonction main().
Citer : Posté le 22/05/2021 08:00 | #
Ah oui bien vu, oui je ne suis pas dans une fonction !
Ajouté le 22/05/2021 à 08:37 :
Il me reste encore des trucs que je ne comprends pas… ^^'
Consolidate compiler generated dependencies of target myaddin
[ 12%] Building C object CMakeFiles/myaddin.dir/src/main.c.obj
In file included from /home/sha-chan/Bureau/mystere_noir_et_blanc/src/main.c:6:
/home/sha-chan/Bureau/mystere_noir_et_blanc/src/engine.h:28:22: error: duplicate member 'anim'
28 | struct anim_data anim;
| ^~~~
/home/sha-chan/Bureau/mystere_noir_et_blanc/src/main.c: In function 'main':
/home/sha-chan/Bureau/mystere_noir_et_blanc/src/main.c:20:9: error: field name not in record or union initializer
20 | .anim.function = anim_player_idle,
|
Dans le fichier engine.h j'ai effectivement deux "attributs" de la structure player qui ont le même nom, mais c'est pareil dans le tuto ? Du coup je ne vois pas trop d'où vient le problème… (pour la première erreur)
Pour la seconde, je pense que si la première est réglée, ça devrait fix la seconde, mais à la limite on verra après xD
la définition de la structure player dans engine.h
{
/* Position */
int x, y;
/* Direction currently facing */
int dir;
/* Wether playing is currently idle */
int idle;
/* Animation and frame */
struct animation const *anim;
int frame;
/* Current animation function and data */
struct anim_data anim;
};
et l'utilisation de la même structure dans le main.c:
{
.x = 2,
.y = 3,
.dir = DIR_DOWN,
.anim.function = anim_player_idle,
.anim.dir = DIR_DOWN
};
singleplayer.idle = !anim_player_idle(&singleplayer.anim, 1);
struct map map =
{
.w = 13,
.h = 7
};
Edit : Quand je commente la ligne struct animation const *anim dans engine.h le projet compile très bien, mais ce n'est pas animé… '
Citer : Posté le 22/05/2021 11:00 | #
Tu ne peux pas avoir deux attributs (c'est le bon terme !) du même nom dans une structure, c'est comme avoir deux variables du même nom (c'est ambigu). Dans le tuto, il n'y a qu'un attribut qui s'appelle anim.
Fais bien attention au fait que seule la définition de la structure dans engine.h indique ce qu'il existe comme attribut ou pas. Cette définition est absolue et peu importe ce que tu écris au moment où tu crées et initialises la variable, les attributs seront forcément ceux du header (et si tu essaies de mettre autre chose ce sera une erreur).
Tu as peut-être cru que ceci défini deux attributs anim :
.anim.dir = DIR_DOWN
Mais non, en fait anim est une structure et donc la première ligne initialise son attribut function et la deuxième ligne initialise son attribut dir. J'aurais aussi pu écrire :
Donc je sais pas comment tu t'es retrouvé avec deux attributs anim dans le header, mais une chose est sûre ce n'est pas normal.
Citer : Posté le 22/05/2021 11:17 | #
Ah ok, c'est donc un attribut de player que tu as changé de type, dans le premier tuto on déclare struct animation const *anim; que l'on remplace dans le second tuto par struct anim_data anim;. J'ai bêtement concaténé le code sans le remplacer ^^'
Ouaip pour les affectations, j'avais bien compris du coup
Merci !
Ajouté le 22/05/2021 à 13:09 :
Peut-être préciser à la fin du second tuto qu'il faut aller chercher le code de engine_move qui a été modifié ? (C'est peut-être juste moi, au début je comprenais pas pourquoi le perso restait fixe xDD)
Citer : Posté le 22/05/2021 16:12 | #
Aah, je vois oui. Au début dans le premier tuto j'ai mis un truc temporaire et je l'ai remplacé ensuite quand j'ai implémenté les animations pour de vrai. Désolé pour la confusion !
Oui exact. Le tuto n'est pas trop pensé comme un walkthrough donc dans l'ensemble tu ne peux pas copier/coller le code à chaque étape et obtenir le résultat. Plus ça avance plus j'omettrai de détails (comme le code des animations). Le plus simple reste de clôner le dépôt et de checkout les étapes au fur et à mesure.
Citer : Posté le 22/05/2021 16:27 | #
Y a pas de problème, ça marche bien maintenant
Ouaip, je suis sur Gitea, c'est plus simple pour avoir les versions et tout.
Ajouté le 24/05/2021 à 17:46 :
Dans la partie "Conversion de la map avec fxconv", au niveau du deuxième bloc de code en python, dans le 6e paragraphe, celui qui commence par "L'étape suivante consiste à", dernière ligne, il manque un "n" à "besoin"
Ajouté le 24/05/2021 à 18:08 :
Rien à voir, j'aimerais (pour Plague) encoder les tableaux de mutations avec fxconv. J'ai des "tableaux" au format .txt sous la forme :
0 | 0 | 0 | 4 | 0 | 0 | 0 | 11
9 | 10 | 0 | 0 | 0 | 0 | 0 | 12
0 | 0 | 0 | 7 | 8 | 0 | 0 | 13
où chaque nombre correspond au "numéro" de la mutation à afficher.
J'ai donc commencé à faire un script python…qui ressemble à ça :
def convert(input_name, output, params, target):
if params["custom-type"] == "mutation-table":
convert_mt(map, input_name, output, params, target)
return 0
else:
return 1
def convert_mt(input_name, output, params, target):
with open(input_name, "r") as file:
lines = file.read().splitlines()
data = [i.split(" | ") for i in lines]
for index_i, i in enumerate(data):
for index_j, j in enumerate(i):
data[index_i][index_j] = int(j)
fxconv.elf(data, output, "_" + params["name"], **target)
(mt pour mutation_table qui est mon type custom )
à la fin de la double boucle for, le texte est converti en une matrice d'entier, mais je ne vois pas trop comment passer de ce truc à un objet exploitable par derrière en C ?
(Dans l'idéal j'aimerais aussi stocker sur le même .txt des infos relatives aux mutations, par exemple : 1: "Nausée", 1, 2, 0, -5, serait-ce possible ?)
Merci d'avance !
Citer : Posté le 24/05/2021 18:17 | #
J'ai corrigé la typo, merci.
Tu commences pas mal ! Ce qui te manque c'est l'idée de représenter les octets d'une variable.
Imaginons que tu as un tableau de 10 int ; en C, int tab[10]. Chaque élément du tableau est un entier (de 4 octets) donc le tableau entier fait 40 octets. Si tu arrives à mettre un type sur la variable que tu veux obtenir à la fin et à calculer sa taille en octets alors tu auras quasiment tout fini !
Dans ton cas, ta variable data c'est une liste de listes d'entiers Python, ce qui n'est pas exactement correct. Si tu veux un tableau en C, tu vas avoir une variable du genre int mutation[16][16], et en mémoire cette variable c'est 256 entiers (de 4 octets chacun) à la suite, avec chaque ligne stockée de gauche à droite, de la ligne du haut (en premier) à la ligne du bas (en dernier).
Tu peux créer les octets de cette variable de cette façon :
for y in range(16):
for x in range(16):
mutation += fxconv.u32(data[y][x])
La fonction fxconv.u32() est juste un raccourci pour coder un entier (positif) sur 4 octets. À la fin, si tu fais len(mutation), tu auras 1024 (16×16×4).
Si tu veux avoir une taille variable c'est un peu plus compliqué parce que en C tu ne peux pas vraiment faire des tableaux de taille variable. Si ce que j'ai raconté jusqu'ici est clair, je peux détailler