Touhou-France
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Krssst Lun 22 Oct 2012, 10:00 pm

Bonjour à tous,

Je ne savais pas trop dans quel forum poster ça, mais c'est une de mes créations et y a un léger rapport avec Touhou (on dirige un truc avec une hitbox affichable avec Shift et faut esquiver un tir ;-)) donc je pense que c'est relativement approprié.

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Nekoculus1
Nekoculus est un jeu où vous dirigez un petit chat et où vous devez esquiver un tir qui se déplace plus lentement que vous. Il vous faut survivre pendant 68 secondes pour gagner. C'est tout.
Petite note : le tir se souvient de chacun de vos mouvements et anticipe vos déplacements à partir de ce qu'il a appris. Là ça devient plus difficile :-)

Voilà, c'est tout !
(vraiment ?)
Touches :

  • Flèches pour se déplacer
  • f pour basculer en plein écran
  • Espace pour faire une pause
  • Shift pour afficher la hitbox (... inutile)


Téléchargement : https://www.dropbox.com/s/483smk83qt2rgqm/Nekoculus_R1.zip (9Mo)

Le jeu est fourni en version Windows uniquement, mais est compilable sous Linux (et a priori OS X) pour ceux qui savent installer une version de développement de SFML. Vu qu'il ne s'agit que d'une pré-version (quoique quasi-finale vu que je vais avoir de moins en moins de temps pour avancer) et que ma connexion internet (Free Mobile via Orange : comme le RTC, en bien pire ; pas d'internet câblé dans la résidence étudiante où je loge pour l'instant) ne me permet pas beaucoup de frivolités.

Ah, la prédiction de vos mouvements par le tir est assez lourde au niveau calcul ; le jeu fonctionne bien sur mon netbook mais je ne pense pas qu'on puisse bien y jouer sur un PC moins performant (sachant que j'ai été un peu sauvage sur le frameskip : le jeu sautera des images si le PC a un peu de mal ; il risque de toutes les sauter si le PC a trop de mal).

Dernier défaut, et pas des moindres : je ne suis pas certain que le jeu soit finissable. J'ai pu faire au maximum 3300 à peu près ; le jeu s'arrête à 4096 et vous affiche un écran de victoire. Si quelqu'un arrive à le finir, ce serait gentil de me le dire :-)

Pour ceux qui ont fait plus de 2048
Spoiler:

(petite note : je ne suis pas l'auteur du sprite de chat et d'autres petites choses ; les gens qui s'ennuient peuvent voir le fichier COPYRIGHT)
Krssst
Krssst
Easy
Easy

Messages : 77
Date d'inscription : 04/08/2012
Age : 34

Profil Joueur
 : TH07 - PCB TH07 - PCB
Niveau: Normal
Score: (non communiqué)

Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Invité Mar 23 Oct 2012, 12:53 am

Mhhh. J'vais dire ce que j'en pense du point de vue d'un programmeur (le point de vue joueur plus tard).

Si tu veux distribuer tes sources : ne les mélange pas avec les dlls, exécutables et ressources dans le même dossier. Là c'est pas trop grave vu que c'est un petit projet et que tu n'utilises pas beaucoup de types de fichiers (donc c'est rapide de balancer ce qui gêne ailleurs), mais fais gaffe le jour où ça prend de l'ampleur. En bonus, propose carrément de télécharger séparément.

L'optimisation de niveau 6 ça existe pas sur g++, le niveau 3 fait déjà le maximum, de plus il peut potentiellement provoquer des bugs incompréhensibles. Le niveau 2 fait suffisamment de boulot sans pour autant supposer n'importe quoi pour optimiser à mort. Finalement, pour des raisons évidentes, l'option -g désactive TOUS les flags d'optimisation. Sauf l'inlining, je crois. Donc soit tu compiles avec -g quand tu es chez toi et que tu veux débugguer, soit avec -Ox avec x de préférence strictement inférieur à 3 quand tu veux distribuer. Si tu tiens à le faire avec -O3, je conseille avec du souligné rouge gras : met les warnings au maximum (-pedantic -Wall -Wextra) et n'en laisse aucun traîner (-Werror et remplace -pedantic par -pedantic-errors). Le moindre warning est signe avant coureur que le compilateur va optimiser quelque chose de la mauvaise manière, si ce n'est pas déjà un bug qui se cache. Si tu es parano tu peux même tester ces machins : http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis .

Le makefile j'dis rien, chacun a sa sauce (certaines sont très épicées ~_~). Sauf la tabulation entre les règles Nekoculus.static et clean. J'pense pas que de nos jours, il existe encore un make qui soit assez con pour exécuter clean si t'essayes de compiler en static à cause de la continuité de l'indentation, mais on saît jamais.

Bon maintenant je veux compiler. Et comme je suis un boulet, mes headers de SFML sont pas accessibles directement sous Cygwin. Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle 411509 (si un jour ça t'arrive, c'est -I, et en plus tu peux exploiter ça pour pas te taper des "../../dossiertruc/dossiermachin/bidule.h" à rallonge dans les sources si tu as un projet composé de plusieurs modules, et mettre ça une seule fois dans le Makefile à la place)
Mhhh. Enfin bref. J'ai trouvé un bug grâce aux magnifiques warnings. Regarde la ligne 76 de main.cpp, la macro DBG est vide si on est pas en debug, donc le else se raccorde au if suivant, qui teste, malheureux, une condition plus restrictive que celui du dessus, à moins que l'OS décide de stopper le jeu à ce moment-là et de reprendre quand suffisamment de temps s'est écoulé pour qu'elle devienne valide, ce qui arrivera une fois sur 10 (oui je dis ça au pif, en fait j'en sais rien mais l'idée est là), ce qui fait que ce bout de code ne sera quasiment jamais exécuté, même si ça devrait.

Non en fait je blague, y'a le point-virgule après la macro donc tout va bien. Mais ça aurait pu.
M'enfin voilà ce que j'ai sans le -pedantic et le -Werror =>
Spoiler:

Bon après j'ai la flemme de lire le code. En passant vite fait j'ai rien à dire, c'est assez lisible et tout. Par contre l'indentation est un peu trop grande pour moi, ma tabulation fait 8 caractères (par défaut), mais peut-être que chez toi elle est redéfinie à 4 ou à 2.

Bref, je vais pouvoir jouer un peu là.

Ah, et si je lance "./Nekoculus --always-dumb" je suppose que je peux y arriver du 1er coup à 4096 ? Hurrr


edit :
J'ai oublié de dire que, tu compiles avec un Makefile, et ça c'est cool. Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle 37997
Par contre pour l'éditeur de texte, je suppose que tu utilises Notepad++ ? Je crois pas qu'il y en ait d'autres qui te laissent indenter le code avec des grosses tabulations. Essaye Emacs (c'est celui que j'utilise) ou Vim (c'est ce que les méchants pabôs utilisent). Une fois que tu auras appris une partie des raccourcis qu'ils proposent, tu iras beaucoup plus vite, tu te fatigueras moins, et tu pourras plus t'en passer aussi.

edit 2 :
Okay, en "always dumb" j'arrive à 5000, le hell mode n'est pas "dumb" du tout (mais je fais quand même le max à 25000). Je relance le sans options, et euh ... ton hell mode est tout simplement injuste, 2 boules ça passe, mais avec 4, je suis cuit à 6260 ...
Spoiler:

edit 3 :
8565
J'arrête ici, j'ai pas envie d'en voir 8 à la fois me tomber dessus. o_ô

Invité
Invité


Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Krssst Mar 23 Oct 2012, 2:15 pm

Nagashi a écrit:man i tried it but



c'est fucken compliqué. je suis pas arrivé à plus de 1600 points. je dois être caca mayB mais. wow.

also un peu flippant sur les bords, gg de me faire pisser dessus à 3AM parce que wow, ce. ce truc de game over après 1000 points.

non mais, je veux dire, basiquement c'est juste un petit chat kawi qui court, et je tombe sur ça c'est genre heu wow whats hapn why my eyes bleed like that pls no not again no nooo noooooooooooooo (miko chan onegai desu).

enfin bref amusant mais fear tho.
Le truc des yeux c'est ce qui arrive quand on finit tôt un mardi, qu'on est fatigué et qu'on a passé la matinée à dessiner des yeux en amphi :-) Au début je voulais mettre un cri strident, mais après quelques essais avec audacity, milkytracker (j'étais vraiment désespéré) et avoir fait un tour sur sound-fishing.net, je me suis dit que c'était plutôt une mauvaise idée. Ravi que ça ait quand même pu faire peur à quelqu'un !

Béatrice a écrit:Mhhh. J'vais dire ce que j'en pense du point de vue d'un programmeur (le point de vue joueur plus tard).
Déjà, merci beaucoup pour ton retour sur le code et sur le jeu ; je ne pensais pas que quelqu'un se serait embêté à lire un peu de code mais je m'étais trompé (j'avais l'intention de nettoyer un peu plus tard, mais grâce à toi le nettoyage sera plus intense que prévu :-)).

Si tu veux distribuer tes sources : ne les mélange pas avec les dlls, exécutables et ressources dans le même dossier. Là c'est pas trop grave vu que c'est un petit projet et que tu n'utilises pas beaucoup de types de fichiers (donc c'est rapide de balancer ce qui gêne ailleurs), mais fais gaffe le jour où ça prend de l'ampleur. En bonus, propose carrément de télécharger séparément.
En effet, ce serait infiniment plus propre ; je note.

L'optimisation de niveau 6 ça existe pas sur g++, le niveau 3 fait déjà le maximum, de plus il peut potentiellement provoquer des bugs incompréhensibles. Le niveau 2 fait suffisamment de boulot sans pour autant supposer n'importe quoi pour optimiser à mort. Finalement, pour des raisons évidentes, l'option -g désactive TOUS les flags d'optimisation. Sauf l'inlining, je crois. Donc soit tu compiles avec -g quand tu es chez toi et que tu veux débugguer, soit avec -Ox avec x de préférence strictement inférieur à 3 quand tu veux distribuer. Si tu tiens à le faire avec -O3, je conseille avec du souligné rouge gras : met les warnings au maximum (-pedantic -Wall -Wextra) et n'en laisse aucun traîner (-Werror et remplace -pedantic par -pedantic-errors). Le moindre warning est signe avant coureur que le compilateur va optimiser quelque chose de la mauvaise manière, si ce n'est pas déjà un bug qui se cache. Si tu es parano tu peux même tester ces machins : http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis .
Vu que l'algorithme de prédiction est atrocement lourd, je voulais mettre les optimisations au maximum. En pratique, je voyais souvent lors du déboggage des "optimized out" donc il devait quand même y avoir les optimisations. Par contre, truc vraiment pas propre de ma part : dès qu'on est plus en -O3 les yeux ne s'affichent pas correctement (ce que je compte investiguer pour la prochaine version ; ça prouve tout de même que -O3 fait quelque chose avec -g). Je vais déjà mettre les warnings au maximum et essayer de réparer tout ça puis je m'occuperai de cette chose étrange si corriger les warnings n'a pas suffit.

Le makefile j'dis rien, chacun a sa sauce (certaines sont très épicées ~_~). Sauf la tabulation entre les règles Nekoculus.static et clean. J'pense pas que de nos jours, il existe encore un make qui soit assez con pour exécuter clean si t'essayes de compiler en static à cause de la continuité de l'indentation, mais on saît jamais.
En effet, c'est corrigé (seulement chez moi pour l'instant, c'est toujours ça de pris), c'est toujours ça de pris.

Bon maintenant je veux compiler. Et comme je suis un boulet, mes headers de SFML sont pas accessibles directement sous Cygwin. Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle 411509 (si un jour ça t'arrive, c'est -I, et en plus tu peux exploiter ça pour pas te taper des "../../dossiertruc/dossiermachin/bidule.h" à rallonge dans les sources si tu as un projet composé de plusieurs modules, et mettre ça une seule fois dans le Makefile à la place)
Étant sous linux, tout était déjà dans /usr/include donc je ne me suis pas posé la question mais c'est vrai que c'est à garder à l'esprit (avec -L) si un jour je me traîne différentes versions de SFML.

Mhhh. Enfin bref. J'ai trouvé un bug grâce aux magnifiques warnings. Regarde la ligne 76 de main.cpp, la macro DBG est vide si on est pas en debug, donc le else se raccorde au if suivant, qui teste, malheureux, une condition plus restrictive que celui du dessus, à moins que l'OS décide de stopper le jeu à ce moment-là et de reprendre quand suffisamment de temps s'est écoulé pour qu'elle devienne valide, ce qui arrivera une fois sur 10 (oui je dis ça au pif, en fait j'en sais rien mais l'idée est là), ce qui fait que ce bout de code ne sera quasiment jamais exécuté, même si ça devrait.

Non en fait je blague, y'a le point-virgule après la macro donc tout va bien. Mais ça aurait pu.
En effet, c'est pas joli tout ça... J'ai rajouté des accolades pour qu'on s'y retrouve. De toutes façons la macro DBG() est moche ; idéalement faudrait encadrer chaque machin avec des #ifdef VERBOSE pour qu'on s'y retrouve un peu mieux. C'est juste qu'au début ça affichait toujours tout à l'écran (ce qui n'était pas toujours très pratique) donc j'ai voulu un moyen rapide de pouvoir les activer/désactiver.

M'enfin voilà ce que j'ai sans le -pedantic et le -Werror =>
Spoiler:
Moi il m'a trouvé des erreurs car apparemment la norme interdit d'initialiser des flottants dans les déclarations de classe, ce qui est corrigé (mais pas forcément plus pratique niveau code. Quoique, ça évite de recompiler l'intégralité du code pour juste changer la valeur d'une constante).

Bon après j'ai la flemme de lire le code. En passant vite fait j'ai rien à dire, c'est assez lisible et tout. Par contre l'indentation est un peu trop grande pour moi, ma tabulation fait 8 caractères (par défaut), mais peut-être que chez toi elle est redéfinie à 4 ou à 2.

Bref, je vais pouvoir jouer un peu là.

Ah, et si je lance "./Nekoculus --always-dumb" je suppose que je peux y arriver du 1er coup à 4096 ? Hurrr
En effet, j'aurais pas dû laisser passer ça en dehors du mode debug :-) Ça aurait pu être pire ; avec -DDEBUG il suffit d'appuyer sur 'd' pour être invincible et voir la trajectoire anticipée par les tirs.


edit :
J'ai oublié de dire que, tu compiles avec un Makefile, et ça c'est cool. Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle 37997
Par contre pour l'éditeur de texte, je suppose que tu utilises Notepad++ ? Je crois pas qu'il y en ait d'autres qui te laissent indenter le code avec des grosses tabulations. Essaye Emacs (c'est celui que j'utilise) ou Vim (c'est ce que les méchants pabôs utilisent). Une fois que tu auras appris une partie des raccourcis qu'ils proposent, tu iras beaucoup plus vite, tu te fatigueras moins, et tu pourras plus t'en passer aussi.
Je suis un méchant pabô :-) Par défaut vim me laisse des tabulations qui s'affichent avec huit espaces ; je ne me suis jamais posé trop de questions là dessus ; d'un côté on distingue mieux les blocs, de l'autre ça à tendance à prendre vite pas mal d'espace en largeur et c'est vrai que ça peut devenir désagréable quand on a l'habitude des lignes de 80 caractères.
Par contre, la compilation avec un Makefile... Quand je développe sous linux, je me sers de mon Makefile (bien évidemment, il est là pour ça), tout va bien, les oiseaux chantent. Pour compiler pour windows, après m'être arraché les cheveux quelques heures pour compiler depuis windows, j'ai craqué pour cross-compiler depuis linux (sous Arch il est "facile" d'installer tout ce qu'il faut, à une bidouille prêt). Et là ça n'était pas vraiment fait dans la délicatesse... (i486-mingw32-g++ *.cpp ... tu vois la suite).
Au début je voulais aussi compiler une version statique pour les machines GNU/Linux, mais apparemment je n'avais pas recompilé SFML comme il fallait, et je n'avais pas l'arbre git sous la main (et faut pas espérer cloner un arbre de plus de 100ko avec Free Mobile en HTTPS. Je vais sans doutes profiter d'un passage à mon école pour cloner l'arbre de SFML quand même).

