Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
Page 1 sur 1
Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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 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 :
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
(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)
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 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:
- Désolé, je voulais garder la surprise :-)
(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- Easy
- Messages : 77
Date d'inscription : 04/08/2012
Age : 34
Profil Joueur
: TH07 - PCB
Niveau: Normal
Score: (non communiqué)
Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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. (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 =>
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 ?
edit :
J'ai oublié de dire que, tu compiles avec un Makefile, et ça c'est cool.
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 ...
edit 3 :
8565
J'arrête ici, j'ai pas envie d'en voir 8 à la fois me tomber dessus. o_ô
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. (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:
- g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Button.cpp
Button.hpp: In constructor 'Button::Button(std::string, int, int, sf::Uint8)':
Button.hpp:29:15: warning: 'Button::text' will be initialized after
Button.hpp:26:8: warning: 'bool Button::clicked'
Button.cpp:3:1: warning: when initialized here
Button.hpp:32:8: warning: 'Button::hovered' will be initialized after
Button.hpp:31:20: warning: 'RCRectangleShape Button::frame'
Button.cpp:3:1: warning: when initialized here
Button.hpp:31:20: warning: 'Button::frame' will be initialized after
Button.hpp:28:13: warning: 'sf::Uint8 Button::frameAlpha'
Button.cpp:3:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c main.cpp
main.cpp: In function 'int main(int, char**)':
main.cpp:70:76: warning: comparison between signed and unsigned integer expressions
main.cpp:76:41: warning: suggest braces around empty body in an 'else' statement
main.cpp:78:48: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Memory.cpp
In file included from Bullet.hpp:3:0,
from Memory.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Memory.cpp: In member function 'void Memory::updateMins()':
Memory.cpp:78:15: warning: unused variable 'timeStart'
Memory.cpp: At global scope:
Memory.cpp:283:6: warning: unused parameter 'r'
Memory.cpp:283:6: warning: unused parameter 'g'
Memory.cpp:283:6: warning: unused parameter 'b'
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Menu.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Menu.cpp:2:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Game.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Game.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Game.hpp: In constructor 'Game::Game(Game::GameMode)':
Game.hpp:44:17: warning: 'Game::mode' will be initialized after
Game.hpp:37:9: warning: 'Label Game::you'
Game.cpp:10:1: warning: when initialized here
Game.cpp: In member function 'virtual Mode* Game::update()':
Game.cpp:141:41: warning: comparison between signed and unsigned integer expressions
Game.cpp:143:41: warning: comparison between signed and unsigned integer expressions
Game.cpp:149:57: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Actor.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Sprite.cpp
Sprite.hpp: In constructor 'AnimatedSprite::AnimatedSprite(TextureResource, int, int, int, bool)':
Sprite.hpp:28:11: warning: 'AnimatedSprite::ry' will be initialized after
Sprite.hpp:23:7: warning: 'int AnimatedSprite::speed'
Sprite.cpp:12:1: warning: when initialized here
Sprite.hpp:23:7: warning: 'AnimatedSprite::speed' will be initialized after
Sprite.hpp:22:7: warning: 'int AnimatedSprite::frame'
Sprite.cpp:12:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Global.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c RCRectangleShape.cpp
RCRectangleShape.hpp: In constructor 'RCRectangleShape::RCRectangleShape(const sf::Vector2f&, float, unsigned int)':
RCRectangleShape.hpp:21:9: warning: 'RCRectangleShape::r' will be initialized after
RCRectangleShape.hpp:19:16: warning: 'unsigned int RCRectangleShape::cornerPointCount'
RCRectangleShape.cpp:6:1: warning: when initialized here
RCRectangleShape.cpp: In member function 'void RCRectangleShape::setCorner(float, float, int)':
RCRectangleShape.cpp:23:18: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Player.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Bullet.cpp
In file included from Bullet.hpp:3:0,
from Bullet.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Label.cpp
Label.hpp: In constructor 'Label::Label(std::string, int, int, bool, sf::Uint8)':
Label.hpp:20:10: warning: 'Label::y' will be initialized after
Label.hpp:18:13: warning: 'sf::Uint8 Label::frameAlpha'
Label.cpp:3:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Eye.cpp
Eye.cpp: In static member function 'static void Eye::init()':
Eye.cpp:142:40: warning: comparison between signed and unsigned integer expressions
Eye.cpp:168:43: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Win.cpp
Win.hpp: In constructor 'Win::Win(int)':
Win.hpp:40:7: warning: 'Win::updateNumber' will be initialized after
Win.hpp:38:10: warning: 'Button Win::menu'
Win.cpp:39:1: warning: when initialized here
Win.hpp:39:14: warning: 'Win::score' will be initialized after
Win.hpp:37:14: warning: 'sf::Sprite Win::bg'
Win.cpp:39:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Lost.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Lost.hpp:14,
from Lost.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Lost.hpp: In constructor 'Lost::Lost(int, Game::GameMode)':
Lost.hpp:33:7: warning: 'Lost::score' will be initialized after
Lost.hpp:32:8: warning: 'Eye* Lost::psychoeye'
Lost.cpp:7:1: warning: when initialized here
Lost.hpp:40:14: warning: 'Lost::bg' will be initialized after
Lost.hpp:36:7: warning: 'int Lost::updateNumber'
Lost.cpp:7:1: warning: when initialized here
Lost.hpp:36:7: warning: 'Lost::updateNumber' will be initialized after
Lost.hpp:30:23: warning: 'Game::GameMode Lost::mode'
Lost.cpp:7:1: warning: when initialized here
Lost.cpp: In member function 'virtual Mode* Lost::update()':
Lost.cpp:52:4: warning: suggest explicit braces to avoid ambiguous 'else'
Lost.cpp:59:124: warning: comparison between signed and unsigned integer expressions
Lost.cpp: In member function 'virtual void Lost::draw(sf::RenderWindow*)':
Lost.cpp:88:27: warning: comparison between signed and unsigned integer expressions
Lost.cpp: In destructor 'virtual Lost::~Lost()':
Lost.cpp:126:27: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c ResourceManager.cpp
ResourceManager.cpp: In member function 'void ResourceManager::addTexture(TextureResource, char*, bool)':
ResourceManager.cpp:49:34: warning: comparison between signed and unsigned integer expressions
ResourceManager.cpp:50:35: warning: comparison between signed and unsigned integer expressions
ResourceManager.cpp: In member function 'void ResourceManager::init()':
ResourceManager.cpp:81:40: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:82:50: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:83:50: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:84:48: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:85:40: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:86:48: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:87:33: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:88:37: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:89:37: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:90:39: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:91:41: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:92:43: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:93:43: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:94:41: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:95:39: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:97:27: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:98:31: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:99:34: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:101:29: warning: deprecated conversion from string constant to 'char*'
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c ScoreManager.cpp
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 ?
edit :
J'ai oublié de dire que, tu compiles avec un Makefile, et ça c'est cool.
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é
Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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 !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.
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 :-)).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).
En effet, ce serait infiniment plus propre ; je note.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.
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.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 .
En effet, c'est corrigé (seulement chez moi pour l'instant, c'est toujours ça de pris), c'est toujours ça de pris.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.
É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.Bon maintenant je veux compiler. Et comme je suis un boulet, mes headers de SFML sont pas accessibles directement sous Cygwin. (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)
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.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.
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).
M'enfin voilà ce que j'ai sans le -pedantic et le -Werror =>
- Spoiler:
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Button.cpp
Button.hpp: In constructor 'Button::Button(std::string, int, int, sf::Uint8)':
Button.hpp:29:15: warning: 'Button::text' will be initialized after
Button.hpp:26:8: warning: 'bool Button::clicked'
Button.cpp:3:1: warning: when initialized here
Button.hpp:32:8: warning: 'Button::hovered' will be initialized after
Button.hpp:31:20: warning: 'RCRectangleShape Button::frame'
Button.cpp:3:1: warning: when initialized here
Button.hpp:31:20: warning: 'Button::frame' will be initialized after
Button.hpp:28:13: warning: 'sf::Uint8 Button::frameAlpha'
Button.cpp:3:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c main.cpp
main.cpp: In function 'int main(int, char**)':
main.cpp:70:76: warning: comparison between signed and unsigned integer expressions
main.cpp:76:41: warning: suggest braces around empty body in an 'else' statement
main.cpp:78:48: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Memory.cpp
In file included from Bullet.hpp:3:0,
from Memory.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Memory.cpp: In member function 'void Memory::updateMins()':
Memory.cpp:78:15: warning: unused variable 'timeStart'
Memory.cpp: At global scope:
Memory.cpp:283:6: warning: unused parameter 'r'
Memory.cpp:283:6: warning: unused parameter 'g'
Memory.cpp:283:6: warning: unused parameter 'b'
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Menu.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Menu.cpp:2:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Game.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Game.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Game.hpp: In constructor 'Game::Game(Game::GameMode)':
Game.hpp:44:17: warning: 'Game::mode' will be initialized after
Game.hpp:37:9: warning: 'Label Game::you'
Game.cpp:10:1: warning: when initialized here
Game.cpp: In member function 'virtual Mode* Game::update()':
Game.cpp:141:41: warning: comparison between signed and unsigned integer expressions
Game.cpp:143:41: warning: comparison between signed and unsigned integer expressions
Game.cpp:149:57: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Actor.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Sprite.cpp
Sprite.hpp: In constructor 'AnimatedSprite::AnimatedSprite(TextureResource, int, int, int, bool)':
Sprite.hpp:28:11: warning: 'AnimatedSprite::ry' will be initialized after
Sprite.hpp:23:7: warning: 'int AnimatedSprite::speed'
Sprite.cpp:12:1: warning: when initialized here
Sprite.hpp:23:7: warning: 'AnimatedSprite::speed' will be initialized after
Sprite.hpp:22:7: warning: 'int AnimatedSprite::frame'
Sprite.cpp:12:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Global.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c RCRectangleShape.cpp
RCRectangleShape.hpp: In constructor 'RCRectangleShape::RCRectangleShape(const sf::Vector2f&, float, unsigned int)':
RCRectangleShape.hpp:21:9: warning: 'RCRectangleShape::r' will be initialized after
RCRectangleShape.hpp:19:16: warning: 'unsigned int RCRectangleShape::cornerPointCount'
RCRectangleShape.cpp:6:1: warning: when initialized here
RCRectangleShape.cpp: In member function 'void RCRectangleShape::setCorner(float, float, int)':
RCRectangleShape.cpp:23:18: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Player.cpp
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Bullet.cpp
In file included from Bullet.hpp:3:0,
from Bullet.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Label.cpp
Label.hpp: In constructor 'Label::Label(std::string, int, int, bool, sf::Uint8)':
Label.hpp:20:10: warning: 'Label::y' will be initialized after
Label.hpp:18:13: warning: 'sf::Uint8 Label::frameAlpha'
Label.cpp:3:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Eye.cpp
Eye.cpp: In static member function 'static void Eye::init()':
Eye.cpp:142:40: warning: comparison between signed and unsigned integer expressions
Eye.cpp:168:43: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Win.cpp
Win.hpp: In constructor 'Win::Win(int)':
Win.hpp:40:7: warning: 'Win::updateNumber' will be initialized after
Win.hpp:38:10: warning: 'Button Win::menu'
Win.cpp:39:1: warning: when initialized here
Win.hpp:39:14: warning: 'Win::score' will be initialized after
Win.hpp:37:14: warning: 'sf::Sprite Win::bg'
Win.cpp:39:1: warning: when initialized here
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c Lost.cpp
In file included from Bullet.hpp:3:0,
from Game.hpp:6,
from Lost.hpp:14,
from Lost.cpp:1:
Memory.hpp:38:29: warning: type qualifiers ignored on function return type
Memory.hpp:39:41: warning: type qualifiers ignored on function return type
Memory.hpp:40:22: warning: type qualifiers ignored on function return type
Memory.hpp:41:43: warning: type qualifiers ignored on function return type
Lost.hpp: In constructor 'Lost::Lost(int, Game::GameMode)':
Lost.hpp:33:7: warning: 'Lost::score' will be initialized after
Lost.hpp:32:8: warning: 'Eye* Lost::psychoeye'
Lost.cpp:7:1: warning: when initialized here
Lost.hpp:40:14: warning: 'Lost::bg' will be initialized after
Lost.hpp:36:7: warning: 'int Lost::updateNumber'
Lost.cpp:7:1: warning: when initialized here
Lost.hpp:36:7: warning: 'Lost::updateNumber' will be initialized after
Lost.hpp:30:23: warning: 'Game::GameMode Lost::mode'
Lost.cpp:7:1: warning: when initialized here
Lost.cpp: In member function 'virtual Mode* Lost::update()':
Lost.cpp:52:4: warning: suggest explicit braces to avoid ambiguous 'else'
Lost.cpp:59:124: warning: comparison between signed and unsigned integer expressions
Lost.cpp: In member function 'virtual void Lost::draw(sf::RenderWindow*)':
Lost.cpp:88:27: warning: comparison between signed and unsigned integer expressions
Lost.cpp: In destructor 'virtual Lost::~Lost()':
Lost.cpp:126:27: warning: comparison between signed and unsigned integer expressions
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c ResourceManager.cpp
ResourceManager.cpp: In member function 'void ResourceManager::addTexture(TextureResource, char*, bool)':
ResourceManager.cpp:49:34: warning: comparison between signed and unsigned integer expressions
ResourceManager.cpp:50:35: warning: comparison between signed and unsigned integer expressions
ResourceManager.cpp: In member function 'void ResourceManager::init()':
ResourceManager.cpp:81:40: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:82:50: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:83:50: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:84:48: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:85:40: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:86:48: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:87:33: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:88:37: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:89:37: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:90:39: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:91:41: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:92:43: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:93:43: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:94:41: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:95:39: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:97:27: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:98:31: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:99:34: warning: deprecated conversion from string constant to 'char*'
ResourceManager.cpp:101:29: warning: deprecated conversion from string constant to 'char*'
g++ -g -Wall -Wextra -I ../sfml2/LaurentGomila-SFML-d7b4e26/include -c ScoreManager.cpp
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.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 ?
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.edit :
J'ai oublié de dire que, tu compiles avec un Makefile, et ça c'est cool.
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.
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).
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 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:
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 :-)edit 3 :
8565
J'arrête ici, j'ai pas envie d'en voir 8 à la fois me tomber dessus. o_ô
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- Easy
- Messages : 77
Date d'inscription : 04/08/2012
Age : 34
Profil Joueur
: TH07 - PCB
Niveau: Normal
Score: (non communiqué)
Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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.
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 ) :
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.
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.
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.
En fait, justement, j'étais par défaut sur la version 1.6 de SFML, donc sf::Texture était introuvable, par exemple. :pÉ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.
http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-classMoi 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).
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 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.
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é
Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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).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.
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é).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 ) :Si tu compiles sur ta machine pour ta machine, tu auras fort probablement 1 en valeur de retour.
- Code:
static const float flt1 = 5.f / 3.f;
int main ()
{
float flt2 = 5.f / 3.f;
return (flt1 == flt2);
}
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 ?).
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 :-)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.
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).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.
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- Easy
- Messages : 77
Date d'inscription : 04/08/2012
Age : 34
Profil Joueur
: TH07 - PCB
Niveau: Normal
Score: (non communiqué)
Re: Nekoculus : un jeu avec des yeux, un chat, et de l'esquive de balle
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é
Sujets similaires
» Les yeux verts de la jalousie brille au loin !
» [Validée] Le guide de la balle perdue - 東方文花帖 ~ Shoot the Bullet feat. Akiro
» La chance est avec toi ?
» Probleme avec l'IRC
» Problèmes avec AoCF
» [Validée] Le guide de la balle perdue - 東方文花帖 ~ Shoot the Bullet feat. Akiro
» La chance est avec toi ?
» Probleme avec l'IRC
» Problèmes avec AoCF
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum