1290

La réponse est dans ma parenthèse.
De toutes façons, si tu prends le temps d'y réfléchir un peu, en fait tu veux un Module*, et non pas un Module.
Et en réalité, le polymorphisme ne « marche pas » avec les valeurs (genre Module), uniquement avec les différents types de références (donc pointeurs et références C++, genre Module* ou Module&).

Réfléchis à comment ça fonctionnerait à bas niveau:
Module fait 16 octets.
StaticModule fait 24 octets. (Oui, une instance d'une classe dérivée ne peux pas faire moins qu'une instance de la classe parent, c'est logique tongue)
Comment tu met un StaticModule dans un Module ? wink
Réponse: Tu peux pas ! smile
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1291

Ah ok, bien vu, merci grin

Autre problème, là j'aime fort :
int Task::manageTasks()
{
    printf("pwet");
    SDL_Event Events;

    while (true)
    {
    /* Check for event quit */
        SDL_PollEvent(&Events);
        if (Events.type == SDL_QUIT)
            return EXIT_SUCCESS;

    /* Run the current Module->manageEvents() */
        m_ModuleList.back()->manageEvents(&Events);

    /* Wait for synchro */

    /* Toggle draw/display buffers */
        SDL_Flip(Screen);
    }
}

J'ai bien mon "pwet" en console, mais malgré le while(true), je sors immédiatement de la méthode ! Que pasa ? hypno
En fait, quand je trace le programme à la main (GDB), j'obtiens bien des itérations dans la boucle. Dès que je le laisse pisser, ça quitte la boucle et le programme (sans erreur)...

1292

Tu sors de la boucle parce qu'il estime que le "true" n'est plus vrai ? Ou par ton return ?
avatar

1293

Et si tu mets un point d'arrêt sur le return EXIT_SUCCESS ?
T'as peut être un message quitter qui passe tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1294

Tu as atteint la condition de sortie? (événement SDL_QUIT)
Autre possibilité: un bug dans ton programme et ton OS ferme le prog sans rien dire et sans erreur.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1295

Han trigic
Events->type++;
J'avais foutu ça pour dans manageEvents() pour pas me taper le warning "unused var" à la compilation, pas de bol SDL_QUIT était derrière (cc)
Merci grin

1296

void f(SDL_Event Events) {
 Events; // permet d'enlever le warning avec g++
}

1297

C'est tordu comme contournement, g++ propose une solution plus élégante :
void f(SDL_Event) // Un paramètre est bien attendu, mais pas de warning sur le fait qu'il est inutilisé
{
}
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1298

Mici. happy

1299

Zephyr (./1297) :
C'est tordu comme contournement, g++ propose une solution plus élégante :
void f(SDL_Event) // Un paramètre est bien attendu, mais pas de warning sur le fait qu'il est inutilisé
{
}

Ah, c'est plus élégant en effet grin
La 1ère solution peut quand même avoir une utilité quand tu écris des fonctions avec des macro, et que tu ne maitrise pas le prototype.

1300

yep c'est pas faux
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1301

Sinon, il y a aussi __attribute__((unused)) et Q_UNUSED(var), mais le premier est une extension GNU et le deuxième un macro de Qt.

Q_UNUSED(var) est en général converti en (void)var, mais il y a quelques compilateurs (Intel et RVCT) où c'est plus compliqué d'éviter le warning, il faut passer par une fonction bidon. Mais si ça ne te dérange pas, tu peux aussi mettre (void)var.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1302

Ok, merci pour tout. Et je n'utilise pas les extensions GNU.

1303

__attribute__((unused)) peut être utilisé de manière conditionnelle.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1304

Effectivement. Mais c'est vraiment durant la phase de dev que j'en ai besoin, et encore je pourrais m'en passer, c'est uniquement histoire de rendre plus lisible la sortie du compilo.

1305

Est-ce que d'après vous, ce n'est pas mauvais de définir en tant que variables globales :
- les données de la souris (coordonnées, état des boutons)
- les données du clavier (touche appuyée/releasée)
- le buffer de l'écran

Je pourrais m'amuser à tout passer en paramètres, mais ça fait très artificiel comme manière de dire qu'on a pas de variables globales : ce sont en effet des données communes à tous les composants qui peuvent vouloir savoir différentes choses sur les entrées, ou vouloir s'afficher. Je vois ça comme ça, qu'en pensez-vous ?

Alors bien sûr, je n'ai aucune abstraction par rapport à la SDL avec ça, mais au moins mon programme avance : à force de mettre des abstractions dans tous les sens, on en arrive jamais à coder du concret, puis de toute façon faut bien qu'à un moment où l'autre on finisse par s'adresser aux interfaces d'entrées-sorties.

1306

Tu peux faire comme ça, et tu verras toi même les problèmes de design que ça peut t'apporter, et s'ils te gênent par la suite.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1307

La façon dont tu dois gérer ça dépend en partie de comment tu gères les périphériques d'entrée: Evénements ou polling.
En tout cas, dans un cas comme dans l'autre, ce n'est pas vraiment une bonne manière de faire.
(De plus, les abstractions comme le système de messages c'est aussi toi qui les as voulues, moi je t'ai dit que j'aurais fait sans tongue)
En gros, je pense que, si tu as besoin de partager ces informations avec tout ton programme, c'est que ton programme est mal conçu… Après ça n'engage que moi.
(Pour moi, tu as d'un côté le code de mise à jour => gestion souris + clavier + évolution avec le temps, et de l'autre le code de dessin. Et une couche en dessous qui représente le jeu en lui même (modèle de données, etc.) et qui n'en a rien a battre de celles au dessus. tongue)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1308

Je fais du polling, par défaut de ne savoir faire de l'évènementiel sad

Pour les abstractions au niveau des messages, il s'agit bien de faire des communications entre des objets qui s'ignorent, et à part inventer des fonctions friend dans tous les sens ou travailler avec tout en global, je ne vois pas trop comment faire autrement (à mon niveau).

Et pourquoi ne pas partager ces informations ? Une icone autant qu'une liste déroulante, une unité ou un ascensceur a besoin de savoir si la souris est là pour savoir quoi faire, non ? A moins qu'au niveau supérieur, on dise quoi faire faire à chaque élément affiché, ce qui contraint la classe supérieure à connaitre des données sur la classe inférieure, on revient toujours au problème de responsabilités et de délégation du travail.
J'ai fait le choix de la simplicité, mes essais pour tout abstraire ayant fini en une choucroute monumentale, sans une ligne de code "efficace" (faisant réellement avancer quelque chose dans le programme), par contre, yavait de la création d'objet et de l'allocation dans tous les sens. Au final, je n'ai rien fait (de concret).

Mais je suis preneur d'une esquisse de solution plus précise que "gestion souris + clavier" + "dessin" grin Une icone à qui je dit de s'afficher, elle a bien besoin de savoir comment est foutu le clavier pour le faire, à moins que je m'adresse 15 fois à cet objet en lui demandant différentes choses à chaque fois (et là, ça sera bien découpé mais bordelique).

Sinon, j'ai besoin d'une classe abstraite (Icon justement), de laquelle vont dériver toutes les icones de mon interface. Seulement, je crois que je ne peux pas avoir de données dans une classe abstraite, que des méthodes ? Et pourtant, les icones ont plein de choses en commun au niveau des données... Alors comment faire, une interface pour les méthodes et une classe pour les données, et un héritage multiple au final ? Ca me parait lourd...

1309

Folco (./1308) :
Je fais du polling, par défaut de ne savoir faire de l'évènementiel sad
C'est pas un défaut tongue
Perso je suis pas fan de l'événementiel pour les jeux, juste parce que tu peux « facilement » zapper un événement (genre key up) et que ça nique ton gameplay. (Je prends WoW comme exemple à ce titre)
Evénementiel = possibilité de « dater » les événements, bien pour le matériel ancien, qui va galérer à l'affichage.
Sondage = état du matériel à l'instant présent, aucune idée de ce qui se passe entre deux étapes. Par contre c'est toi qui gère les key up/down (à l'aide de XOR bien placés ^^) donc impossible de manquer un événement aussi important. (Sauf si un couple up/down se produit entre deux sondages => Pas bien pour PC lents)
Pour un jeu qui tourne à un FPS moyen (30 ?) les deux se valent je dirais.
Pour les abstractions au niveau des messages, il s'agit bien de faire des communications entre des objets qui s'ignorent, et à part inventer des fonctions friend dans tous les sens ou travailler avec tout en global, je ne vois pas trop comment faire autrement (à mon niveau).
Bah justement, ils ne devraient peut être pas s'ignorer totalement. enfin, y'a au moins un truc qui devrait ne pas les ignorer.
Typiquement, un clic sur un bouton va appeler une méthode (on est d'accord jusque là non ? tongue), et c'est cette méthode qui va se charger de refléter le clic sur le reste du programme. (En lieu et place d'envoyer un message !) Pour un exemple, voir l'odre que j'ai donné dans un message précédent.
Après, non, tu n'aura jamais besoin de friend pour ça. Friend sert à la coopération étroite entre classes (d'ailleurs le nom est assez explicite), mais tu dois t'en sortir avec des méthodes publiques la plupart du temps si tu codes proprement. wink
Et pourquoi ne pas partager ces informations ? Une icone autant qu'une liste déroulante, une unité ou un ascensceur a besoin de savoir si la souris est là pour savoir quoi faire, non ? A moins qu'au niveau supérieur, on dise quoi faire faire à chaque élément affiché, ce qui contraint la classe supérieure à connaitre des données sur la classe inférieure, on revient toujours au problème de responsabilités et de délégation du travail.
Ben dans le cas d'une UI par exemple, tu connais le rectangle englobant (note: cette partie là s'applique aussi pour le jeu en lui même, et est transposable à la 3D), donc tu sais déjà à l'avance sur quel contrôle est la souris. Ensuite, tu peux lui passer les coordonnées dans son référentiel. En général (0; 0) en local = coin supérieur gauche du contrôle.
Enfin je sais pas si c'est la peine d'en dire plus, si t'as des questions tu demandera. ^^
J'ai fait le choix de la simplicité, mes essais pour tout abstraire ayant fini en une choucroute monumentale, sans une ligne de code "efficace" (faisant réellement avancer quelque chose dans le programme), par contre, yavait de la création d'objet et de l'allocation dans tous les sens. Au final, je n'ai rien fait (de concret).
C'est parce que t'as commencé par le code chiant avant de faire le code marrant, faut faire un peu des deux. tongue
(Non sérieusement, à chacun sa manière de coder, en plus tu as déjà fait un topic là dessus (dans lequel je ne crois pas avoir posté ^^) donc pas la peine de parler de ça ici)
Mais je suis preneur d'une esquisse de solution plus précise que "gestion souris + clavier" + "dessin" grin Une icone à qui je dit de s'afficher, elle a bien besoin de savoir comment est foutu le clavier pour le faire, à moins que je m'adresse 15 fois à cet objet en lui demandant différentes choses à chaque fois (et là, ça sera bien découpé mais bordelique).
Moi pas comprendre rapport clavier + affichage. confus
(Non désolé faudra préciser là je vois pas trop où tu veux en venir ^^)
Sinon, j'ai besoin d'une classe abstraite (Icon justement), de laquelle vont dériver toutes les icones de mon interface. Seulement, je crois que je ne peux pas avoir de données dans une classe abstraite, que des méthodes ? Et pourtant, les icones ont plein de choses en commun au niveau des données... Alors comment faire, une interface pour les méthodes et une classe pour les données, et un héritage multiple au final ? Ca me parait lourd...
Une classe abstraite c'est quand même une classe à part entière… Donc tu peux mettre ce que tu veux dedans, tu pourras juste pas créer d'instances de *cette* classe précise.
Il ne faut pas confondre avec ce qu'on appelle une interface qui ne peut effectivement pas contenir autre chose que des méthodes (abstraites, donc « virtuelles pures » en C++). Mais les interfaces ne font pas partie du standard C++, il n'y a que les classes abstraites. (Résumé: interface = encore plus spécifique que classe abstraite)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1310

Le C++ n'a pas besoin d'un concept séparé d'interface parce qu'il y a l'héritage multiple.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1311

J'ai dit nulle part qu'il en avait besoin hein… Par contre j'ai déjà du dire que le C++ était mal fichu, et je le pense. tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1312

Ah ok, en fait j'ai essayé une classe abstraite avec des données, et en effet ça marche. La suite au prochain numéro ^^

1313

GoldenCrystal (./1309) :
Perso je suis pas fan de l'événementiel pour les jeux, juste parce que tu peux « facilement » zapper un événement (genre key up) et que ça nique ton gameplay. (Je prends WoW comme exemple à ce titre)

Je ne vois pas de raison que ça arrive... si tu "oublies" un événement qui a été propagé c'est que tu as mal codé. Tu peux très bien manquer le changement d'état de la touche à ce moment-là.
En fait il faut de toute façon une tâche qui s'occupe de "poller" et transforme cela en événements, genre:
keyState = readKeyState();
if (keyState & ~lastKeyState)
    sendMessageInt(EVT_KEY_DOWN, keyState & ~lastKeyState);
...
lastKeyState = keyState;

Et cette tâche peut être problématique si elle tourne dans un thread séparé. On est dépendant de la gestion du multitasking par l'OS, c'est à dire qu'il ne doit pas avoir de période sensible où ce thread est stoppé au profit de celui de la logique du jeu. Et typiquement Windows aime donner un boost à ce genre de threads, d'où... problème grin
Par contre ce n'est pas lié à l'événementiel en soi. Tu peux très bien faire un jeu sans événement mais qui sépare le rendu, l'input, la physique, le réseau, etc. dans des threads différents, et le même genre de problème peut arriver à ce moment-là.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1314

Brunni (./1313) :
GoldenCrystal (./1309) :
Perso je suis pas fan de l'événementiel pour les jeux, juste parce que tu peux « facilement » zapper un événement (genre key up) et que ça nique ton gameplay. (Je prends WoW comme exemple à ce titre)
Je ne vois pas de raison que ça arrive... si tu "oublies" un événement qui a été propagé c'est que tu as mal codé.
Non je veux dire que bêtement, tu ne reçois pas l'évènement. Tu peux très bien manquer le changement d'état de la touche à ce moment-là. Et tu ne peux pas manquer un changement d'état avec du polling, tu ne peux en manquer qu'un nombre pair. À toi de voir si c'est grave d'avoir manquer ça dans ton jeu. Si tu codes un FPS tu ne veux probablement pas rater un clic, mais si tu codes un shooter 2D, tu te fous complètement que la touche ait été relâchée entre 2 images.
En fait il faut de toute façon une tâche qui s'occupe de "poller" et transforme cela en événements, genre:
keyState = readKeyState();
if (keyState & ~lastKeyState)
    sendMessageInt(EVT_KEY_DOWN, keyState & ~lastKeyState);
...
lastKeyState = keyState;
Pourquoi dans une tâche séparée ? Tu peux bien le faire dans la boucle principale ça ne posera pas vraiment de problèmes. (Sauf machine lente, cf. mon post)
Et cette tâche peut être problématique si elle tourne dans un thread séparé. On est dépendant de la gestion du multitasking par l'OS, c'est à dire qu'il ne doit pas avoir de période sensible où ce thread est stoppé au profit de celui de la logique du jeu. Et typiquement Windows aime donner un boost à ce genre de threads, d'où... problème grin
Non ça pose surtout problème dans le sens où ça va mal marcher sur les machines mono-cpu peu performantes, justement, celles où tu aurais pu penser l'amélioration intéressante. Et les autres n'ont pas besoin de ça.
Je te rappelle quand même que l'OS génère déjà les événements de touches… (Je parle au moins pour les vrai OS)
Par contre ce n'est pas lié à l'événementiel en soi. Tu peux très bien faire un jeu sans événement mais qui sépare le rendu, l'input, la physique, le réseau, etc. dans des threads différents, et le même genre de problème peut arriver à ce moment-là.
Mouais, c'est un peu casse gueule, typiquement t'as pas besoin de séparer l'entrée et le dessin, par contre le reste ouais. Réseau obligatoire, et AI et physique bouffent en général pas mal de temps CPU donc ça peut aussi être une bonne idée. Mais tout ça rend la conception du jeu bien plus compliquée si tu ne fais pas attention à ce que tu fais, alors on va peut être éviter de suggérer des idées bizarres à Folco hein ? grin
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1315

GoldenCrystal (./1309) :
Bah justement, ils ne devraient peut être pas s'ignorer totalement. enfin, y'a au moins un truc qui devrait ne pas les ignorer.
Typiquement, un clic sur un bouton va appeler une méthode (on est d'accord jusque là non ? tongue.gif ), et c'est cette méthode qui va se charger de refléter le clic sur le reste du programme. (En lieu et place d'envoyer un message !)

Mais justement, je ne comprends pas là où tu veux que j'en vienne...

Schématiquement, mes classes sont instanciées comme ça :
main() instancie Task
Task instancie ModuleTruc (en dérivant de Module)
ModuleTruc instancie IconMachin (en dérivant de Icon)

Comment veux-tu que IconMachin "reflète le clic sur tout le reste du programme", donc au niveau de Task, de Module et de Icon ?

A la rigueur, seul ModuleTruc peut lancer une méthode de IconMachin pour avoir une valeur de retour, mais à partir d'une méthode de iconMachin, je ne peut strictement rien faire sur "tout le reste du programme".

Tu vois les choses comment toi ?

1316

Ouais bon heu, laisse tomber.
Je comprends pas ton architecture bizarre de programme en fait. tongue
Tu verras bien si ça marche ou pas de toutes façons. C'est en faisant des erreurs qu'on progresse ^^
(Après les erreurs font aussi perdre du temps, mais ça tu n'y coupera pas)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1317

Et tu peux pas me dire comment toi tu verrais les choses, que j'essaye de comprendre ton raisonnement ? grin

1318

(le jour où je vais recevoir la facture de consulting de Golden, ça va chier sévère à la maison trioui)

1319

(Surtout que tu la recevras en même temps que celle de tous les autres posteurs de yN… Sauf KK, lui il bosse toujours gratuitement. trioui)
Non sérieusement faudrait que je relise les pages d'avant du topic voir si j'ai pas manqué un truc déjà, et je veux pas non plus te stopper dans ta lancée. ^^
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1320

Bon ok, je continue grin

Merci pour tout, sans vous tous j'en serais pas à 1% du peu que j'ai déjà fait hehe