edit 2 :
Okay, en "always dumb" j'arrive à 5000, le hell mode n'est pas "dumb" du tout (mais je fais quand même le max à 25000). Je relance le sans options, et euh ... ton hell mode est tout simplement injuste, 2 boules ça passe, mais avec 4, je suis cuit à 6260 ...
Spoiler:
Le hell mode est là au cas où des gens arrivent à finir le mode normal (sans --always-dumb ;-)) et ont peur de s'ennuyer après. Autant le mode normal se devrait d'être finissable, autant je vois plus le hell mode comme un truc complètement injuste où chaque accroissement du meilleur score d'une unité (enfin, de cinq unités vu que ça croit par 5) est une immense victoire. Faut voir qu'en temps normal, le hell mode ne peut se débloquer qu'après une longue lutte contre le mode normal ;-)
edit 3 :
8565
J'arrête ici, j'ai pas envie d'en voir 8 à la fois me tomber dessus. o_ô
6480 en mode difficile après un peu d'entraînement pour moi ; je m'entraînais surtout en mode normal (moins intense, mais moins injuste) vu que je cherche à voir s'il est finissable ou non :-) Le "hell mode" c'est vraiment juste un petit bonus au cas où quelqu'un finirait miraculeusement le mode normal. Après s'il se trouve qu'il est beaucoup plus amusant que l'autre sur certains points il doit y avoir quelque chose à en tirer :-)

En tout cas, à nouveau, merci beaucoup pour tes retours et tes conseils !
Tu es en école d'info et/ou a déjà participé à et/ou créé des jeux ?
Krssst
Krssst
Easy
Easy

Messages : 77
Date d'inscription : 04/08/2012
Age : 34

Profil Joueur
 : TH07 - PCB TH07 - PCB
Niveau: Normal
Score: (non communiqué)

Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Invité Mar 23 Oct 2012, 11:18 pm

Beeh, j'ai fait une connerie avec ma tabulation. Je dois refaire mon post. x_x
Et en plus, j'y crois pas, t'es en fait un méchant pabô. Meh.


Pour le "optimized out" : tout bout de code se trouvant dans un header (typiquement les templates et les accesseurs), est automatiquement sujet à l'inlining, si le compilateur le juge nécessaire, peu importe le degré d'optimisation et si on est en débug (donc c'est bien ce qu'il me semblait dans mon post précédent). Ceci afin d'éviter de dupliquer plein de code dans chaque fichier objet. Il y a peut-être une exception si on link direct mais c'est pas pratique.
Ce pourquoi ça arrive très souvent (pour ne pas dire toujours ...) quand tu essayes de débugguer du code qui utilise la STL.

Étant sous linux, tout était déjà dans /usr/include donc je ne me suis pas posé la question mais c'est vrai que c'est à garder à l'esprit (avec -L) si un jour je me traîne différentes versions de SFML.
En fait, justement, j'étais par défaut sur la version 1.6 de SFML, donc sf::Texture était introuvable, par exemple. :p


Moi il m'a trouvé des erreurs car apparemment la norme interdit d'initialiser des flottants dans les déclarations de classe, ce qui est corrigé (mais pas forcément plus pratique niveau code. Quoique, ça évite de recompiler l'intégralité du code pour juste changer la valeur d'une constante).
http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class
Une autre raison (qui rejoint un peu certaines réponses données plus haut) pourrait venir de ça (c'est le bout de code qui m'a fait foirer ma tabulation d'ailleurs T_T ) :
Code:
static const float flt1 = 5.f / 3.f;

int main ()
{
  float flt2 = 5.f / 3.f;
  return (flt1 == flt2);
}
Si tu compiles sur ta machine pour ta machine, tu auras fort probablement 1 en valeur de retour.
Si tu cross-compiles vers une architecture qui utilise un format de flottants différent, et qu'en plus tu n'optimises pas (ça marche comme si tu t'étais arrangé pour obtenir les valeurs depuis une source extérieure pour les calculer après), le compilateur devrait effectuer la 1ère division sur ta machine, puis convertir, et laisser la 2ème division pour la machine cible en convertissant préalablement les 2 valeurs. Le résultat peut être potentiellement différent, et c'est encore pire pour les divisions étant donné que ce n'est pas faisable directement sur le hardware, chaque constructeur a sa méthode (je parie qu'il y a des brevets dessus), les optimisations dépendant aussi du format de flottant (y'a qu'à voir la fonction de calcul de racine carrée inverse de John Carmack pour être convaincu que oui, le format de représentation des flottants a son importance, et peut être exploité pour faire certains calculs différemment). Si tu as de quoi le tester, il est possible que tu doives changer plusieurs fois les valeurs avant de tomber sur la bonne combinaison, mais ça peut se faire.
Donc, comportement indéterminé, l'erreur est justifiée. Un peu comme ton histoire d'yeux qui n'apparaissent pas en fonction du degré d'optimisation (d'ailleurs faut croire que l'inlining n'est pas le seul truc qui passe quand même dans les optimisations quand on est en debug ?).




Sinon pour compiler sous Windows sans utiliser Visual Studio, en fait t'as plein de moyens d'y arriver, mais pour chacun d'entre eux il faut un peu se démerder. J'utilise Cygwin et ça marche pas trop mal, du moment qu'un chemin type Windows (avec des noms de volume et des backslashs, beurk) ne vient pas tout casser. Sinon il y a MinGW, c'est moins lourd mais y'a pas de joli terminal, pas de joli shell propre, rien, juste gcc et le strict minimum pour le faire marcher (d'où le nom Minimalist GNU for Windows). Dans les 2 cas il faut recompiler la SFML avec ... eh ... eheh ... Cmake, qu'il faut aussi installer et faire en sorte qu'il s'intègre correctement dans l'environnement. Mad



Ouais, je suis en école d'info. J'ai commencé à programmer au lycée sur ma calculatrice dès que j'ai posé les yeux sur son manuel, ça remonte à 6 ans maintenant. J'ai fait quelques jeux (mais pas que ça), le seul qui soit complet est un jeu de dames (sur la calculatrice sus-citée), les autres j'ai toujours eu soit la flemme de continuer, soit j'avais pas le temps à cause des études (bien qu'en réalité je glandais pas mal en prépa xD ). Il y a quelques mois je me suis lancé dans un projet assez costaud ( https://touhou-france.forumactif.com/t1916-projet-jeu-de-combat-avec-personnages-et-maps-scriptables ), mais j'ai vraiment du mal à trouver le temps de m'en occuper, j'ai pas eu de grandes vacances (juste 2 semaines pour aller voir ma famille ?) et maintenant non seulement je suis en stage, mais en plus pour ce mois d'Octobre, au Japon, j'ai l'impression qu'ils se sont surpassés pour sortir des animes plus intéressants que d'habitude. Ce que je ne veux pas louper, et j'ai pas envie de reporter non plus (j'ai déjà d'autres animes/mangas en attente, et même quelques tomes de Discworld et H2G2 que j'ai pas encore ouverts), humhum.

Invité
Invité


Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Krssst Mer 24 Oct 2012, 9:24 pm

Béatrice a écrit:Pour le "optimized out" : tout bout de code se trouvant dans un header (typiquement les templates et les accesseurs), est automatiquement sujet à l'inlining, si le compilateur le juge nécessaire, peu importe le degré d'optimisation et si on est en débug (donc c'est bien ce qu'il me semblait dans mon post précédent). Ceci afin d'éviter de dupliquer plein de code dans chaque fichier objet. Il y a peut-être une exception si on link direct mais c'est pas pratique.
Ce pourquoi ça arrive très souvent (pour ne pas dire toujours ...) quand tu essayes de débugguer du code qui utilise la STL.
D'accord, je retiens. Je pense tout de même qu'il optimisait un peu à cause du bug bizarre de l'oeil qui s'affichait bien en -O3 et mal pour tout ce qu'il y avait en dessous (après investigation, ça avait l'air d'être une histoire de dépassement qui est maintenant corrigée).

http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class
Une autre raison (qui rejoint un peu certaines réponses données plus haut) pourrait venir de ça (c'est le bout de code qui m'a fait foirer ma tabulation d'ailleurs T_T ) :
Code:
static const float flt1 = 5.f / 3.f;

int main ()
{
  float flt2 = 5.f / 3.f;
  return (flt1 == flt2);
}
Si tu compiles sur ta machine pour ta machine, tu auras fort probablement 1 en valeur de retour.
Si tu cross-compiles vers une architecture qui utilise un format de flottants différent, et qu'en plus tu n'optimises pas (ça marche comme si tu t'étais arrangé pour obtenir les valeurs depuis une source extérieure pour les calculer après), le compilateur devrait effectuer la 1ère division sur ta machine, puis convertir, et laisser la 2ème division pour la machine cible en convertissant préalablement les 2 valeurs. Le résultat peut être potentiellement différent, et c'est encore pire pour les divisions étant donné que ce n'est pas faisable directement sur le hardware, chaque constructeur a sa méthode (je parie qu'il y a des brevets dessus), les optimisations dépendant aussi du format de flottant (y'a qu'à voir la fonction de calcul de racine carrée inverse de John Carmack pour être convaincu que oui, le format de représentation des flottants a son importance, et peut être exploité pour faire certains calculs différemment). Si tu as de quoi le tester, il est possible que tu doives changer plusieurs fois les valeurs avant de tomber sur la bonne combinaison, mais ça peut se faire.
Donc, comportement indéterminé, l'erreur est justifiée. Un peu comme ton histoire d'yeux qui n'apparaissent pas en fonction du degré d'optimisation (d'ailleurs faut croire que l'inlining n'est pas le seul truc qui passe quand même dans les optimisations quand on est en debug ?).
En effet, ça paraît logique. Dommage de risquer de perdre les optimisations sur des variables flottantes constantes auxquelles on fait très souvent accès ; si j'ai bien compris le post de stackoverflow il faudrait activer les "whole program optimizations" (en ajoutant le link time optimization avec -flto si j'ai bien compris, mais mais je n'ai pas trop cherché).

Sinon pour compiler sous Windows sans utiliser Visual Studio, en fait t'as plein de moyens d'y arriver, mais pour chacun d'entre eux il faut un peu se démerder. J'utilise Cygwin et ça marche pas trop mal, du moment qu'un chemin type Windows (avec des noms de volume et des backslashs, beurk) ne vient pas tout casser. Sinon il y a MinGW, c'est moins lourd mais y'a pas de joli terminal, pas de joli shell propre, rien, juste gcc et le strict minimum pour le faire marcher (d'où le nom Minimalist GNU for Windows). Dans les 2 cas il faut recompiler la SFML avec ... eh ... eheh ... Cmake, qu'il faut aussi installer et faire en sorte qu'il s'intègre correctement dans l'environnement. Mad
Sous windows j'avais essayé MinGW (on m'a montré comment élargir la fenêtre de la ligne de commande sous Windows et ça permet de respirer un peu mais ça craint toujours pas mal), mais toute compilation avec SFML 2.0RC1 se finissait en crash au lancement du programme. gdb m'indiquait où ça plantait dans les appels SFML, et je voyais pas trop quoi faire de plus. J'ai voulu essayer de recompiler SFML, mais après avoir laissé cmake faire son boulot (qui a donc bien généré son Makefile comme il faut), taper make... m'ouvrait une ligne de commande DOS classique au dessus du bash. Incompréhensible. Je pense que j'aurais plus d'espoir en essayant de recompiler une version statique de SFML pour Windows depuis linux :-)

Ouais, je suis en école d'info. J'ai commencé à programmer au lycée sur ma calculatrice dès que j'ai posé les yeux sur son manuel, ça remonte à 6 ans maintenant. J'ai fait quelques jeux (mais pas que ça), le seul qui soit complet est un jeu de dames (sur la calculatrice sus-citée), les autres j'ai toujours eu soit la flemme de continuer, soit j'avais pas le temps à cause des études (bien qu'en réalité je glandais pas mal en prépa xD ). Il y a quelques mois je me suis lancé dans un projet assez costaud ( https://touhou-france.forumactif.com/t1916-projet-jeu-de-combat-avec-personnages-et-maps-scriptables ), mais j'ai vraiment du mal à trouver le temps de m'en occuper, j'ai pas eu de grandes vacances (juste 2 semaines pour aller voir ma famille ?) et maintenant non seulement je suis en stage, mais en plus pour ce mois d'Octobre, au Japon, j'ai l'impression qu'ils se sont surpassés pour sortir des animes plus intéressants que d'habitude. Ce que je ne veux pas louper, et j'ai pas envie de reporter non plus (j'ai déjà d'autres animes/mangas en attente, et même quelques tomes de Discworld et H2G2 que j'ai pas encore ouverts), humhum.
J'avais déjà codé un peu avant le lycée (deux ou trois horreurs en PHP) mais c'est vrai que la calculatrice motive plus, surtout quand il y a un cours d'autre chose en même temps :-) Même problème de mon côté ; démotivation (surtout quand le jeu s'avère être chiant quand on y joue entre amis - grande désillusions) et manque de temps. Là le principe du jeu est très très simple mais je m'amusais un minimum en y jouant et j'ai quand même essayé d'aller jusqu'au bout vu que ça pouvait pas être bien long (en fait tout ce qui était hors gameplay a été 90% du temps de développement) et histoire de pas être totalement bredouille si je postule pour un stage (mais bon, c'est vrai que ça doit pas rendre forcément service).
Au niveau de ton projet de jeu de combat scriptable, je serais tenté de proposer de participer au niveau code mais niveau temps je suis un peu juste aussi (beaucoup de temps libre en début d'année, mais là début des projets + arrivée des examens = plus maintenant) ; je serai tout de même curieux de jeter un oeil s'il y a un wiki et/ou un arbre git :-)
Krssst
Krssst
Easy
Easy

Messages : 77
Date d'inscription : 04/08/2012
Age : 34

Profil Joueur
 : TH07 - PCB TH07 - PCB
Niveau: Normal
Score: (non communiqué)

Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Invité Mer 24 Oct 2012, 10:01 pm

Krssst a écrit:En effet, ça paraît logique. Dommage de risquer de perdre les optimisations sur des variables flottantes constantes auxquelles on fait très souvent accès ; si j'ai bien compris le post de stackoverflow il faudrait activer les "whole program optimizations" (en ajoutant le link time optimization avec -flto si j'ai bien compris, mais mais je n'ai pas trop cherché).

En fait, il faut que dans ton header, tu écrives quelque chose du genre "static const float flt;", et dans un seul fichier source "static const float Classe::flt = valeur;". Avec ça tu peux même faire un appel de fonction au lieu de donner une valeur, ce sera du code exécuté juste avant l'appel à main, si je ne dis pas de bêtise (en réalité le point d'entrée d'un programme s'appelle _start, qui fait quelques trucs avant de lancer main -> ça par contre c'est certain).

Krssst a écrit:J'avais déjà codé un peu avant le lycée (deux ou trois horreurs en PHP) mais c'est vrai que la calculatrice motive plus, surtout quand il y a un cours d'autre chose en même temps :-) Même problème de mon côté ; démotivation (surtout quand le jeu s'avère être chiant quand on y joue entre amis - grande désillusions) et manque de temps. Là le principe du jeu est très très simple mais je m'amusais un minimum en y jouant et j'ai quand même essayé d'aller jusqu'au bout vu que ça pouvait pas être bien long (en fait tout ce qui était hors gameplay a été 90% du temps de développement) et histoire de pas être totalement bredouille si je postule pour un stage (mais bon, c'est vrai que ça doit pas rendre forcément service).

Oui, ça peut effectivement servir pour un stage. Quasiment aucun recruteur ne te prendra si tu n'as rien de concret, tandis qu'une IA qui prédit les mouvements d'une cible et s'y adapte, ça peut fortement l'intéresser (surtout si ça marche).


Krssst a écrit:Au niveau de ton projet de jeu de combat scriptable, je serais tenté de proposer de participer au niveau code mais niveau temps je suis un peu juste aussi (beaucoup de temps libre en début d'année, mais là début des projets + arrivée des examens = plus maintenant) ; je serai tout de même curieux de jeter un oeil s'il y a un wiki et/ou un arbre git :-)

Il est déjà sur Github mais je vais éviter de diffuser pour l'instant, tant que j'ai pas une base solide pour commencer. Pour le moment c'est pas très clair ce que je fais, il faut que je change la manière de déclarer les états d'un personnage, et j'ai toujours pas décidé comment faire certains trucs.
Donc je pense que tu auras bien le temps de faire tes projets et examens avant que je commence à tout dévoiler. :3

Invité
Invité


Revenir en haut Aller en bas

Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle Empty Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum