PDA

Voir la version complète : Développez Couché, saison 1 : le topic officiel



Page : [1] 2

L-F. Sébum
02/10/2011, 16h24
DÉVELOPPEZ COUCHÉ
Dernière mise à jour : 20/08/2012



Bonjour tout le monde et bienvenue dans l'annexe on-line de la rubrique "Développez couché" de Canard PC.

Au fil du temps cette rubrique s'enrichira de nouveaux liens, exemples, bouts de code et de ressources à télécharger. Elle servira aussi de point de rencontre et de discussion pour tous ceux qui ont des questions/suggestions au sujet de la rubrique. J'essaierai d'être le plus présent possible même si je n'aurai pas forcément le temps de répondre à toutes vos questions.




A PROPOS DE LA RUBRIQUE :

Cette rubrique est "goal oriented". C'est du punk, pas du solfège : je ne vais pas vous parler pendant trois heures d'un concept pour être sûr que vous ayez tout compris et après seulement passer à la pratique.

Au contraire, je vous donne direct des éléments qui vous permettent
(1) de voir comment un jeu vidéo est gaulé à l'intérieur,
(2) de prendre rapidement plaisir à réaliser quelque chose.

Si vous voulez voir plus loin et créer votre propre jeu vous devrez aussi travailler un peu tout seul (d'où les liens "pour débutants" en bas de ce post). Un cours complet prendrait 4 pages de chaque mag.




PLANNING :

INTRODUCTION :
CPC 242 (15/10/2011) : Installation de Visual C# Express et de XNA

CHAPITRE 1 :
CPC 243 (1/11/2011) : Leçon 1 - Le concept de classe, importer des fichiers (sons, images...) dans les ressources d'un projet XNA, dessiner une image à l'écran
CPC 244 (15/11/2011) : Leçon 2 - Variables, conditions simples (if / else if), lire l'état du clavier
CPC 245 (1/12/2011) : Leçon 3 - Stockage des objets dans un tableau, les boucles "for"
CPC 246 (15/12/2011) : Leçon 4 - Détection des collisions, classe Random
CPC 247 (15/01/2012) : Leçon 5 - Score et effets sonores OMG, ON A UN "VRAI" JEU !
CPC 248 (01/02/2012) : Leçon 6 - Faire défiler un décor de fond
CPC 249 (15/02/2012) : Leçon 7 - Tirer des projectiles
CPC 250 (01/03/2012) : Leçon 8 - Enemis (1/2)
CPC 251 (15/03/2012) : Leçon 9 - Enemis (2/2)
===> Télécharger le code source complet de Canardage tel qu'il était APRES la leçon n°9 (CPC n°251), à la fin du premier chapitre. (ftp://ftp.canardpc.com/canardage_chapitre1.zip) (à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)


CHAPITRE 2 :
CPC 252 (01/04/2012) : Leçon 10 - Pixel shaders et post-processing
CPC 253 (15/04/2012) : Leçon 11 - Compteurs
CPC 254 (01/05/2012) : Leçon 12 - HUD et paramètres passés au shader
CPC 255 (15/05/2012) : Leçon 13 - Lecture/écriture de fichiers sur le disque
CPC 256 (01/06/2012) : Leçon 14 - Écrire du texte (à partir de fontes ou de polices "sprites")
CPC 258 (01/06/2012) : Leçon 15
CPC 259 (01/06/2012) : Leçon 16



CANARDAGE - LE CODE SOURCE COMPLET DU JEU :

Logiciels nécessaires : (!!! N'OUBLIEZ PAS D'INSTALLER TOUTES LES MISES A JOUR VIA WINDOWS UPDATE !!!)
- Environnement de développement Visual C# 2010 Express (http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express) (descendez un peu sur la page pour avoir la version française)
- Framework XNA 4.0 (http://www.microsoft.com/download/en/details.aspx?id=23714)

CHAPITRE 1 :

Le code source complet de Canardage tel qu'il était APRES la leçon n°9 (CPC n°251), à la fin du premier chapitre (contient tout le code et toutes les ressources) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_chapitre1.zip (ftp://ftp.canardpc.com/canardage_chapitre1.zip)

CHAPITRE 2 :

Le code source complet de Canardage tel qu'il était APRES la leçon n°10 (CPC n°252) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon10.zip (ftp://ftp.canardpc.com/canardage_lecon10.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°11 (CPC n°253) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon11.zip (ftp://ftp.canardpc.com/canardage_lecon11.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°12 (CPC n°254) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon12.zip (ftp://ftp.canardpc.com/canardage_lecon12.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°13 (CPC n°255) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon13.zip (ftp://ftp.canardpc.com/canardage_lecon13.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°14 (CPC n°256) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon14.zip (ftp://ftp.canardpc.com/canardage_lecon14.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°15 (CPC n°258) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon15.zip (ftp://ftp.canardpc.com/canardage_lecon15.zip)

Le code source complet de Canardage tel qu'il était APRES la leçon n°16 (CPC n°259) :
(à décompresser dans C:\Users\[VOTRE NOM]\Documents\Visual Studio 2010\Projects\Canardage)
- canardage_lecon16.zip (ftp://ftp.canardpc.com/canardage_lecon16.zip)






RESSOURCES A TÉLÉCHARGER :

Ressources nécessaires à la leçon n°10 (Canard PC n°252) :
- PostProcess.fx (ftp://ftp.canardpc.com/PostProcess.fx)

Ressources nécessaires à la leçon n°11 (Canard PC n°253) :
- warpzone.wma (ftp://ftp.canardpc.com/warpzone.wma)

Ressources nécessaires à la leçon n°16 (Canard PC n°259) :
- canardage_lapin2.png (ftp://ftp.canardpc.com/canardage_lapin2.png)
- particule.png (ftp://ftp.canardpc.com/particule.png)

Ressources nécessaires aux leçons précédentes (celles du chapitre 1) :

- boing.wav (ftp://ftp.canardpc.com/boing.wav)
- canardage_lapin.png (ftp://ftp.canardpc.com/canardage_lapin.png)
- ciel.jpg (ftp://ftp.canardpc.com/ciel.jpg)
- ciel1.png (ftp://ftp.canardpc.com/ciel1.png)
- ciel2.png (ftp://ftp.canardpc.com/ciel2.png)
- gros_lapin.png (ftp://ftp.canardpc.com/gros_lapin.png)
- music.wma (ftp://ftp.canardpc.com/music.wma)
- panpan.wav (ftp://ftp.canardpc.com/panpan.wav)
- police2.png (ftp://ftp.canardpc.com/police2.png)
- pouet.wav (ftp://ftp.canardpc.com/pouet.wav)
- saucisse.png (ftp://ftp.canardpc.com/saucisse.png)
- tir.png (ftp://ftp.canardpc.com/tir.png)




LIENS UTILES :

NIVEAU GRAND DÉBUTANT : (jamais programmé auparavant)
- Le tutoriel C# du site du zéro. Lien (http://www.siteduzero.com/tutoriel-3-344102-apprenez-a-programmer-en-c-sur-net.html) (en français)

NIVEAU DÉBUTANT : (déjà programmé un peu mais jamais en C#)
- Un excellent cours d'introduction au C# par Serge Tahé, prof à l'université d'Angers. Lien (http://tahe.ftp-developpez.com/fichiers-archive/csharp2008.pdf) (PDF, 20 mégas) (en français)
- Le tutorial HLSL de FaceWound, la meilleure introduction aux pixel-shaders DirectX qu'on puisse trouver sur Internet. Lien (http://www.facewound.com/tutorials/shader1/) (en anglais)

SITES DE RÉFÉRENCE POUR TOUS NIVEAUX : (pas trop débutant quand même)
- CSharp.fr, plein de bouts de codes pour tout et n'importe quoi. Lien (http://www.csharpfr.com/) (en français)
- XNA-Connection.com, axé sur le développement de jeux avec XNA. Lien (http://www.xna-connection.com/) (en français)




AU FAIT, POURQUOI XNA ?

Parmi les milliers de langages, de frameworks et d'outils de développement disponibles en ce monde abandonné de Dieu, pourquoi avoir choisi le combo C# + XNA ? Plusieurs réponses à cela, que je suis heureux de vous fournir ici, dans un accès de transparence à faire pâlir de jalousie Eva Joly.

- Les "kits de développements" (que ce soient des outils pour neuneus type "FPS Creator" ou de vrais frameworks professionnels comme l'Unreal Development Kit) ne sont pas adaptés à une rubrique pédagogique. Quelqu'un qui a appris à utiliser l'UDK saura utiliser... l'UDK. Quelqu'un qui a appris les bases de l'algorithmique avec un vrai langage saura s'adapter à peu près à n'importe quoi.

- Pour cette même raison, il fallait un vrai langage orienté objet traditionnel (comprendre : pas Flash), si possible avec une syntaxe classique (comprendre : inspirée du C, pas de Visual Basic) et relativement facile d'accès (comprendre : pas le C++).

- Les outils de développement de C# (tout du moins dans leur version "express", que nous allons utiliser) sont gratuits.

- Même si le but est d'apprendre à programmer, c'est surtout la programmation de jeux qui nous intéresse (quel genre de taré est excité à l'idée de créer un tableur ?) XNA, qui permet de travailler très facilement sur les shaders DirectX et la gestion des ressources, est parfaitement adapté à celui qui veut découvrir les outils du développement de jeux modernes. Ca aurait été difficile en Java.

- Enfin, soyons honnêtes, parce que je connais parfaitement le langage et les bibliothèques et qu'écrire cette rubrique en Java m'aurait pris dix fois plus de temps.

Conan3D
23/10/2011, 22h46
Tu sais que je t'aime toi? :wub:

Tomaka17
23/10/2011, 22h54
relativement facile d'accès (comprendre : pas le C++).Han, je conteste cette phrase. Le C++ n'est pas plus compliqué qu'un autre langage, il possède simplement plus de features complexes que les autres. Features dont on peut tout à fait se passer si on ne les connaît pas.

[/fanboy du C++]

L-F. Sébum
23/10/2011, 23h05
Han, je conteste cette phrase. Le C++ n'est pas plus compliqué qu'un autre langage, il possède simplement plus de features complexes que les autres. Features dont on peut tout à fait se passer si on ne les connaît pas.

S'en passer totalement ? Non. Et à raison d'une page par numéro de CPC, je n'avais pas envie de perdre de la place en expliquant à de grands débutants la différence entre variable, *variable et &variable. L'idée c'est d'être capable (dans un premier temps) de faire un mini-shoot them up DirectX en cent lignes de code. Difficile en C++.

war-p
23/10/2011, 23h13
Sébum, veux-tu faire des enfants avec moi : je t'aime!
(Et sinon, je confirme, faire un shoot en c++, c'est la loose, alors qu'en c#, je pense que c'est même faisable en windows form :ninja:)

Tomaka17
23/10/2011, 23h17
S'en passer totalement ? Non. Et à raison d'une page par numéro de CPC, je n'avais pas envie de perdre de la place en expliquant à de grands débutants la différence entre variable, *variable et &variable. L'idée c'est d'être capable (dans un premier temps) de faire un mini-shoot them up DirectX en cent lignes de code. Difficile en C++.

Je comprends, mais j'avais pas envie de voir mon langage favoris dénigré en faveur d'un vulgaire clone sans même me défendre :p
(même si, avec GLUT ou avec la SDL, je pense qu'il est possible de coder un shmup en 100 lignes en C++ :ninja: )

J'ai déjà un peu d'expérience dans le fonctionnement d'un jeu vidéo (euphémisme), mais je sens que la rubrique va beaucoup m'intéresser quand même

TheToune
23/10/2011, 23h17
Oui mais le c++ c'est beau, c'est comme un poème !
Sinon évidement pour ce genre de projet le choix du c# est totalement justifié ...

jahwarrior
24/10/2011, 12h53
La programmation j'y pige pas grand chose, mais je trouve l'idée intéressante donc je te suis.

Première étape, ok. Vivement la suite.

Orhin
24/10/2011, 23h31
Ça donne l'eau à la bouche tout ça, vivement la suite.

Et je plussoie les liens, le site XNA-connection recèle de petites perles de ce genre : http://www.xna-connection.com/post/Indiefreaks-Game-Framework

L-F. Sébum
24/10/2011, 23h53
Ça donne l'eau à la bouche tout ça, vivement la suite. Et je plussoie les liens, le site XNA-connection recèle de petites perles de ce genre : http://www.xna-connection.com/post/Indiefreaks-Game-Framework

Si tu en es à ce niveau là, la rubrique ne te concerne pas vraiment. Elle est destinée aux grands débutants.

Tiens, puisqu'on en est à faire étalage des belles choses qu'on peut faire avec XNA, un screen du moteur 3D sur lequel je suis en train de bosser :

http://tof.canardpc.com/preview2/88f557cc-0213-4e82-a458-40a41d18ee5b.jpg (http://tof.canardpc.com/view/88f557cc-0213-4e82-a458-40a41d18ee5b.jpg)
XNA, c'est du lourd.

trex
25/10/2011, 03h11
Merde t'a plus de main pour recharger ! :ninja:

Belhoriann
25/10/2011, 13h08
Si tu en es à ce niveau là, la rubrique ne te concerne pas vraiment. Elle est destinée aux grands débutants.

Tiens, puisqu'on en est à faire étalage des belles choses qu'on peut faire avec XNA, un screen du moteur 3D sur lequel je suis en train de bosser :

http://tof.canardpc.com/preview2/88f557cc-0213-4e82-a458-40a41d18ee5b.jpg (http://tof.canardpc.com/view/88f557cc-0213-4e82-a458-40a41d18ee5b.jpg)
XNA, c'est du lourd.

Amnesia : SINGLE BARREL SHOTGUN Edition :bave:

Raddi
25/10/2011, 13h18
Bon, vous moquez pas, hein mais j'ai une question d'idiot archi débutant : quand on installe le Visual C# machin, est-ce qu'il faut télécharger et installer tout le contenu supplémentaire qu'on me propose ? Ou juste le truc par défaut, le minimum ? Voilà voilà, je vais me cacher.

Belhoriann
25/10/2011, 13h45
Moi il ne m'a proposé que le SQL machin truc, j'ai dit non.

TheToune
25/10/2011, 14h09
Merde t'a plus de main pour recharger ! :ninja:

Pas besoin des mains ... :trollface:

gros_bidule
25/10/2011, 14h13
Il suffit de faire tourner l'arme sur elle-même, comme dans MW2 :ninja:
Quoi, tu pensais à autre chose ?

@Raddi,
vi, le SQL Server 2008 Express Service Pack 1, tu peux t'en passer ici, tout comme de Silverlight (si tu ne l'as pas installé).
Au pire, si un jour tu en as besoin, tu vas dans l'ajout/suppression de programmes, tu te positionnes sur Visual C# 2010 Express, et au lieu de Supprimer tu demandes à Modifier l'installation.

L-F. Sébum
25/10/2011, 16h13
Amnesia : SINGLE BARREL SHOTGUN Edition :bave:

Exactement. Et il y a des DOUBLE-BARRELED SHOTGUN™ aussi. Mais je créerai un topic consacré d'ici un ou deux mois. Il me faudra des beta-testeurs.

Pour le moment, revenons au sujet


Quand on installe le Visual C# machin, est-ce qu'il faut télécharger et installer tout le contenu supplémentaire qu'on me propose ? Ou juste le truc par défaut, le minimum ?

Juste le minimum. Mais bonne question, j'aurai dû préciser.

Bon, sinon j'ai fini le "développez couché" du 243, la première "vraie" leçon : comment dessiner une sprite à l'écran.

Belhoriann
25/10/2011, 16h36
Exactement. Et il y a des DOUBLE-BARRELED SHOTGUN™ aussi. Mais je créerai un topic consacré d'ici un ou deux mois. Il me faudra des beta-testeurs.

Pour le moment, revenons au sujet



Juste le minimum. Mais bonne question, j'aurai dû préciser.

Bon, sinon j'ai fini le "développez couché" du 243, la première "vraie" leçon : comment dessiner une sprite à l'écran.

Avec tous les fétichistes du DOUBLE-BARRELED SHOTGUN qui traînent sur CPC tu ne vas pas avoir de mal à en trouver des beta-testeurs !

Sinon le jeu que tu nous proposes de faire c'est une sorte d'Asteroids ?

L-F. Sébum
25/10/2011, 17h04
Sinon le jeu que tu nous proposes de faire c'est une sorte d'Asteroids ?

Dans un premier temps ce sera un shooter à scrolling horizontal.

Après on verra.

Grosnours
25/10/2011, 17h04
- Pour cette même raison, il fallait un vrai langage orienté objet traditionnel (comprendre : pas Flash)

Oh, la belle guerre de religion sur ce qu'est un "vrai" langage orienté objet !
Sinon AS a fait de gros progrès depuis quelques années et Flex 4.5 est un OOP. Ceci dit, c'est une excellente idée, peu contestable, de prendre C# pour cette rubrique. ;)

kilfou
25/10/2011, 17h04
Et Doomed Again ? :emo:

olih
25/10/2011, 17h18
Et Doomed Again ? :emo:
Trop bas niveau le C/C++ :emo:.
Et ça s'appuyait sur un moteur existant donc pas très intéressant pour apprendre les bases.

Madvince
25/10/2011, 17h28
Fanboy C++ inside aussi.
Mais je comprends le choix de Sébum pour le C# pour le côté pédagogique.
Topic et articles à suivre de prêt !

Belhoriann
25/10/2011, 17h58
Dans un premier temps ce sera un shooter à scrolling horizontal.

Après on verra.

Ok, je ne sais pas pourquoi j'étais parti dans l'idée d'un shooter spatial.

Autre petite question : j'ai vu que Space Pirate and Zombies a été développé sur le Torque Engine. J'adore le rendu du jeu, avec une impression de profondeur jouant sur la différence de vitesse de déplacement d'images en 2D. Est-il possible d'obtenir le même rendu avec XNA ?

LaVaBo
25/10/2011, 18h11
Ok, je ne sais pas pourquoi j'étais parti dans l'idée d'un shooter spatial.

Autre petite question : j'ai vu que Space Pirate and Zombies a été développé sur le Torque Engine. J'adore le rendu du jeu, avec une impression de profondeur jouant sur la différence de vitesse de déplacement d'images en 2D. Est-il possible d'obtenir le même rendu avec XNA ?

Ca doit être possible avec n'importe quel langage qui permet d'afficher des images.

Tu affiches ton background, puis les sprites (par ex images de planètes, d'étoiles) à déplacer, dans l'ordre du plan le plus bas vers le plan le plus haut, avec une formule de déplacement différente pour chaque plan. Faudra juste passer un peu de temps à ajuster les formules de déplacement pour pas que ça file la gerbe.

TheToune
25/10/2011, 18h27
Ok, je ne sais pas pourquoi j'étais parti dans l'idée d'un shooter spatial.

Autre petite question : j'ai vu que Space Pirate and Zombies a été développé sur le Torque Engine. J'adore le rendu du jeu, avec une impression de profondeur jouant sur la différence de vitesse de déplacement d'images en 2D. Est-il possible d'obtenir le même rendu avec XNA ?

En l’occurrence ce n'est pas une question de moteur ou même de langage ... Juste d'un effet d'affichage.

Belhoriann
25/10/2011, 18h38
En l’occurrence ce n'est pas une question de moteur ou même de langage ... Juste d'un effet d'affichage.


Ca doit être possible avec n'importe quel langage qui permet d'afficher des images.

Tu affiches ton background, puis les sprites (par ex images de planètes, d'étoiles) à déplacer, dans l'ordre du plan le plus bas vers le plan le plus haut, avec une formule de déplacement différente pour chaque plan. Faudra juste passer un peu de temps à ajuster les formules de déplacement pour pas que ça file la gerbe.

Ok merci à vous deux. J'aimerais réaliser, avec l'aide de cette rubrique, un premier jeu simple du style Space Pirate and Zombies version très light pour me faire la main.
J'envisage de créer une caméra pour pouvoir scroller, zoomer et effectuer des rotations (du style : http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/). Pour avoir une impression de profondeur il faudrait donc utiliser des techniques de parallaxe scrolling, du genre :

1u5cGZPdyEk

Tu vas utiliser cela dans cette rubrique maître Sebum ?

Orhin
25/10/2011, 18h40
Autre petite question : j'ai vu que Space Pirate and Zombies a été développé sur le Torque Engine. J'adore le rendu du jeu, avec une impression de profondeur jouant sur la différence de vitesse de déplacement d'images en 2D. Est-il possible d'obtenir le même rendu avec XNA ?
Ça s'appelle du paralax scrolling et c'est plutôt simple à mettre en place, tuto sur le site XNA-connection : http://www.xna-connection.com/post/Tutoriel-de-scrolling-parallaxe-avec-XNA
;)

L-F. Sébum
25/10/2011, 18h56
Tu vas utiliser cela dans cette rubrique maître Sebum ?

Oui. On utilisera aussi des pixel shaders et du post-processing pour ajouter des effets qui tuent aux différents plans du monde. Ca sera de la 2D, oui, mais de la 2D qui roxxe.

Pas tout de suite par contre. Je vous rappelle que la rubrique s'adresse à des gens qui n'ont JAMAIS programmé. Les premières leçons seront plutôt du genre "dessiner une sprite", "comment savoir quelles touches du clavier sont pressées ?", "créer une classe", "enregistrer une valeur dans une variable", "if...else if...", etc.

Belhoriann
25/10/2011, 19h03
Ça s'appelle du paralax scrolling et c'est plutôt simple à mettre en place, tuto sur le site XNA-connection : http://www.xna-connection.com/post/Tutoriel-de-scrolling-parallaxe-avec-XNA
;)

J't'ai grillé :p


Oui. On utilisera aussi des pixel shaders et du post-processing pour ajouter des effets qui tuent aux différents plans du monde. Ca sera de la 2D, oui, mais de la 2D qui roxxe.

Pas tout de suite par contre. Je vous rappelle que la rubrique s'adresse à des gens qui n'ont JAMAIS programmé. Les premières leçons seront plutôt du genre "dessiner une sprite", "comment savoir quelles touches du clavier sont pressées ?", "créer une classe", "enregistrer une valeur dans une variable", "if...else if...", etc.

C'est parfait. Je t'enverrai un brouette de billets verts quand ma piscine en sera remplie grâce à mon jeu révolutionnairement banal :cigare:

L-F. Sébum
25/10/2011, 19h05
C'est parfait. Je t'enverrai un brouette de billets verts quand ma piscine en sera remplie grâce à mon jeu révolutionnairement banal :cigare:

Pas de problème.

En attendant, si tu comptes vraiment te mettre au développement, n'hésite pas à lire les liens "pour débutants" dans le post d'ouverture. Ça te permettra de comprendre beaucoup mieux (et beaucoup plus vite) tout ce dont je vais parler.

[dT] Moustik
25/10/2011, 19h08
Cette rubrique tombe à point nommé ! Moi qui commençais à avoir une ébauche de concept ! :lol:

Par contre, je ne prévoit pas de faire un shoot'em up... :rolleyes:

Belhoriann
25/10/2011, 19h25
Pas de problème.

En attendant, si tu comptes vraiment te mettre au développement, n'hésite pas à lire les liens "pour débutants" dans le post d'ouverture. Ça te permettra de comprendre beaucoup mieux (et beaucoup plus vite) tout ce dont je vais parler.

Ok je vais suivre ton conseil. J'ai des notions grâce à mes essais sur l'UDK, mais c'est pas solide pour un sou.


Moustik;4799750']Cette rubrique tombe à point nommé ! Moi qui commençais à avoir une ébauche de concept ! :lol:

Par contre, je ne prévoit pas de faire un shoot'em up... :rolleyes:

Tiens j'y pense, ça pourrait être pas mal que chacun liste ses futurs projets. On sait jamais, si 2 personnes veulent faire un jeu de flipper ça serait con qu'ils développent dans leur coin.

L-F. Sébum
25/10/2011, 19h28
Tiens j'y pense, ça pourrait être pas mal que chacun liste ses futurs projets. On sait jamais, si 2 personnes veulent faire un jeu de flipper ça serait con qu'ils développent dans leur coin.

Bonne idée, mais c'est justement le but de la section "le coin des développeurs".

On va éviter de tout mettre dans ce topic sinon ça va devenir illisible. Ici, on cause de "développez couché" et puis c'est tout.

Touze
25/10/2011, 19h31
Va y avoir un tuto contre la procrastination dans cette rubrique ?:ninja:

Belhoriann
25/10/2011, 19h33
Bonne idée, mais c'est justement le but de la section "le coin des développeurs".

On va éviter de tout mettre dans ce topic sinon ça va devenir illisible. Ici, on cause de "développez couché" et puis c'est tout.

Ouais c'est vrai pas con.

Vuzi
25/10/2011, 19h39
Miam cette rubrique. Même si pour l'instant je sais juste faire des truc merdiques en C, ça va me motiver :bave:

gros_bidule
25/10/2011, 19h52
Une question au fait : y'a t-il une estimation du nombre de "numéros" nécessaires pour arriver au bout du projet ? (le projet est déjà fait où c'est de la totale impro ? :))
Histoire de savoir si ça fait comme les magazines où il faut acheter 2 ans de numéros pour monter un petit moulin à vent, ou si c'est codé-packagé-distribué-megasuccès-femmes d'ici noël.
Juste par curiosité. De toute façon je suivrai.

L-F. Sébum
25/10/2011, 20h20
Une question au fait : y'a t-il une estimation du nombre de "numéros" nécessaires pour arriver au bout du projet ?

(sous réserve -- tout n'est pas terminé)

D'ici Noël tu auras les bases : dessiner un truc sur l'écran, le déplacer, les concepts de base de la programmation orientée objet

D'ici à l'été tu auras un "petit jeu" complet : ennemis sur lesquels tu pourras tirer, décor, détection des collisions, début de la programmation GPU avec des pixel shaders pour le post-processing...

La deuxième saison (à partir de septembre 2012) sera un cours plus avancé : interface/configuration, post-processing plus complexes (bloom/HDR), IA plus complexe (pathfinding, etc... pas juste "foncer sur le joueur"), quelques effets 3D.

Il faut surtout savoir que cette rubrique est "goal oriented". C'est du punk, pas du solfège : je ne vais pas vous parler pendant trois heures d'un concept pour être sûr que vous ayez tout compris et après seulement passer à la pratique.
Au contraire, je vous donne direct des éléments qui vous permettent (1) de voir comment un jeu vidéo est gaulé à l'intérieur, (2) de prendre rapidement plaisir à réaliser quelque chose.

Si vous voulez voir plus loin et créer votre propre jeu vous devrez aussi travailler un peu tout seul (d'où les liens dans le premier post du topic). Un cours complet prendrait 4 pages de chaque mag.

Tomaka17
25/10/2011, 20h47
Je me demande comment tu vas expliquer la notion de pixel shader à des gens qui viennent d'apprendre les bases de la programmation :ninja:

Sinon j'ai commencé à coder un jeu en C++ il y a quelques semaines (pendant le temps libre), et je me demande si ça intéresserait des gens que je post ici (dans ce sous-forum, pas dans ce topic) des mini-comptes rendus avec morceaux de code et tout ? Histoire de montrer comment les vrais hommes codent les jeux (en C++)
J'ai pas la prétention d'être un pro du jeu vidéo, mais je pense avoir assez d'expérience pour ne pas trop dire de conneries
EDIT : sans moteur, uniquement avec DirectX

L-F. Sébum
25/10/2011, 20h55
Je me demande comment tu vas expliquer la notion de pixel shader à des gens qui viennent d'apprendre les bases de la programmation :ninja:

C'est pas compliqué. Le post-processing c'est vraiment comme travailler sur une image 2D avec un logiciel de retouche d'image à partir des coordonnées d'un pixel et de sa couleur.

Myron
25/10/2011, 21h13
Super initiative! :)

Raddi
26/10/2011, 09h46
Merci pour les précisions et j'enchaîne : après avoir lancé windows update, on me propose d'installer le SP1 de Visual Studio... A faire ?
:unsure:

Edit : bon je l'ai fait, c'est recommandé apparemment. Etape 1 terminée... Ouf.

Belhoriann
26/10/2011, 11h32
Merci pour les précisions et j'enchaîne : après avoir lancé windows update, on me propose d'installer le SP1 de Visual Studio... A faire ?
:unsure:

Edit : bon je l'ai fait, c'est recommandé apparemment. Etape 1 terminée... Ouf.

T'en fait pas, t'es pas le seul noob ici. Genre j'ai appris hier soir qu'on ne disait pas C dièse mais C Sharp :cigare:

Raddi
26/10/2011, 11h34
:o...

jahwarrior
26/10/2011, 11h35
Je suis en parallèle le tuto du zéro qui est vraiment bien foutu, pour les grands noobs comme moi.

gros_bidule
26/10/2011, 13h26
T'en fait pas, t'es pas le seul noob ici. Genre j'ai appris hier soir qu'on ne disait pas C dièse mais C Sharp :cigare:

Ne te fais pas avoir by ces über-francophobes. A les listener, il "faudrait" aussi say "dot net" instead de "point net" ;)
En fraaaaance, on a le droit de dire "cé dièse", na. En tout cas c'est d'usage, et ça ne choquera que les barbus célibataires qui de toute façon ne jurent que par le C/C++.

Raddi
26/10/2011, 13h29
D'ailleurs on dit "C plus plus" ou "C deux plus" ou.... ? (Tant qu'on est dans les questions pointues)

gros_bidule
26/10/2011, 13h30
"C plus plus", là c'est unanime, international, interplanétaire ! :)

LaVaBo
26/10/2011, 17h22
"C plus plus", là c'est unanime, international, interplanétaire ! :)

Ci pleuss pleuss, s'il te plaît.

[dT] Moustik
26/10/2011, 18h55
J'ai une question pertinente !! :lol:

Pourquoi "Développez-couché" ??

Non, parce que... personnellement, je préfère programmer assis... :cigare:

Conan3D
26/10/2011, 18h57
Moustik;4803089']J'ai une question pertinente !! :lol:

Pourquoi "Développez-couché" ??

Non, parce que... personnellement, je préfère programmer assis... :cigare:

:tired:

gregounech
26/10/2011, 19h05
J'ai acces a MSDNAA par mon Université et peut prendre Microsoft Visual Studio Premium, ca sert a quelque chose par rapport a Visual C# Express ? Ou les fonctionnalités ajoutées sont inutiles ?

EDITHE : Je viens de regarder le prix du bouzin habituellement


$5,469.00

Ah.

Ok.

EDIT2 : Et puis aussi que je critique un peu, ce serait pas possible d'avoir 2 pages parce que la ca fait un peu compressé et (a part la ou l'installation dure 3h a cause de windows de chie) enfin de compte on a peu de choses a faire. Sur 2 pages, on pourrait donc mettre plus d'image (ou plus grandes) et un peu plus de contenu pour aller un peu plus vite.

Møgluglu
26/10/2011, 19h42
J'ai acces a MSDNAA par mon Université et peut prendre Microsoft Visual Studio Premium, ca sert a quelque chose par rapport a Visual C# Express ?

Réponse courte : non.

Tu as des trucs totalement inutiles comme SQL Server, et des trucs pas tout à fait inutiles mais que tu n'utiliseras jamais comme leur outil d'analyse statique qui sert à repérer des bugs dans des projets de millions de lignes de code.

Belhoriann
26/10/2011, 19h48
Tu vas nous coder un Battlefield avec un netcode digne de ce nom Gregou ?

gregounech
26/10/2011, 20h04
Tu vas nous coder un Battlefield avec un netcode digne de ce nom Gregou ?

Oui.

Modern Warfare : Battlefield.

TheToune
26/10/2011, 20h11
J'ai acces a MSDNAA par mon Université et peut prendre Microsoft Visual Studio Premium, ca sert a quelque chose par rapport a Visual C# Express ? Ou les fonctionnalités ajoutées sont inutiles ?

EDITHE : Je viens de regarder le prix du bouzin habituellement



Ah.

Ok.

EDIT2 : Et puis aussi que je critique un peu, ce serait pas possible d'avoir 2 pages parce que la ca fait un peu compressé et (a part la ou l'installation dure 3h a cause de windows de chie) enfin de compte on a peu de choses a faire. Sur 2 pages, on pourrait donc mettre plus d'image (ou plus grandes) et un peu plus de contenu pour aller un peu plus vite.

Tu gagne tous les languages unifié dans le même soft, les editeurs de ressources ( pour faire des dialogues windows), des outils de debug plus poussés, des outils de distributions, des compatibilités suplémentaire avec certains format de ressources, l'aide en locale etc ...
Ca n'est pas absolument indispensable, surtour pour cette rubrique, mais comme c'est gratuit ça vaut effectivement le coup, surtout que l'interface ne te noie pas forcément sous les fonctionalités suplémentaires et que certaines finissent par être utile.

gros_bidule
26/10/2011, 20h15
Disons que pour ce que nous allons voir ici, la version Express est suffisante.
Parcontre, profites de ton abonnement MSDNAA pour téléchoper tout ce qui t'intéresse, et n'oublies pas de noter les clefs d'activation. Une fois ton abo terminé, tu n'y auras plus accès. Et surtout, surtout, ne t'amuses pas à téléchoper un logiciel en te disant que tu pourras revenir plus tard pour noter la clef CD : depuis pas trop longtemps tu ne peux télécharger qu'une seule fois les logiciels, ainsi qu'afficher la clef-CD. J'en connais plus d'un qui ont raté leur accès à Visual Studio, Seven, etc. Bref, quand tu veux un logiciel : télécharges-le d'un coup, le plus vite possible (y'a la reprise de DL, mais c'est parfois foireux, et ça ne dure pas 300 ans).
Ce que tu as via MSDNAA est pour un usage strictement personnel (et bien évidemment non commercial), mais ça serait bête de passer à côté. Si un jour tu veux te former à un langage ou une plateforme Mictosoft, tu seras content d'avoir une version complète, légale et gratos.

L-F. Sébum
27/10/2011, 00h14
EDIT2 : Et puis aussi que je critique un peu, ce serait pas possible d'avoir 2 pages parce que la ca fait un peu compressé et (a part la ou l'installation dure 3h a cause de windows de chie) enfin de compte on a peu de choses a faire. Sur 2 pages, on pourrait donc mettre plus d'image (ou plus grandes) et un peu plus de contenu pour aller un peu plus vite.

On verra. Ça dépendra des retours après les premières "vraies" leçons (parce que pour le moment on a surtout installé l'IDE).

Belhoriann
27/10/2011, 13h02
Moi franchement je suis 100% pour que cette rubrique s'étale de tout son long sur 2 pages. On irait en effet plus vite, ça serait plus clair et détaillé. M'enfin après on connait bien les restrictions de place.

gros_bidule
27/10/2011, 13h12
D'un autre côté rien n'empêche de détailler sur ce thread.
Ca serait dommage de transformer le mag en revue pour développeurs :)

Belhoriann
27/10/2011, 13h29
Vrai, quand les premières lignes de code commenceront à pleuvoir, on pourra au moins utiliser ce topic pour partager des idées pour tweaker ce que Sebum nous proposera.

olih
27/10/2011, 13h36
Et le copier coller, c'est plus simple ici que sur un article en papier :ninja:.

L-F. Sébum
27/10/2011, 14h05
Vrai, quand les premières lignes de code commenceront à pleuvoir, on pourra au moins utiliser ce topic pour partager des idées pour tweaker ce que Sebum nous proposera.

C'est l'idée.

Sinon, j'ai mis à jour le post d'ouverture avec le planning (pas définitif mais qui ne devrait pas trop changer) jusqu'à Noël.

Teto
27/10/2011, 14h05
Et comme ça ça obligera ceux qui sont intéressés d'acheter le canard pour avoir tous les morceaux.

Ah, on me souffle dans l'oreillette que c'est la même technique qui est utilisée dans certains jeux récents... :troll:

war-p
27/10/2011, 14h16
A ceci près que les jeux récents sont beaucoup moins intellectuels que la programmation...

Teto
27/10/2011, 14h24
Certes. :rire:

Troll mis à part, et pourquoi pas, quand le jeu sera terminé, ne pas sortir tous les articles + bonus sur le forum + mises à jours/améliorations dans un livre ?
-> Développez couché, éditions CanardPC.

Mois je trouve que ça claque bien.

TheToune
27/10/2011, 14h45
Et comme ça ça obligera ceux qui sont intéressés d'acheter le canard pour avoir tous les morceaux.

Ah, on me souffle dans l'oreillette que c'est la même technique qui est utilisée dans certains jeux récents... :troll:

Tain les salaud de rédacteurs qui veulent être payé pour leur travail en vendant le mag alors qu'ils pourraient travailler gratuitement pour le bien de l'humanité !

Teto
27/10/2011, 15h04
? Je crois que tu ne prends pas le problème dans le bon sens. C'est pas du tout ce que je voulais dire. Mais c'est pas grave. :)

TheToune
27/10/2011, 15h11
? Je crois que tu ne prends pas le problème dans le bon sens. C'est pas du tout ce que je voulais dire. Mais c'est pas grave. :)

Si c'est le cas je m'excuse de mon incompréhension et de ma vive réaction.
Faisons des bébés c++ ensemble ! A non merde c'est du c# ici et c'est contre ma religion, mes parents n'accepterons jamais ! :ph34r:

gros_bidule
27/10/2011, 15h26
Amouuuur gloire et beautééééé, une histoire qui fait flooooooder ! Teto et TheToune (tiens, les pseudo s'accordent assez bien !) auront-ils un enfant ? :ninja:

Plus sérieusement, ça vaudrait le coup de voir une fois le tutoriel achevé, l'année prochaine donc.
Le mag étant bi-mensuel, on aura un total de ~6 pages une fois fin 2011. On rajoute ~12 pages pour arriver mi 2012, ça nous fait dans les ~18 pages.
Naaaan mais pt'i pfff grrr tu crois qu'ça faut un bouquin, hein, hein ? ;)

ascdz
27/10/2011, 15h30
Euh il y a un truc que je suis pas sur d'avoir compris, savoir programmer en C# est un prérequis pour pouvoir suivre cette rubrique ?

[dT] Moustik
27/10/2011, 16h54
A priori non. Puisque, si j'ai bien compris, c'est censé s'adresser à des néophytes.

Après, effectivement, avoir déjà des bases en programmation orienté objet facilitera forcement l'exercice.

ascdz
27/10/2011, 16h58
J'epsère bien, car d'après le site du zero, c'est deux mois d'apprentissage :tired:

Conan3D
27/10/2011, 17h08
Perso je sais programmer en Quick Basic alors bon :cigare:

TheToune
27/10/2011, 17h49
Et moi j'ai fait mes première armes sur du Basic Amstrad ! Pas de fonctions, n'y même un éditeur. On numérotait les lignes en 10 par 10 pour garder de la place au cas où. Et à l’époque pas d'internet pour comprendre des trucs : on était seul face à son code.
OUI MONSIEUR !

J'avais fait des jeux et des outils vachement bien à l’époque ( dont un éditeur de sprite et d'animation en pixel art ) ! Ils sont perdu à tout jamais ! :emo:

ascdz
27/10/2011, 18h10
arf, parfois, je regrette d'être jeune !

Conan3D
27/10/2011, 18h11
Et moi j'ai fait mes première armes sur du Basic Amstrad ! Pas de fonctions, n'y même un éditeur. On numérotait les lignes en 10 par 10 pour garder de la place au cas où. Et à l’époque pas d'internet pour comprendre des trucs : on était seul face à son code.
OUI MONSIEUR !

J'avais fait des jeux et des outils vachement bien à l’époque ( dont un éditeur de sprite et d'animation en pixel art ) ! Ils sont perdu à tout jamais ! :emo:

Moi j'ai fait un questionnaire à la con B)

---------- Post added at 17h11 ---------- Previous post was at 17h11 ----------


arf, parfois, je regrette d'être jeune !

Idem, j'aurais adoré avoir un Amstrad, Atari ST ou autre Amiga pendant mon enfance/adolescence.

ascdz
27/10/2011, 18h14
Surtout que j'écoute de la musique des année 70 :hippie:

Conan3D
27/10/2011, 18h15
Surtout que j'écoute de la musique des année 70 :hippie:

T'es pas le seul :p

ascdz
27/10/2011, 18h18
Je n'en doute point quand je vois ton avatar (à mois que je me trompe ...)

Conan3D
27/10/2011, 18h20
Cet avatar est une sandale.

ascdz
27/10/2011, 18h23
Assez terrifiante tout de même. Les joies de paint :)

Heureusement que la signature rattrape le tout !

Au fait, un petit exemple de jeu développé avec XNA ?

Conan3D
27/10/2011, 18h28
Assez terrifiante tout de même. Les joies de paint :)

Heureusement que la signature rattrape le tout !

Au fait, un petit exemple de jeu développé avec XNA ?

C'est pas paint, mais Photoshop :tired:

Touze
27/10/2011, 18h30
@ascdz
Si je me plante pas magicka utilise xna.

Louck
27/10/2011, 18h42
J'epsère bien, car d'après le site du zero, c'est deux mois d'apprentissage

Le concept de la programmation objet peut être compris assez facillement.
En pratique, ca reste aussi simple (en considérant qu'on connait que le langage C).

Cependant, comprendre et mettre en pratique toutes ses possibilités et subtilités (je pense au design pattern par exemple), ca peut prendre du temps.


Ca reste, néanmoins, le genre de pratique qui encourage le développeur à s'organiser dans son code.

ascdz
27/10/2011, 19h13
C'est pas paint, mais Photoshop :tired:

Ils disent tous ça :)


@ascdz
Si je me plante pas magicka utilise xna.

Ouai, je connais pas mais je vais me renseigner :honte:


Le concept de la programmation objet peut être compris assez facillement.
En pratique, ca reste aussi simple (en considérant qu'on connait que le langage C).

Cependant, comprendre et mettre en pratique toutes ses possibilités et subtilités (je pense au design pattern par exemple), ca peut prendre du temps.


Ca reste, néanmoins, le genre de pratique qui encourage le développeur à s'organiser dans son code.


Ouai, j'imagine que connaitre le C, voire le C++ doit carrément aider, mais bon, j'en suis à peine aux pointeurs, alors ...

olih
27/10/2011, 19h20
Ils disent tous ça :)



Ouai, je connais pas mais je vais me renseigner :honte:




Ouai, j'imagine que connaitre le C, voire le C++ doit carrément aider, mais bon, j'en suis à peine aux pointeurs, alors ...

Les pointeurs c'est la vie :trollface:.

gros_bidule
27/10/2011, 19h32
Cette rubrique est "goal oriented". C'est du punk, pas du solfège : je ne vais pas vous parler pendant trois heures d'un concept pour être sûr que vous ayez tout compris et après seulement passer à la pratique.
On va donc partir du principe que l'on ne va pas passer ouatemille heures à expliquer les bases de la programmation ;)
Les grandes lignes, les principes, les bonnes pratiques quoi.

war-p
27/10/2011, 19h36
Les pointeurs c'est la vie :trollface:.

Et tu dis quoi si je te dis qu'en c#... Les pointeurs t'en a (presque) plus rien à carrer? :trollface:

Tomaka17
27/10/2011, 19h51
Et tu dis quoi si je te dis qu'en c#... Les pointeurs t'en a (presque) plus rien à carrer? :trollface:

On te répondra qu'un langage où l'opérateur égal fait soit une copie soit une référence selon le type d'objet qu'il traite n'est pas un bon langage :assis-sur-ses-convictions:

ascdz
27/10/2011, 19h54
Et tu dis quoi si je te dis qu'en c#... Les pointeurs t'en a (presque) plus rien à carrer? :trollface:


je te dis :ouch:


(bizarre le bug du smiley ...)

Belhoriann
27/10/2011, 20h07
Pour ceux qui ont envi de s'instruire tout seul en créant un Pong et un Space Shooter basique, suivez le guide :

Pong : http://www.phstudios.com/?q=node/16
Space Shooter : http://www.phstudios.com/?q=node/49

Il y a le cours en PDF pour créer pas à pas les jeux, il y a le code source et des vidéos pour ceux qui ne savent pas lire.

Je donne ces liens pour ceux qui sont des noobs complet comme moi et qui veulent suivre la voix de l'autodidacte afin d’appréhender plus sereinement le cours de M. Sebum.

L-F. Sébum
27/10/2011, 20h39
On te répondra qu'un langage où l'opérateur égal fait soit une copie soit une référence selon le type d'objet qu'il traite n'est pas un bon langage :assis-sur-ses-convictions:

C'est pas faux.

En même temps, à part les types numériques de base, les enum, les chars et les strings, TOUT est passé par référence quand tu fais un "=" en C#. Du coup c'est pas trop compliqué de s'en souvenir (et, d'une certaine façon, c'est plutôt logique. Sauf pour les strings :ninja:).

Louck
27/10/2011, 21h00
Ca dépend dans quel langage les Strings.

Mais ouai, c'est le type social traitre.



Ouai, j'imagine que connaitre le C, voire le C++ doit carrément aider, mais bon, j'en suis à peine aux pointeurs, alors ...

Je ne connais que les langages C/C++ qui font du vrai pointeur. C'est du hardos à maîtriser, mais tu as des ballz of steels après :cigare:.

Au moins les comprendre peut servir (gestion de la mémoire/références), surtout quand tu devras faire mumuse avec la programmation objet.

TheToune
27/10/2011, 21h04
Ce mépris des pointeurs ! Comment osez vous ?

http://s3.amazonaws.com/kym-assets/photos/images/original/000/126/314/3cd8a33a.png?1306264975

war-p
28/10/2011, 08h34
En même temps si le C# a été créé, c'est pas pour être un langage super compliqué à comprendre, mais bien un langage fait pour coder facilement et rapidement, mais c'est vrai que ça peut mener à des raccourcis qui ne sont pas forcément de bon goût, surtout avec les pointeurs (Et c'est un mec qui a pas mal programmé en C++ qui vous le dit...)

Teto
28/10/2011, 11h19
Mouais... Il me semble surtout que C# avait été créé pour contrer Java qui prenait un peu trop d'importance aux yeux de Crosoft, à une époque où il rêvait d'être maître du monde...

war-p
28/10/2011, 12h44
Il en rêve toujours...

Ukualai
28/10/2011, 13h00
Mais vous savez... les pointeurs existent toujours sous C#. Si jamais tu en as besoin, tu peux toujours les utiliser par contre c'est considérer comme du code "Unsafe"...
Par ce que bon les pointeurs, c'est sans doute la première cause de bug dans les codes écrit en C/C++, donc tout comme Java, le C# les a caché aux développeurs. :)

Conan3D
28/10/2011, 13h02
Juste, une petite question, comme ça : C'est quoi les pointeurs?

gros_bidule
28/10/2011, 13h03
Sont pas cachés, c'est juste que leur utilisation est implicite :emo:
Enfin bon, c'est l'éternel gueguerre barbus VS d'jeuns.

war-p
28/10/2011, 13h18
Juste, une petite question, comme ça : C'est quoi les pointeurs?

Pour faire simple, quand tu déclares une variable (si tu vois pas de quoi je parle, arrête tout de suite de lire ça, et vas suivre les cours du sdz, c'est d'la bonne!), ben tu alloues un espace mémoire, qui possède une adresse (représenté en hexadécimal genre fffffffff), et le pointeurs, ben ça sert juste à récupérer cette adresse et à la stocker. En très gros, c'est ça...

Conan3D
28/10/2011, 13h21
Je vois à peu près.

TheToune
28/10/2011, 13h23
Juste, une petite question, comme ça : C'est quoi les pointeurs?

Version que j’espère simple :
C'est une variable qui contient une adresse mémoire vers une valeurs ou un objet au lieu de contenir cette valeurs directement.
C'est un concept très important en c et c++ qui permet de gérer des objets créer dynamiquement dans la mémoire et d'y accéder.
Mais c'est aussi source de beaucoup de bugs, puisqu'un pointeur mal gérer peut "perdre" son contenu et pointé sur rien ce qui provoque de gros plantage quand tu essaie de faire des choses avec, mais tu peut aussi supprimer le pointeur ou modifier ce qu'il pointe en oubliant de supprimer ce qu'il pointait et qui devient donc innaccesible mais toujours présent en mémoire ( qui dans ce cas peut être saturé de données plus utilisé ).

Conan3D
28/10/2011, 13h27
Vous savez que, au début, je pensais que vous parliez du curseur de la souris? :ninja:

Louck
28/10/2011, 13h42
Grosso merdo, c'est comme deux modes de jeu :
- Mode noob avec des couches de protections = les variables
- Mode pro sans protection mais qui permet de TOUT faire = les pointeurs

Les pointeurs manipulent la mémoire virtuelle (RAM) de ton programme... oû se trouvent tes variables et tes objets (et bien plus).

Tomaka17
28/10/2011, 13h56
Faut comprendre que le principe des pointeurs c'est un truc de base dans tout ordinateur, un processeur tout ce qu'il sait faire c'est des opérations à partir de valeurs situées à un endroit X de la mémoire, endroit X qu'on situe grâce à un pointeur

Donc le fait de cacher ça au programmeur est un truc qui semble pour certains (comme moi) un peu bizarre, une genre d'astuce contre-nature

Louck
28/10/2011, 15h25
Cela dépend.

La programmation objet a des principes et des objectifs totalements différents, par rapport à la programmation fonctionnelle (le C).
Le langage objet se base sur une hiérarchie de classes et de paquages, avec des règles d'accessibilités. Si on devait utiliser les gros pointeurs du C, et donc avoir accès à tout les variables et valeurs du programme, on surpasserait ces limites... un peu trop.


Ce n'est pas fait pour la prog objet, en somme.

ascdz
28/10/2011, 15h34
Vous savez que, au début, je pensais que vous parliez du curseur de la souris? :ninja:


La même quand j'ai commencé à apprendre le C ...


Sinon, je voudrai être sur d'un truc; Le langage C est un langage de bas niveau, c'est à dire qu'on peut faire plein de trucs avec, mais c'est long et fastidieux, car non "spécialisé". Avec le C#, c'est beaucoup plus rapide à faire, mais on peut faire moins de choses. C'est ça ?

olih
28/10/2011, 15h51
La même quand j'ai commencé à apprendre le C ...


Sinon, je voudrai être sur d'un truc; Le langage C est un langage de bas niveau, c'est à dire qu'on peut faire plein de trucs avec, mais c'est long et fastidieux, car non "spécialisé". Avec le C#, c'est beaucoup plus rapide à faire, mais on peut faire moins de choses. C'est ça ?
Même pas.
Les deux langages doivent être turing complet.
Remarque Postscript aussi :ninja:.

TheToune
28/10/2011, 15h55
C'est pas tout à fait une question de "possibilité".
Un langage comme le c et c++ est compilé pour être proche de la machine et est donc très rapide à l'exécution et le développeur à un contrôle maximal sur la façon dont le programme fonctionne. En contrepartie il doit justement veiller lui même à ce contrôle pour éviter les problèmes ( principalement sur la gestion de la mémoire par exemple ).

Un langage comme le C# ou le JAVA passe par une plate forme d’exécution intermédiaire ( .Net pour C# / Virtual Machine pour JAVA ) l’exécution est donc relativement plus lente et possède certaines limite lié à cette plate forme intermédiaire ( en java par exemple tu ne peut pas forcément exploité toute la mémoire du PC ). L’intérêt c'est un code qui nécessite moins de contrôle à l’exécution ( contrôle effectué par le framework ) donc globalement plus simple à écrire. Ca permet aussi un code plus universel qui peut fonctionner au sein de différent système pour peu que le framework y soit porté sans changement là où un code C/C++ doit dans le meilleur des cas être compilé pour la plateforme cible et nécessite dans le pire des cas un minimum de modifications.

war-p
28/10/2011, 16h03
J'ajouterai même que l'un des gros points noir du C#, c'est ça portabilité restreinte vers des systèmes d'exploitation autre que ceux de microsoft...

Teto
28/10/2011, 16h09
Tiens, comme c'est étrange...

Tomaka17
28/10/2011, 16h13
Ca permet aussi un code plus universel qui peut fonctionner au sein de différent système pour peu que le framework y soit porté sans changement là où un code C/C++ doit dans le meilleur des cas être compilé pour la plateforme cible et nécessite dans le pire des cas un minimum de modifications.

Pour préciser : en C/C++ c'est le même code source pour toutes les machines, mais dans ta page téléchargements tu devras proposer le programme pour Windows, le programme pour Linux, le programme pour Mac, etc. bien que tous ces programmes aient été fabriquées à l'aide du même code.

En revanche en Java par exemple, en théorie tu fournis le même fichier quelle que soit la machine de l'utilisateur (en pratique c'est pas forcément toujours le cas, c'est un gros fail de Java sur ce point là puisque c'était là son argument principal au début)
Par exemple Minecraft est jouable sous Mac, sous Windows, sous Linux, sous téléphone portable en théorie, etc.

(sinon merci d'avoir déplacé le topic des programmeurs ici où il a plus de visibilité :p)

Belhoriann
28/10/2011, 16h16
J'ajouterai même que l'un des gros points noir du C#, c'est ça portabilité restreinte vers des systèmes d'exploitation autre que ceux de microsoft...

En même temps, qui achète un Mac ou utilise Linux pour jouer ? Je vous le demande ma bonne dame !

war-p
28/10/2011, 16h23
Heu, tu sais, le c# et .NET, c'est pas fait que pour jouer... Loin de là...

Belhoriann
28/10/2011, 16h27
Ouais d'accord mais on est quand même sur le topic de XNA, C# toussa.

war-p
28/10/2011, 16h35
Heu, ouais, justement, c'est pas parce que tu fais du c# + du xna que tu fais du jeu video...

Belhoriann
28/10/2011, 16h38
Ah bon ? XNA Game Studio c'est pas pour faire des jeux à la base ? :tired:

ascdz
28/10/2011, 16h52
Mhh, je crois avoir à peu près compris. Mais bon, dans tout les cas, on pourrait dire que tout les langages s'inspirent un peu du C, dans le sens où savoir programmer en C aide pour apprendre le C# plus que le contraire non ?

Tomaka17
28/10/2011, 16h54
Mhh, je crois avoir à peu près compris. Mais bon, dans tout les cas, on pourrait dire que tout les langages s'inspirent un peu du C, dans le sens où savoir programmer en C aide pour apprendre le C# plus que le contraire non ?

Le C a été créé dans les années 70 et le C# dans les années 2000
Les langages de programmation c'est un peu comme dans tous les domaines : les nouveaux langages reprennent les points positifs présents dans les anciens langages

war-p
28/10/2011, 16h54
A ceci près que le C, c'est pas un langage objet...

gros_bidule
28/10/2011, 17h41
Mais certains tarés te diront que tu peux faire de l'objet (enfin quelquechose qui revient au même) en C. C'est moche, indigeste, mais c'est applicable.

ascdz
28/10/2011, 18h40
ouai ouai, un peu compliqué tout ça. Je vais continuer à apprendre le C tranquillement, tout en suivant les cours de CPC, mais pour apprendre le C#, je verrais plus tard ...

olih
28/10/2011, 20h22
Mais certains tarés te diront que tu peux faire de l'objet (enfin quelquechose qui revient au même) en C. C'est moche, indigeste, mais c'est applicable.

Structure + pointeur sur fonction :trollface:.

Tomaka17
28/10/2011, 20h38
Mais certains tarés te diront que tu peux faire de l'objet (enfin quelquechose qui revient au même) en C. C'est moche, indigeste, mais c'est applicable.

Les mécanismes du C++ pour faire de l'orientation objet ne sont pas du tout mystiques et peuvent tout à fait être reproduites en C

Les fonctions membres statiques du C++ ce sont des simples fonctions
Les fonctions membres de classes du C++ sont comme des fonctions simples mis à part qu'elles ont un paramètre caché (this)
Dériver une classe B depuis A c'est comme si B possédait tous les membres de A ; la dérivation virtuelle d'une classe B depuis A c'est comme si B possédait un pointeur vers A
etc.

J'appelle pas ça "moche et indigeste"

gros_bidule
28/10/2011, 21h26
Implémenter ce qui tu dis est déjà indigeste ;)
Si le langage C++ est "orienté objet", ce n'est pas sans raison.
Enfin bon, c'est un débat qu'on connais tout.

Louck
29/10/2011, 00h43
En théorie, on peut tout faire sous n'importe quelle langage.
Mais, selon la situation, un outil est plus adapté qu'un autre.

http://igm.univ-mlv.fr/~paumier/C/C13-limites%20du%20C.pdf

Tomaka17
29/10/2011, 09h38
Mince, les mecs qui codent le noyau Linux en C ont tort, ils auraient du tout faire en OCaml :ninja:

(franchement si tu expliques les trucs contenus dans ce PDF dans une mailing list de code gurus ils vont te prendre pour un troll)

Je suis pas du tout un supporter acharné du C, mais les arguments présentés sont un peu bidons

olih
29/10/2011, 10h44
Mince, les mecs qui codent le noyau Linux en C ont tort, ils auraient du tout faire en OCaml :ninja:

(franchement si tu expliques les trucs contenus dans ce PDF dans une mailing list de code gurus ils vont te prendre pour un troll)

Je suis pas du tout un supporter acharné du C, mais les arguments présentés sont un peu bidons
Clairement, tout est à charge et il enfonce des portes ouvertes.
Il fait des typedef sur des struct :cry:.
Il reproche au C de ne pas être un langage fonctionnel et objet.
...
Et ocaml semble être le langage parfait :tired:.

Par contre l'idée de base de bien choisir son outil, oui pas de souci.

Belhoriann
29/10/2011, 14h10
Au fait L.F.S tu vas nous fournir un game design document prochainement pour savoir quelles seront les features du jeu ?

Louck
29/10/2011, 14h35
Mince, les mecs qui codent le noyau Linux en C ont tort, ils auraient du tout faire en OCaml

L'auteur du PDF est "bon" dans tout ce qui est C et le code système.
Il a fait ce cours pour expliquer que le langage C n'est pas parfait (il n'a pas évoqué le c++ ou c#), comme n'importe quel autre langage (Java, Python, Perl, ect ect...). En bref, qu'il faut savoir changer d'outil et de ne pas se fixer sur une seule technologie.

Mais sans troller, vous tombez tous dans le piège :ninja:.


EDIT pour en bas :

Ce à quoi je réponds qu'il vaut mieux utiliser un langage que l'on maitrise (en général c'est aussi celui que l'on préfère) plutôt que d'en utiliser un que l'on connaît à peine, ce qui fera perdre beaucoup de temps et créera plus de bugs

Il est sûr que si on connait qu'un seul langage ou qu'on en maîtrise un très bien, autant l'utiliser. Mais ca sera très casse tête de faire, par exemple, de la programmation objet avec du C (le vrai), qu'avec du Java ou C#.
M'enfin, c'est un peu le problème des informaticiens (dont moi) d'avoir du mal à sortir de sa techno d'amour :s.

Tomaka17
29/10/2011, 14h59
Ton PDF dit qu'il ne faut pas toujours utiliser le langage que l'on préfère mais plutôt celui le plus approprié

Ce à quoi je réponds qu'il vaut mieux utiliser un langage que l'on maitrise (en général c'est aussi celui que l'on préfère) plutôt que d'en utiliser un que l'on connaît à peine, ce qui fera perdre beaucoup de temps et créera plus de bugs
Évidemment tu vas pas coder un jeu vidéo en PHP ou un système d'exploitation en Javascript même si tu maitrises ces langages, mais ça ça coule de source

Li Kao
29/10/2011, 15h36
Tiens une petite question par rapport aux limites du C# pour la programmation de jeu.

Ben... tout est dans ma première phrase en fait.
Des exemples de ce que l'on peut faire et ne pas faire ?

Les jeux Vlambeer, Super Crate Box et Serious Sam - The Random Encouters je présume que c'est bon non, vu le niveau de technicité inexistant ? (j'ai pas dis artistique hein)
Plants vs Zombie peut-être aussi non ?

Par contre pas du FPS AAA nextgen tsouintsouin parce que si j'ai bien compris le langage sera trop lent par rapport à du C++ ?

L-F. Sébum
29/10/2011, 16h01
Tiens une petite question par rapport aux limites du C# pour la programmation de jeu.

Ben... tout est dans ma première phrase en fait.
Des exemples de ce que l'on peut faire et ne pas faire ?

Il y a débat à ce sujet. Les benchmarks semblent indiquer que la perte de performance dans un langage managé type C# est marginale par rapport au C++, sauf pour les projets les plus hardcore de chez hardcore.

Peut-on faire BF3 ou Crysis en C# avec des performances correctes sur un bon PC de 2011 ? Pas sûr (en même temps, personne n'a jamais essayé). Peut-on faire Doom 3 ? Certainement. Je suis loin d'être un grand programmeur et j'ai réussi à coder un moteur 3D simple mais parallax mappé et éclairé par pixel. Un mec plus doué que moi pourrait certainement créer un jeu du niveau (graphique) de Portal 2.

Simplement, les gens qui ont le courage et les compétences pour se lancer dans ce genre de projets sont généralement habitués au C++. Ce sont les "amateurs" qui se tournent vers XNA, et ils créent surtout des jeux casual 2D. Pas à cause de XNA, mais parce qu'ils sont amateurs.

Pour info, Magicka a été fait avec XNA. Ca aussi :
TgChURF5fQE

olih
29/10/2011, 17h01
Il y a débat à ce sujet. Les benchmarks semblent indiquer que la perte de performance dans un langage managé type C# est marginale par rapport au C++, sauf pour les projets les plus hardcore de chez hardcore.

Peut-on faire BF3 ou Crysis en C# avec des performances correctes sur un bon PC de 2011 ? Pas sûr (en même temps, personne n'a jamais essayé). Peut-on faire Doom 3 ? Certainement. Je suis loin d'être un grand programmeur et j'ai réussi à coder un moteur 3D simple mais parallax mappé et éclairé par pixel. Un mec plus doué que moi pourrait certainement créer un jeu du niveau (graphique) de Portal 2.

Simplement, les gens qui ont le courage et les compétences pour se lancer dans ce genre de projets sont généralement habitués au C++. Ce sont les "amateurs" qui se tournent vers XNA, et ils créent surtout des jeux casual 2D. Pas à cause de XNA, mais parce qu'ils sont amateurs.

Pour info, Magicka a été fait avec XNA. Ca aussi :
TgChURF5fQE
Mais XNA impose le C# ou pas ?

gregounech
29/10/2011, 17h09
Mais XNA impose le C# ou pas ?

Oui je crois.

ElGato
29/10/2011, 21h18
Officiellement XNA ne supporte que le C#. En pratique tu peux utiliser d'autres langages mais tu paumes quasiment tous les bénéfices qui vont avec (en gros le workflow facile d'accès) (http://forums.create.msdn.com/forums/t/1464.aspx).

Je crois que le principal souci du C# du côté des perfs, c'est l'optimisation.
Le principe du C++ (et du C), c'est que tu maîtrises absolument tout, tu "ne payes pas pour ce que tu n'utilises pas". Donc tu vas en baver, mais tu es sûr que si tu te retrouves avec des bouts de code inutiles dans le programme final, c'est ta faute. Ça n'est pas forcément le cas en C# ou autre langage "managé".
Ça explique en partie le fait que Magicka, par exemple, rame beaucoup par rapport à ce qu'il affiche. D'un autre côté, il serait probablement optimisable jusqu'à atteindre les perfs d'un programme équivalent en C++. Mais ça demanderait beaucoup de boulot, et tout le bénéfice de l'utilisation d'XNA serait perdu.

Pour les possibilités de gameplay, tu peux faire ce que tu veux, ça ne dépend pas du langage. Pour les features graphiques, aucun souci non plus, Microsoft a tout intérêt à ce que tu puisses exploiter au mieux DirectX.


En tout cas ça fait plaisir de voir cette rubrique, je suis curieux de la voir évoluer.

ascdz
30/10/2011, 12h15
Hé ben, je suis de plus en plus paumé en lisant vos posts ^_^

gros_bidule
30/10/2011, 12h38
Fichus barbus.
On commençait tranquillement la vie avec la pomme qui tombe de l'arbre.... et les voilà qui arrivent avec leur big-bang, théorie des cordes et canards de l'espace :emo:
Normalement les tutoriels seront dans des sujets dédiés ? Sinon on aura droit à un gros coup de karcher ?

ElGato
30/10/2011, 13h27
Rho. Bon disons que XNA c'est vachement bien pour commencer, même de zéro, et c'est tout.

Mais oui, je dois dire qu'on (moi le premier) a un peu tout salopé le beau thread de Sébum, un nouveau par quinzaine serait pas de refus...

gros_bidule
30/10/2011, 14h32
XNA est aussi sympa pour le multiplateforme PC / XBox360 / Windows Phone (enfin apparemment, jamais tenté le coup). Disons que des tutos made in Bilou's Corporation montrent assez bien comment penser un projet pour le multiplateforme, et comment justement exporter un projet PC vers une des deux autres plateformes.
Franchement, c'est tentant.

ascdz
30/10/2011, 17h31
M'enfin, c'est très intéressant ces discussions, même pour les beginners, ça permet un peu de se situer au niveau de tout ces codes. Après, si c'est pas le bon topic, ça a toujours un certain rapport :)

messe sans cause
31/10/2011, 20h47
Évidemment tu vas pas coder un jeu vidéo en PHP ou un système d'exploitation en Javascript même si tu maitrises ces langages, mais ça ça coule de source

Linux en javascript (http://bellard.org/jslinux/) :ninja:

olih
31/10/2011, 20h55
Linux en javascript (http://bellard.org/jslinux/) :ninja:

Non, un émulateur x86 en javascript.
Dans le même style un décodeur h264 en javascript (http://arstechnica.com/open-source/news/2011/10/native-javascript-h264-decoder-offers-compelling-demo-of-js-performance.ars)
:ninja:

Tomaka17
31/10/2011, 21h18
Rha mais en plus ce truc me dégoute
Je suis justement en train de coder un truc un peu complexe en Javascript, et je me suis fait chier avec plein de fonctions du DOM pour modifier le moins de HTML possible, pour "éviter que ce soit lent"
La prochaine fois j'irai en mode gros bourrin :tired:

Sinon il s'est quand même bien fait chier le mec qui a fait l'émulateur
Si t'as les connaissances pour faire ça c'est pas forcément super difficile, mais la quantité de boulot est assez gigantesque
(il n'a pas précisé ça dans sa FAQ, mais je pense qu'il n'y a pas de mode virtuel (16bits dans du 32bits) ? car sinon chapeau)

olih
31/10/2011, 21h23
Rha mais en plus ce truc me dégoute
Je suis justement en train de coder un truc un peu complexe en Javascript, et je me suis fait chier avec plein de fonctions du DOM pour modifier le moins de HTML possible, pour "éviter que ce soit lent"
La prochaine fois j'irai en mode gros bourrin :tired:

Sinon il s'est quand même bien fait chier le mec qui a fait l'émulateur
Si t'as les connaissances pour faire ça c'est pas forcément super difficile, mais la quantité de boulot est assez gigantesque
(il n'a pas précisé ça dans sa FAQ, mais je pense qu'il n'y a pas de mode virtuel (16bits dans du 32bits) ? car sinon chapeau)

Bin Fabrice Bellard (http://fr.wikipedia.org/wiki/Fabrice_Bellard), le créateur de qemu et de ffmepg.
Une légende quoi.

PS: il y a plus d'info dans les tech notes (http://bellard.org/jslinux/tech).

Tomaka17
31/10/2011, 21h58
Ah ouai quand même :o

Les technical notes sont un peu vides par contre, j'aimerais bien savoir pourquoi il n'y a pas de FPU par exemple, ça me paraît simple à faire comparé au reste
Un peu comme si tu disais "j'ai construit une maison tout seul mais je n'ai pas mis de poignées aux portes"


Sinon à quand un émulateur en langage Ook (http://fr.wikipedia.org/wiki/Brainfuck#Ook.21) ? :ninja:

---------- Post added at 20h58 ---------- Previous post was at 20h33 ----------

Rha il a gagné l'international obfuscated C contest en 2001, rien que ça ça vaut la reconnaissance éternelle

Monsieur Odd
31/10/2011, 22h14
Linux en javascript (http://bellard.org/jslinux/) :ninja:

C'est juste über ce truc.

Tomaka :


added 16 bit & segmentation support

Esotsm
01/11/2011, 13h02
Les ennuis commencent dès le premier numéro. Au moment d'enregistrer le nouveau projet appelé "Canardage", il me dit un truc du style "Accès au registre interdit" et une fois le projet ouvert, je n'ai pas "Solution "Canardage" (2 projets)" mais seulement "Solution "Canardage" (1 projet)"... :'( Des idées ? J'ai essayé en normal et en mode administrateur. Sinon, j'attendrais le prochain numéro pour prendre le fichier en téléchargement.

L-F. Sébum
01/11/2011, 15h55
Les ennuis commencent dès le premier numéro. Au moment d'enregistrer le nouveau projet appelé "Canardage", il me dit un truc du style "Accès au registre interdit" et une fois le projet ouvert, je n'ai pas "Solution "Canardage" (2 projets)" mais seulement "Solution "Canardage" (1 projet)"... :'( Des idées ? J'ai essayé en normal et en mode administrateur. Sinon, j'attendrais le prochain numéro pour prendre le fichier en téléchargement.

Bizarre.
Va dans "programmes et fonctionnalités" dans le panneau de configuration et essaye de "réparer" VC# et XNA. Ca ressemble à une installation merdée.

J'uploaderai le code (et les fichiers nécessaires pour le prochain épisode) demain, mais je doute que ça marche si ton installation déconne.

Esotsm
01/11/2011, 16h40
Ok, je vais faire ça, merci. J'ai vu après seulement l'installation de VC# qu'il fallait se contenter d'installer ça et pas tous les autres trucs proposés. Cela pourrait peut-être venir de là... Bon, à l'ancienne, on désinstalle et on réinstalle.

L-F. Sébum
02/11/2011, 17h04
Ok, je vais faire ça, merci. J'ai vu après seulement l'installation de VC# qu'il fallait se contenter d'installer ça et pas tous les autres trucs proposés. Cela pourrait peut-être venir de là... Bon, à l'ancienne, on désinstalle et on réinstalle.

N'oublie pas non plus de bien installer toutes les mises à jour que te proposes Windows Update après avoir installé VC# ET après avoir installé XNA.

Sinon, ayé, le code source et les fichiers nécessaires à la leçon 1 sont uploadés.

Belhoriann
02/11/2011, 19h13
Wokay merci Sebum ;)

Esotsm
02/11/2011, 19h59
Bon, ça marche pas. J'ai désinstallé les noooombreux trucs installés avec Visual et XNA, réinstallé mais c'est toujours le même problème. Pas grave, je regarderai ça de loin et dès que j'ai un nouveau pc, je m'y remettrai. Merci Sebum en tous cas. Cette idée de rubrique est super.

Azerty
03/11/2011, 13h54
LIENS UTILES :

NIVEAU DÉBUTANT :
- Un excellent cours d'introduction au C# par Serge Tahé, prof à l'université d'Angers. Lien (http://tahe.ftp-developpez.com/fichiers-archive/csharp2008.pdf) (PDF, 20 mégas) (en français)





Entrée en matière, page 8


Ci-dessus le littéral 3 est par défaut de type C# int, donc de type .NET system.Int32. Cette structure a une méthode GetType() qui rend un objet encapsulant les caractéristiques de type de données Sytem.Int32.
Parmi celles-ci, la propriété FullName rend le nom complet du type. On voit donc que le littéral 3 est un objet plus complexe qu'il n'y paraît à première vue.

:tired::|

:sad:


Bon, je vais aller chercher des cours de prog de CM2, çà ira peut-être.



En tout cas, bravo pour cette nouvelle rubrique, une super idée.

yourykiki
03/11/2011, 14h54
Un minimum de précision n'a jamais fait de mal, mais si tu ne retiens pas ce genre de paragraphe ce n'est à mon avis pas super grave :0) Le jour où tu atteindras les limites d'un int, tu te souviendras peut-être de ce paragraphe :D

Avoir la connaissance du tableau au dessus de ce paragraphe suffit pour passer à la suite

L-F. Sébum
04/11/2011, 15h42
:tired::|

:sad:

Yep, ce cours là n'est pas destiné aux GRANDS débutants (ceux qui n'ont jamais programmé avant). Commence plutôt par celui du site du zéro.

Je vais modifier la première page pour que ce soit plus clair.

Møgluglu
04/11/2011, 17h57
Les technical notes sont un peu vides par contre, j'aimerais bien savoir pourquoi il n'y a pas de FPU par exemple, ça me paraît simple à faire comparé au reste
Un peu comme si tu disais "j'ai construit une maison tout seul mais je n'ai pas mis de poignées aux portes"

HS, mais si, c'est super dur. Reproduire le comportement de la FPU x87, même en C ça demande dans les 15000 ou 20000 lignes écrites par quelqu'un qui comprend ce qu'il fait (i.e. quelqu'un qui sait expliquer sans hésiter la différence entre l'exception underflow et le flag denormal), et c'est très lent.
Et ça n'apporte rien de plus, car le Linux qui tourne dans l'émulateur supporte l'émulation de la FPU en soft. (Bon, du coup, on passe de très lent à monstrueusement lent, et ça c'est avant qu'on traduise tout en Javascript. Mais c'est un peu le postulat de départ.)

war-p
04/11/2011, 18h23
Ce topic était compréhensible avant ton arrivée :emo: (Møgluglu, je t'aime quand même)

gregounech
05/11/2011, 01h55
Petite question, comment on fait pour en plus d'afficher a chaque frame notre image gros_lapin, pour jouer en boucle un son (ajouté dans le projet par la meme facon que gros_lapin).

Car je veux un gros_lapin qui chante Exile Vilify.

olih
05/11/2011, 11h48
Petite question, comment on fait pour en plus d'afficher a chaque frame notre image gros_lapin, pour jouer en boucle un son (ajouté dans le projet par la meme facon que gros_lapin).

Car je veux un gros_lapin qui chante Exile Vilify.

Ça doit être pour la leçon 4 ou 5 ça (ou pour la toute fin va savoir).

lian
07/11/2011, 10h24
Bonjour, j'ai commencé les leçons (je dois être niveau quasi débutant puisque j'ai suivi des UV informatiques dans mes études - genre le jour de la présentation du programme, je ne sais pas où est le bouton on/off de l'ordi) mais il faudrait peut-être préciser dans le magazine où se situe "la section Développé Couché du site". Parce qu'une recherche ne donne pas de résultat rapide et je n'ai pas pensé que ça pourrait être caché dans le forum.

Anonyme32145
07/11/2011, 10h28
Bonjour, j'ai commencé les leçons (je dois être niveau quasi débutant puisque j'ai suivi des UV informatiques dans mes études - genre le jour de la présentation du programme, je ne sais pas où est le bouton on/off de l'ordi) mais il faudrait peut-être préciser dans le magazine où se situe "la section Développé Couché du site". Parce qu'une recherche ne donne pas de résultat rapide et je n'ai pas pensé que ça pourrait être caché dans le forum.

En cherchant "Développez couché" plutôt que "Développé couché", dans la fonction recherche du forum, tu tombes directement sur le résultat. Difficile de faire plus simple. :)

P.S. : Dans le doute, ça marche aussi en cherchant "Développ* couch*".

Belhoriann
07/11/2011, 13h48
J'ai une petite question :

J'ai commencé il y a maintenant 3 semaines à développer mon propre petit jeu en mode autodidacte. En gros je voudrais faire un shooter spatiale en 2D (vue top-down) avec beaucoup de grinding. Au final j'aimerai un jeu dont le déroulement se rapproche de The Last Stand (le mode coop de DoW II pour ceux qui connaissent) : on affronte des vagues d'ennemies de plus en plus forts, on gagne de l'XP et des points en les affrontant, et quand on crève on retourne à l'écran de customisation du vaisseau (dépense de points d'XP etc...). De cet écran on peut relancer le jeu et affronter de nouveau les vagues successives.

Avec l'aide des tutos de PHstudios (http://www.phstudios.com/), j'ai pu partir d'une base fonctionnelle avec un vaisseau qui tire et des ennemies qui se dirigent vers le joueur en tirant.
J'ai donc construit mon jeu sur cette base, en implémentant un système de santé, d'XP, de vagues d’ennemies, de mouvements inertiels... J'ai aussi un menu "Game Over" qui apparaît quand on meurt et depuis lequel on peut relancer le jeu (On relance la classe PlayScreen en gros.). Voici donc mon problème = Comment puis-je faire pour que la valeur d'XP accumulée pendant une partie ne retombe pas à zero quand on meurt et qu'on relance une partie ? En gros j'aimerai avoir un système de mise en mémoire des stats du joueurs, sans forcément faire un système de sauvegarde traditionnel.
Dois-je faire une classe qui n'hérite de personne dans laquelle je "stock" mes valeurs au moins aussi longtemps que le jeu est lancé ?

Voici l'architecture de mon jeu, si tant est que celui puisse vous éclairer :emo:

http://tof.canardpc.com/preview/8e2bc03d-f45e-476a-951e-7636df9b05d5.jpg (http://tof.canardpc.com/view/8e2bc03d-f45e-476a-951e-7636df9b05d5.jpg)

Merci d'avance pour votre aide.

gros_bidule
07/11/2011, 14h06
Coin,
une manière d'aborder le problème (parmi tant d'autres) :
Si tu veux garder l'XP en mémoire tout au long de la partie, pourquoi ne pas créer une classe associée au joueur (ha, je vois que tu as déjà une classe Player ? Que fait-elle ?), classe qui ne sera instanciée qu'une seule fois, et possédant un compteur d'XP que tu ne fera qu'incrémenter partie après partie. Idéalement, tu peux associer Player au joueur humain, donc tu n'en as qu'une seule instance lorsque tu lances le jeu. Tu n'a aucune raison de la recréer/supprimer entre deux partie, vu que c'est toujours le même joueur.
Si tu veux stocker l'XP lorsque le jeu est éteint...tu n'as pas vraiment le choix : une sauvegarde s'impose. Fichier local dans un format spécifique ? Sérialisation de la classe gérant l'XP (et donc désérialisation de celle-ci au lancement du jeu) ? Sauvegarde sur un serveur en ligne ? Code ?

Tomaka17
07/11/2011, 14h10
Si tu veux que l'XP reste quand tu quittes complètement le jeu (le programme) et que tu le redémarres, t'es obligé de faire un espèce de système de sauvegarde
Pour ça t'es pas obligé de mettre un bouton "sauvegarder" et "charger", tu peux tout bêtement écrire dans un fichier sans rien dire à l'utilisateur, puis le recharger au démarrage

Si c'est juste pour pas perdre l'XP au game over, pourquoi ne pas tout simplement mettre le jeu en pause au moment du game over, puis enlever la pause quand le joueur clique sur continuer

De manière générale il faut bien comprendre un truc quand tu développes un jeu, c'est que tu n'es pas obligé d'avoir une structure du programme qui correspond à ce que tu vois à l'écran
Par exemple c'est pas parce qu'un vaisseau est détruit que tu dois détruire l'objet "vaisseau" qui correspond, c'est pas parce que tu es game over que l'objet "partie en cours" doit être détruit, etc.

Belhoriann
07/11/2011, 14h27
Merci pour vos réponse. En cadeau voici une vidéo du jeu :

QPM6DQPGzVw

Dans un premier temps ce que je veux c'est en effet conserver l'XP entre 2 morts du joueur.

J'ai assayé de créer une classe PlayerStats avec un variable totalXP se mettant à jour en même temps que l'XP normal du joueur. J'ai ensuite appelé la valeur totalXP dans le calcul de l'XP du joueur mais l'XP était toujours 0 après la mort.

Comme j'aimerai avoir d'autres variables que l'XP à conserver (comme des crédits, des ressources (métal, or, energie...)), j'aimerai avoir un système simple et flexible. Et je pense que mettre l'écran en pause à chaque mort est une bonne idée. Voici pour l'instant ce qu'il se passe dans la classe GameOverScreen :


public class GameOverScreen : MenuScreen
{
MenuEntry playagain, quit;

public GameOverScreen()
{
playagain = new MenuEntry(this, "Game Over - Play Again?");
quit = new MenuEntry(this, "Quit Game");

TransitionOnTime = TransitionOffTime = TimeSpan.FromSeconds(1);

Selected = Color.Yellow;
NonSelected = Color.White;
}

public override void Initialize()
{
playagain.SetPosition(new Vector2(350, 200), true);
playagain.Selected += new EventHandler(PlayagainSelect);
quit.SetRelativePosition(new Vector2(0, SpriteFont.LineSpacing + 5), playagain, true);
quit.Selected += new EventHandler(QuitSelect);
MenuEntries.Add(playagain);
MenuEntries.Add(quit);

}

public override void LoadContent()
{
ContentManager content = ScreenManager.Content;
SpriteFont = content.Load<SpriteFont>("Fonts\\Menu");
}

void PlayagainSelect(object sender, EventArgs e)
{
ExitScreen();
ScreenManager.AddScreen(new PlayScreen());
}

void QuitSelect(object sender, EventArgs e)
{
ScreenManager.Game.Exit();
}

}

Je suppose qu'il faudrait plutôt que j'appelle la classe PauseScreen quand on crève, et que celle ci enlève la pause et relance les Waves quand on click sur play, plutôt que de relancer carrément un nouveau PlayScreen comme dans la classe GameOverScreen.

ElGato
07/11/2011, 16h27
Fais voir ton implémentation de "player.cs", et la manière dont elle échange des données avec PlayerStats ?

Belhoriann
07/11/2011, 16h34
Arf, désolé j'ai tout viré, je suis en train d'essayer la méthode de pause entre 2 séquence de jeu. Mais je dois avouer que j'en chie aussi, noob inside.

EDIT : J'ai réussi à mettre en pause le jeu lorsque le joueur meurt (la classe GameOverScreen met en pause le jeu au lieu de le "casser"). Il ne faut plus maintenant que je trifouille un truc pour que le joueur respawn et que les vagues d'ennemis se relancent quand on enlève la pause.
Je me dis quand même que j'aimerai bien que certaines données soit enregistrées comme une espèce de score total qui permettrait de débloquer de nouveaux vaisseaux.

LaVaBo
07/11/2011, 18h53
Arf, désolé j'ai tout viré, je suis en train d'essayer la méthode de pause entre 2 séquence de jeu. Mais je dois avouer que j'en chie aussi, noob inside.

EDIT : J'ai réussi à mettre en pause le jeu lorsque le joueur meurt (la classe GameOverScreen met en pause le jeu au lieu de le "casser"). Il ne faut plus maintenant que je trifouille un truc pour que le joueur respawn et que les vagues d'ennemis se relancent quand on enlève la pause.
Je me dis quand même que j'aimerai bien que certaines données soit enregistrées comme une espèce de score total qui permettrait de débloquer de nouveaux vaisseaux.

Ca ne devrait pas poser de problème.

D'après moi, ta galère c'est parce que tu recrées une instance de ta classe Player en revenant en arrière, par exemple dans la method Initialize d'une de tes classes screen. Si tu trouves où est-ce que l'XP est remise à 0, tu te débloques.
Et tu évites les effets de bord du gameover en faisant une pause, parce qu'il faut que tu réinitialise certains paramètres lors de la partie suivante. Pas celui de l'XP, mais par exemple la fréquence d'apparition des ennemis ou leur puissance. En gros, va te falloir une initialisation la première fois, et une autre les fois après le game over.

Bon, sinon rien à voir, mais
ScreenManager.AddScreen(new PlayScreen()); c'est normal (noob du C# inside) ? Ca crée pas whatmille instances de PlayScreen sans détruire les précédentes, si on perd et qu'on rejoue plein de fois de suite ?

L-F. Sébum
07/11/2011, 19h54
Il faudrait peut-être préciser dans le magazine où se situe "la section Développé Couché du site". Parce qu'une recherche ne donne pas de résultat rapide et je n'ai pas pensé que ça pourrait être caché dans le forum.

C'est marqué en gros, dans chaque numéro, sous le bandeau de titre de la rubrique.

Belhoriann
07/11/2011, 21h49
Ca ne devrait pas poser de problème.

D'après moi, ta galère c'est parce que tu recrées une instance de ta classe Player en revenant en arrière, par exemple dans la method Initialize d'une de tes classes screen. Si tu trouves où est-ce que l'XP est remise à 0, tu te débloques.
Et tu évites les effets de bord du gameover en faisant une pause, parce qu'il faut que tu réinitialise certains paramètres lors de la partie suivante. Pas celui de l'XP, mais par exemple la fréquence d'apparition des ennemis ou leur puissance. En gros, va te falloir une initialisation la première fois, et une autre les fois après le game over.

Bon, sinon rien à voir, mais
ScreenManager.AddScreen(new PlayScreen()); c'est normal (noob du C# inside) ? Ca crée pas whatmille instances de PlayScreen sans détruire les précédentes, si on perd et qu'on rejoue plein de fois de suite ?

Juste pour préciser, le code de GameOverScreen et des autres screens vient des tutos de PHstudios.
Pour ce qui est du fonctionnement du jeu, via le menu principal on lance la classe PlayScreen qui Update toutes les classes et dessine tout ce qu'il y a à dessiner. Ça initialise donc tous les objets qui composent le gameplay, dont le joueur (classe Player). Quand on crève, ça détruit l'instance PlayScreen et ouvre le GameOverScreen, c'est pour ça que cette dernière comporte la ligne "ScreenManager.AddScreen(new PlayScreen());", qui relance le jeu quand on sélectionne "Play Again" en recréant une instance PlayScreen. C'est pour ça que les stats du joueurs sont remises à 0 quand on relance une partie.

Tu vois donc qu'avec cette architecture il est, il me semble, impossible d'initialiser le joueur au début et ne pas le faire au moment de faire "Play Again", puisque dans les deux cas on relance la classe PlayScreen qui initialise le joueur.
Soit je change drastiquement de méthode, ce qui peut être chiant, long et décourageant pour un débutant comme moi, soit je passe par l'astuce de lancer qu'une seule fois PlayScreen et le mettre en pause quand le joueur meurt, ce qui implique de réinitialiser la position du spawn, la vie du joueur, les ennemies... quand on relance la partie.

Cela dit, je me rend compte que le plus frustrant quand on débute c'est de devoir adapter le gameplay de son jeu à ses connaissances techniques. :emo:

Tomaka17
07/11/2011, 22h24
Je ne sais pas comment font les studios pro, mais pour ma part je sépare systématiquement données du jeu et affichage

C'est à dire que j'ai une classe "EtatDuJeu" qui contient la position de tous les objets et ce genre de choses, et une classe "AffichageDuJeu" qui va écouter l'instance de "EtatDuJeu" afin de faire l'affichage correspondant
(bon en réalité j'utilise un système d'entités/composants pour représenter l'état du jeu, sinon c'est un peu bordélique)
De cette façon tu peux faire du split screen, tu peux lire l'état du jeu selon une interface commune peu importe si c'est une partie en local ou en multi, tu peux afficher le menu principal tout en continuant à faire tourner le jeu en arrière-plan, etc.

Évidemment t'es pas obligé de faire pareil, mais si ça peut te donner des idées

LaVaBo
08/11/2011, 11h45
Juste pour préciser, le code de GameOverScreen et des autres screens vient des tutos de PHstudios.
Pour ce qui est du fonctionnement du jeu, via le menu principal on lance la classe PlayScreen qui Update toutes les classes et dessine tout ce qu'il y a à dessiner. Ça initialise donc tous les objets qui composent le gameplay, dont le joueur (classe Player). Quand on crève, ça détruit l'instance PlayScreen et ouvre le GameOverScreen, c'est pour ça que cette dernière comporte la ligne "ScreenManager.AddScreen(new PlayScreen());", qui relance le jeu quand on sélectionne "Play Again" en recréant une instance PlayScreen. C'est pour ça que les stats du joueurs sont remises à 0 quand on relance une partie.

Tu vois donc qu'avec cette architecture il est, il me semble, impossible d'initialiser le joueur au début et ne pas le faire au moment de faire "Play Again", puisque dans les deux cas on relance la classe PlayScreen qui initialise le joueur.
Soit je change drastiquement de méthode, ce qui peut être chiant, long et décourageant pour un débutant comme moi, soit je passe par l'astuce de lancer qu'une seule fois PlayScreen et le mettre en pause quand le joueur meurt, ce qui implique de réinitialiser la position du spawn, la vie du joueur, les ennemies... quand on relance la partie.
Tu peux initialiser la classe Player indépendamment de l'écran de jeu sur lequel tu te trouves, si tu instancies la classe à l'endroit où tu instancies les classes xxxScreen, et pas dans une de ces classes xxxScreen. Par contre là faut qu'un connaisseur précise, n'ayant jamais touché au C#, je ne sais pas quel est ce conteneur.


Cela dit, je me rend compte que le plus frustrant quand on débute c'est de devoir adapter le gameplay de son jeu à ses connaissances techniques. :emo:
C'est pas faux, mais c'est bien classe ton projet, d'après la vidéo, pour quelqu'un qui débute complètement.

Belhoriann
08/11/2011, 13h16
Je ne sais pas comment font les studios pro, mais pour ma part je sépare systématiquement données du jeu et affichage

C'est à dire que j'ai une classe "EtatDuJeu" qui contient la position de tous les objets et ce genre de choses, et une classe "AffichageDuJeu" qui va écouter l'instance de "EtatDuJeu" afin de faire l'affichage correspondant
(bon en réalité j'utilise un système d'entités/composants pour représenter l'état du jeu, sinon c'est un peu bordélique)
De cette façon tu peux faire du split screen, tu peux lire l'état du jeu selon une interface commune peu importe si c'est une partie en local ou en multi, tu peux afficher le menu principal tout en continuant à faire tourner le jeu en arrière-plan, etc.

Évidemment t'es pas obligé de faire pareil, mais si ça peut te donner des idées

Pour l'instant la structure de mon jeu est la suivante (toujours tirée des tuto de PHstudios) :

J'ai une classe GameplayObject qui s'occupe de définir des status (Active, Dying, Dead... Ça sert à définir des logic quand par exemple un ennemi est en train de crever) ou des méthodes du genre :


Vector2 position = Vector2.Zero;
public Vector2 Position
{
get { return position; }
set { position = value; }
}

Toutes mes classes destinées à créer des objets du jeu (Player, Ennemies, Lasers...) héritent de cette classe. Ca permet de créer une liste dans la classe PlayScreen du genre :


static List<GameplayObject> addedObjects = new List<GameplayObject>();

public static void Add(GameplayObject newGameObject)
{
addedObjects.Add(newGameObject);
}

On update tout ça comme ça (dans la partie Update) :


for (int i = 0; i < currentGameObjects.Count; i++)
{
if (currentGameObjects[i].Status == ObjectStatus.Dead)
gameObjects.Remove(currentGameObjects[i]);
else
currentGameObjects[i].Update(gameTime);
}

Ainsi, on peut afficher facilement tout le contenu de la liste dans la partie Draw :


spriteBatch.Begin();
for(int i = 0; i < gameObjects.Count; i++)
{
gameObjects[i].Draw(gameTime, spriteBatch);
}


Mais je viens de voir que dans la partie LoadContent il y a ça :


gameObjects.Add(player);

Faudrait-il que je modifie les choses pour éviter que le joueur se retrouve dans la liste générale où se trouve les ennemies pour pouvoir le gérer indépendamment ? (mmh la réponse est dans la question...)

LaVaBo
08/11/2011, 13h33
Pour l'instant la structure de mon jeu est la suivante (toujours tirée des tuto de PHstudios) :

J'ai une classe GameplayObject qui s'occupe de définir des status (Active, Dying, Dead... Ça sert à définir des logic quand par exemple un ennemi est en train de crever) ou des méthodes du genre :


Vector2 position = Vector2.Zero;
public Vector2 Position
{
get { return position; }
set { position = value; }
}

Toutes mes classes destinées à créer des objets du jeu (Player, Ennemies, Lasers...) héritent de cette classe. Ca permet de créer une liste dans la classe PlayScreen du genre :


static List<GameplayObject> addedObjects = new List<GameplayObject>();

public static void Add(GameplayObject newGameObject)
{
addedObjects.Add(newGameObject);
}

On update tout ça comme ça (dans la partie Update) :


for (int i = 0; i < currentGameObjects.Count; i++)
{
if (currentGameObjects[i].Status == ObjectStatus.Dead)
gameObjects.Remove(currentGameObjects[i]);
else
currentGameObjects[i].Update(gameTime);
}

Ainsi, on peut afficher facilement tout le contenu de la liste dans la partie Draw :


spriteBatch.Begin();
for(int i = 0; i < gameObjects.Count; i++)
{
gameObjects[i].Draw(gameTime, spriteBatch);
}


Mais je viens de voir que dans la partie LoadContent il y a ça :


gameObjects.Add(player);

Faudrait-il que je modifie les choses pour éviter que le joueur se retrouve dans la liste générale où se trouve les ennemies pour pouvoir le gérer indépendamment ? (mmh la réponse est dans la question...)

Laisse-le dans la liste si tu dessines en la parcourant.
De toute façon, tu peux accéder directement à l'instance avec la variable player, donc cumuler les 2 aspects : listes des objets du jeu et accès direct aux données de player.

Belhoriann
08/11/2011, 13h39
Laisse-le dans la liste si tu dessines en la parcourant.
De toute façon, tu peux accéder directement à l'instance avec la variable player, donc cumuler les 2 aspects : listes des objets du jeu et accès direct aux données de player.

Ouep tu as raison. Mais ce que j'ai fait hier c'est créé un nouvel état spécial pour le joueur appelé PlayerDead. De cette manière je différencie la mort du joueur et la mort de tous les autres GameplayObjects. Finalement ça me permet d'éviter d'enlever le joueur de la liste puisque l'état considéré pour cela est l'état Dead :


for (int i = 0; i < currentGameObjects.Count; i++)
{
if (currentGameObjects[i].Status == ObjectStatus.Dead)
gameObjects.Remove(currentGameObjects[i]);
else
currentGameObjects[i].Update(gameTime);
}


La programmation objet c'est formidable, mais si on n'est pas assez attentif ou qu'on utilise du code créé par quelqu'un d'autre on se retrouve rapidement comme lui :

http://www.tresor-de-momes.fr/Images/chat%20emele%20dans%20pelote%20de%20laine.gif

TheToune
08/11/2011, 13h52
Pour moi, d'un point de vue conception objet, si ton jeu posséde des caractéristiques persistances entre parties c'est qu'elles n'appartiennent pas à la classe Player.
Par contre rien n’empêche ta classe player d'aller influencer ou utiliser ces variables en allant les chercher dans une classe "Jeu" par exemple.

Tomaka17
08/11/2011, 14h02
L'idée de créer un status "PlayerDead", c'est le genre de choses qu'il faut justement pas faire pour ne pas s'embrouiller

À ta place je garderais ton idée plus haut : tu créé un objet "PlayerInfos", "PlayerProgression" ou "PlayerStats" (un nom comme ça)

Tu créé une instance de celle-ci dans ton application principale, et ensuite tu la passes au constructeur de PlayScreen, qui la passe à son tour au constructeur de Player
(une instance c'est le nom qu'on donne à un objet dont le type est la classe en question)
Cette "technique" s'appelle de l'injection de dépendance (http://en.wikipedia.org/wiki/Dependency_injection) (nom barbare qui désigne un truc très simple)

Cette classe ("PlayerStats") contient l'XP, les ressources, etc. tout ce qui doit se garder d'une partie à l'autre
Et la classe Player va lire et mettre à jour PlayerStats plutôt que de tout stocker elle-même

Belhoriann
08/11/2011, 16h06
L'idée de créer un status "PlayerDead", c'est le genre de choses qu'il faut justement pas faire pour ne pas s'embrouiller

:emo:


À ta place je garderais ton idée plus haut : tu créé un objet "PlayerInfos", "PlayerProgression" ou "PlayerStats" (un nom comme ça)

Tu créé une instance de celle-ci dans ton application principale, et ensuite tu la passes au constructeur de PlayScreen, qui la passe à son tour au constructeur de Player
(une instance c'est le nom qu'on donne à un objet dont le type est la classe en question)
Cette "technique" s'appelle de l'injection de dépendance (http://en.wikipedia.org/wiki/Dependency_injection) (nom barbare qui désigne un truc très simple)

Cette classe ("PlayerStats") contient l'XP, les ressources, etc. tout ce qui doit se garder d'une partie à l'autre
Et la classe Player va lire et mettre à jour PlayerStats plutôt que de tout stocker elle-même

Cette manière est en effet bien plus élégante je trouve, c'est pour ça que j'avais opté pour cette méthode en premier lieu :cigare:
Va maintenant falloir que j'arrive à faire marcher tout ça ! Merci ;)

---------- Post added at 15h06 ---------- Previous post was at 13h59 ----------


L'idée de créer un status "PlayerDead", c'est le genre de choses qu'il faut justement pas faire pour ne pas s'embrouiller

À ta place je garderais ton idée plus haut : tu créé un objet "PlayerInfos", "PlayerProgression" ou "PlayerStats" (un nom comme ça)

Tu créé une instance de celle-ci dans ton application principale, et ensuite tu la passes au constructeur de PlayScreen, qui la passe à son tour au constructeur de Player
(une instance c'est le nom qu'on donne à un objet dont le type est la classe en question)
Cette "technique" s'appelle de l'injection de dépendance (http://en.wikipedia.org/wiki/Dependency_injection) (nom barbare qui désigne un truc très simple)

Cette classe ("PlayerStats") contient l'XP, les ressources, etc. tout ce qui doit se garder d'une partie à l'autre
Et la classe Player va lire et mettre à jour PlayerStats plutôt que de tout stocker elle-même

Je comprends pas bien quand tu dis "Tu créé une instance de celle-ci dans ton application principale, et ensuite tu la passes au constructeur de PlayScreen, qui la passe à son tour au constructeur de Player".
Mon application principale pour moi il me semble que c'est PlayScreen, puisque c'est cette classe qui met à jour tout le monde et affiche tout le monde. Ensuite quand tu dis de passer au constructeur, tu veux dire de mettre en argument du constructeur un truc comme "PlayerProgression playerProgression" pour la classe PlayScreen et Player ?

LaVaBo
08/11/2011, 16h17
Je comprends pas bien quand tu dis "Tu créé une instance de celle-ci dans ton application principale, et ensuite tu la passes au constructeur de PlayScreen, qui la passe à son tour au constructeur de Player".
Mon application principale pour moi il me semble que c'est PlayScreen, puisque c'est cette classe qui met à jour tout le monde et affiche tout le monde.

Ce que tu appelles application principale n'est probablement pas PlayScreen, mais la toute première fonction qui est appelée quand tu exécutes le programme [need plus d'infos, y'a une fonction main en C# ?]. Peut-être celle qui lance le constructeur de PlayScreen.


Ensuite quand tu dis de passer au constructeur, tu veux dire de mettre en argument du constructeur un truc comme "PlayerProgression playerProgression" pour la classe PlayScreen et Player ?
Oui, au moins pour PlayScreen. Et aussi un attribut de type PlayerProgression, que tu initialises dans le constructeur avec ce nouvel argument, pour pouvoir utiliser facilement la nouvelle classe depuis PlayScreen (ex : mise à jour d'un attribut, ou récupération d'un attribut pour affichage).

Tomaka17
08/11/2011, 16h40
Quand tu construits ton PlayScreen en lui donnant un PlayerProgression, c'est comme si tu disais "je créé un objet qui se charge du déroulement du jeu, et je lui demande d'utiliser cet objet PlayerProgression pour stocker la progression du joueur"

On pourrait se dire "comme il n'y a qu'un seul joueur de toutes manières, pourquoi ne pas créer une variable globale contenant mon PlayerProgression, et mon PlayScreen va mettre à jour cette variable globale directement"
C'est un peu difficile à expliquer sans rentrer dans des détails bien chiants, mais faire ça, c'est mal, il vaut mieux le passer comme paramètre

Belhoriann
08/11/2011, 16h55
Ok, c'est pas évident mais je crois avoir pigé. En gros, dans mon application principale, celle qui se lance quand je lance le jeu, je mets en haut :


PlayerProgression playerProgression;

Et plus bas, dans "Initialize()" :


playerProgression = new PlayerProgression();

Ensuite, je mets dans les constructeurs PlayScreen et Player ça :


public PlayScreen (PlayerProgression playerProgression)

public Player (PlayerProgression playerProgression)

J'ai bon ?

Tomaka17
08/11/2011, 16h59
Ouaip
Tu mets la variable "playerProgression" comme membre de ta classe par contre, pas en globale (j'ai dit plus haut que c'était mal de mettre en global)

Dans le constructeur de PlayScreen tu mets

player = new Player(playerProgression);

Et dans Player tu rajoutes une variable membre pour stocker le PlayerProgression
Quand le joueur gagne de l'XP ou ce genre de choses, tu le rajoutes dans PlayerProgression (en supposant que c'est la classe Player qui s'occupe de déterminer quand le joueur a fait un kill)
Comme ça même quand le Player ou le PlayScreen sont détruits, le PlayerProgression existe encore et tu peux réutiliser le même la prochaine fois

Belhoriann
09/11/2011, 00h04
Je viens encore vous demandez de l'aide :

Comme convenu j'ai donc :
- Créé ma classe PlayerProgression qui comporte le calcul de l'XP du joueur (et donc sa valeur)
- J'ai créé une instance de cette classe dans la classe principal du jeu (à savoir Game1.cs, c'est la classe principal par défaut dans XNA) en écrivant "playerProgression = new PlayerProgression();" dans le constructeur de cette classe.
- J'ai mis en argument des constructeurs Player et PlayScreen ceci : "PlayerProgression playerProgression".

Vient maintenant le problème de l'affichage de l'XP via la méthode DrawString en bas de la classe PlayScreen. En gros j'essaie de faire comme ça :


string info = "XP : " + playerProgression.GetXP() + " Level : " + playerProgression.GetLevel() + " Kills: " + playerProgression.GetKills();

Le truc c'est que évidemment il faudrait, pour que ça marche, créer une nouvelle instance de PlayerProgression au sein de PlayScreen. Là en faisant sans la création de cette instance j'ai une erreur du type "NullReferenceExeption" quand je lance une partie. Mais je ne veux pas recréer une instance "playerProgression = new PlayerProgression();" à chaque fois que PlayScreen se lance (cad à chaque fois qu'on fait Play Again quand on crève) pour justement éviter de remettre à 0 l'XP.
J'ai donc relu ton post LaVaBo, là où tu parles de créer un attribut du type PlayerProgression. Ne connaissant pas du tout ce genre d'astuce de prog, j'ai fouiné un peu et vu qu'il fallait par exemple mettre ça en haut de la classe dont on veut récupérer des valeurs :


[AttributeUsage(AttributeTargets.All)]
public class PlayerProgression : System.Attribute


Comme fait-on pour pouvoir utiliser, avec les attributs, ma méthode "GetXP()" (qui revoit l'XP sous forme de string) dans PlayScreen sans avoir à créer une nouvelle instance de PlayerProgression ?

EDIT : Ahah, je viens de voir qu'il est possible d'appeler une méthode d'une autre classe sans l'instancier simplement en la déclarant comme static !

EDIT 2 : Wouhou ça marche :lol:
Je ne sais pas si c'est très élégant, et pour l'instant je n'y vois pas d'inconvénient, mais j'ai tout mis en static dans PlayerProgression (variables telles que l'XP, les méthodes...) pour pouvoir appeler facilement les méthodes et les mettre à jour dans la classes PlayScreen.
Du coup, quand je crève je garde bien mon XP quand je respawn. PROFIT !

L-F. Sébum
09/11/2011, 09h47
Je n'ai pas suivi toute la conversation mais je ne vois pas trop où est le problème, ni comment tu peux te retrouver avec un nullReferenceException.

Tu n'as qu'à instancier un playerProgression dans le constructeur de StarShooterGame (et non pas dans Initialize(), à mon avis ton nullReference vient de là) et après le passer en paramètre dans les constructeurs des classes qui l'utilisent.

C'est plus élégant que d'utiliser des méthodes statiques et tu es sûr que ce dont tu as besoin sera accessible partout.

Et je ne vois pas trop l'intérêt d'utiliser des attributs pour ça.

Dans le truc que je code actuellement, j'ai quelque chose comme :

Game.cs
--->World.cs
------>PlayerEntity.cs

Et bien le constructeur de la classe World prend en paramètre Game, le constructeur de la classe PlayerEntity prend en paramètre la classe World, etc...

Après, dans chaque classe, le "parent" est stocké comme référence (publique) ce qui permet si nécessaire de "remonter" jusqu'à Game.

Tomaka17
09/11/2011, 10h03
EDIT 2 : Wouhou ça marche :lol:
Je ne sais pas si c'est très élégant, et pour l'instant je n'y vois pas d'inconvénient, mais j'ai tout mis en static dans PlayerProgression (variables telles que l'XP, les méthodes...) pour pouvoir appeler facilement les méthodes et les mettre à jour dans la classes PlayScreen.
Du coup, quand je crève je garde bien mon XP quand je respawn. PROFIT !


On pourrait se dire "comme il n'y a qu'un seul joueur de toutes manières, pourquoi ne pas créer une variable globale contenant mon PlayerProgression, et mon PlayScreen va mettre à jour cette variable globale directement"
C'est un peu difficile à expliquer sans rentrer dans des détails bien chiants, mais faire ça, c'est mal, il vaut mieux le passer comme paramètre

Tu noteras que j'avais anticipé le fait que tu ferais ça ;)
Absolument personne n'aime (http://stackoverflow.com/questions/484635/are-global-variables-bad) les variables globales (http://fr.wikipedia.org/wiki/Variable_globale#Inconv.C3.A9nients) (les classes avec tout en static et les singleton c'est la même chose)

Je vois pas trop où tu as pu faire une connerie
Je n'ai jamais fait de C# mais en principe tu devrais faire quelque chose qui ressemble à ça :

Game1.cs :

public class Game1 {
PlayerProgression playerProgression;
PlayScreen playScreen;

public Game1() {
playerProgression = new PlayerProgression();
playScreen = new PlayScreen(playerProgression);
}
};

PlayScreen.cs :

public class PlayScreen {
PlayerProgression playerProgression;

public PlayScreen(PlayerProgression p) {
playerProgression = p;
}
};

L'objet 'p' que tu reçois dans le constructeur de PlayScreen sera le même que celui que tu as créé dans Game1

Teto
09/11/2011, 10h57
Merci Tomaka sur le pourquoi du comment de l'inconvénient des variables globales.

Seulement cela veut dire aussi que chaque instance a en mémoire son parent, et donc utilise de la mémoire pour ça (à priori). Quid quand on commence à faire des milliers d'instances (genre des pnj) possédant chacun une ou plusieurs références aux parents et autres objets indispensables à son fonctionnement (mais qui font appel à un objet unique) ?

L'avantage de l'objet statique (donc unique) est de l'appeler "facilement" quand on en a besoin, et donc ne pas s'embarrasser de l'avoir en mémoire. Et il me semble que quand il faut débugger, si on appelle World.getWorld().faitActionX(), World.getWorld() étant l'appel à un objet statique unique, on sait de quoi on cause, je ne vois pas les problèmes de compréhension (je fais référence au second lien de Tomaka).

Belhoriann
09/11/2011, 11h13
Merci à LFS et Tomaka ! Ma structure est en effet comme vous dites, mais j'ai mis en static toute la classe PlayerProgression pour pouvoir accéder facilement à ses méthodes comme le dit Teto.

Si je fais comme tu dis Tomaka, c'est à dire ça :


public class PlayScreen {
PlayerProgression playerProgression;

public PlayScreen(PlayerProgression p) {
playerProgression = p;
}
};

J'ai un problème quand j'écris ça dans la zone Update() de PlayScreen :



p.TotalKilled();
p.CheckXP();
p.CheckLevel();

Se sont 3 méthodes de la classe PlayerProgression que j'ai besoin d'appeler pour mettre à jour les infos du joueurs. Mais j'ai une erreur qui dit :


Le nom 'p' n'existe pas dans le contexte actuel

De plus j'ai besoin d'accéder à d'autres méthodes de la classe PlayerProgression dans la classe de chaque ennemie, pour mettre à jour le compteur de kills de chaque type de vaisseau. C'est pour ça que mettre en static je trouvais ça super pratique.

Je suis bien conscient que mes problèmes viennent d'un manque de connaissances basiques en programmation, et quand j'aurai bien tout compris ça me paraîtra trivial :emo:

EDIT : My bad, c'est pas p.TotalKilled(); qu'il faut écrire mais plutôt playerProgression.TotalKilled();
Pas évident de programmer en sortant du lit.

Tomaka17
09/11/2011, 11h27
Merci Tomaka sur le pourquoi du comment de l'inconvénient des variables globales.

Seulement cela veut dire aussi que chaque instance a en mémoire son parent, et donc utilise de la mémoire pour ça (à priori). Quid quand on commence à faire des milliers d'instances (genre des pnj) possédant chacun une ou plusieurs références aux parents et autres objets indispensables à son fonctionnement (mais qui font appel à un objet unique) ?

L'avantage de l'objet statique (donc unique) est de l'appeler "facilement" quand on en a besoin, et donc ne pas s'embarrasser de l'avoir en mémoire. Et il me semble que quand il faut débugger, si on appelle World.getWorld().faitActionX(), World.getWorld() étant l'appel à un objet statique unique, on sait de quoi on cause, je ne vois pas les problèmes de compréhension (je fais référence au second lien de Tomaka).

Je suis aussi contre le fait que chaque objet ait en mémoire son "parent"

Pour moi si un objet a besoin d'un pointeur vers son propriétaire c'est qu'il y a déjà un problème dans le schéma, puisque cela force l'objet à être utilisé dans une situation précise. Idéalement un objet ne devrait pas savoir quel est son propriétaire.
Je pense que n'importe quel problème a une solution "propre", qui ne nécessite ni variable globale, ni couplage interface-implémentation, etc. il faut juste la trouver et ne pas forcément se réfugier vers sa première idée. Évidemment IRL t'as pas forcément le temps de réfléchir à une solution propre (euphémisme), et c'est justement ça la cause de nombreux bugs.

Par exemple si tu as des milliers de PNJs, pourquoi ne pas stocker leurs infos dans une simple structure et les mettre à jour depuis l'extérieur plutôt que d'appeler des fonctions "Update".


Et pour Belhoriann : la variable "p" n'existe que dans le constructeur, c'est pour ça qu'on en fait une copie dans "playerProgression". Il faut donc que tu utilises "playerProgression" dans ta fonction Update. Bon après tu fais comme tu veux...

Belhoriann
09/11/2011, 11h30
Et pour Belhoriann : la variable "p" n'existe que dans le constructeur, c'est pour ça qu'on en fait une copie dans "playerProgression". Il faut donc que tu utilises "playerProgression" dans ta fonction Update. Bon après tu fais comme tu veux...

Oui oui j'ai vu ça, j'ai édité mon post. V'la le gros noob :p
Merci en tout cas, ces discussions m'en apprennent beaucoup, et j'espère que c'est le cas pour tout les autres noob ici.

LaVaBo
09/11/2011, 11h40
Pour répondre à ta question, c'est parce que la variable p n'est connue que dans le cadre de la fonction du constructeur. C'est un point de programmation important mais pas instinctif : la portée d'une variable (ça rejoint la problématique de Tomaka17 sur les variables globales). Dans ta classe PlayScreen, l'instance de PlayerProgression s'appelle playerProgression, et pas du tout p. p existe uniquement dans le constructeur de PlayScreen, or lorsque tu appelles les fonctions TotalKilled() ou CheckXP(), j'imagine que tu n'es plus dans le constructeur.

Sinon, un dernier point : dans les best practices, la règle de nommage est de commencer par une minuscule, pour les variables et pour les methods. L'écriture du nom en minuscule commençant par une majuscule est dédiée aux noms de classes (et évidemment au prototype du constructeur de la classe). Et les noms de variables entièrement en majuscules pour les constantes, qui sont positionnées une fois et ne sont plus modifiées ensuite (ex : définition manuelle de pi, ou un string de titre de menu).

Belhoriann
09/11/2011, 12h02
Wokay, ça marche !
Ce coup ci, plus de static dans tous les sens, juste une instance au tout début, et des constructeurs qui trimbalent une variable PlayerProgression p.
J'avais une erreur nullReferenceException parce que j'avais oublié de créer cette variable dans les constructeurs des écrans intermédiaires du jeu. En gros on a :

Game1.cs (Création de l'instance new PlayerProgression())
-->MainMenuScreen.cs (C'est ici que j'avais oublié de mettre playerProgression dans le constructeur pour faire le pont, car c'est à partie de MainMenuScreen que l'on lance PlayScreen qui a en argument playerProgression)
---->PlayScreen.cs

Mais si j'ai bien compris, Tomaka tu as un problème avec cette méthode ?

Tomaka17
09/11/2011, 12h10
J'ai dit que j'avais un problème avec les variables globales, classes avec que des fonctions statiques, singleton, etc. (problème c'est un grand mot, je suis juste contre, si on me demande de faire des modifs sur un programme qui utilise cette méthode je vais pas tout chambouler par exemple)

Dans ton cas il y a juste un truc "pas propre", c'est le fait que MainMenuScreen créé et stocke PlayScreen. Après tout, il n'est pas logique que le menu principal soit propriétaire du jeu. Il vaudrait mieux que quand tu cliques sur "Commencer la partie", ça envoie un "message" à Game1 sous la forme d'un callback (soit du genre "début de partie demandé", soit en renvoyant le PlayScreen créé sous la forme d'un pointer vers une interface), et c'est Game1 qui stocke le PlayScreen.
Note : ne te sens pas du tout obligé de changer ça, c'est un détail. Les problèmes qui en découlent tu ne les ressentiras éventuellement que si tu fais un très gros programme

Teto
09/11/2011, 12h27
Je commence à comprendre ce que tu veux dire. En fait, ta philosophie c'est "Chacun son métier, les vaches seront bien gardées".
A (World) crée B (GUI) et C (écran de jeu).
C n'a pas à savoir ce qu'est B, en revanche il connait A, qui l'a crée.
Donc une bonne logique de programmation c'est:
- C vient de recevoir la commande que le joueur a appuyé sur "play".
- C envoie donc cette commande à A, en lui disant "coco, le joueur a appuyé sur play, fais ce qu'il faut pour lancer l'écran de jeu".
- A se débrouille ensuite avec B qu'il a crée pour afficher l'écran.

Dans ces conditions effectivement, cela rend le travail de débogage bien plus efficace. Car sinon, si C squeeze A pour donner des ordres directement à B, ce serait vite le bordel sur de gros projets. Comme dans la vrai vie, en somme. ;)

Belhoriann
09/11/2011, 12h31
Ouais, d'un point de vue conceptuel c'est bien propre. Cependant niveau programmation j'imagine que cela demande un certain doigté que je ne possède pas. Alors je vais laisser les choses comme ça, mon premier jeu ne sera de toute façon jamais un énorme programme ;)

Tomaka17
09/11/2011, 12h36
(EDIT : en réponse à Teto)
Exactement

Si on veut ma philosophie c'est :
- je conçois d'abord l'interface d'une classe avant son implémentation (l'interface c'est la façon dont la classe communique avec les autres, c'est à dire ses fonctions publiques, son rôle, etc.)
- ne surtout pas créer l'interface en ayant en tête la façon dont ça va fonctionner en interne, surtout pas, il faut que ce soit le fonctionnement qui s'adapte à l'interface
- j'essaye de faire une interface aussi simple et réduite que possible (pour réduire les bugs dus aux incompréhensions)
- moins une classe utilise d'autres classes dans son interface, mieux ça vaut (couplage faible)
EDIT: - dans un programme idéal, tu devrais pouvoir créer deux instances de la classe principale (ici Game1) et les exécuter en simultané sans que cela ne pose de problème

C'est un peu abstrait, je suis pas sûr d'avoir bien expliqué le truc, mais ça fait partie de mes "good practices"


Encore un EDIT : au passage je pense que mes good practices vont bien évoluer avec l'introduction vraisemblable des modules (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2316.pdf) dans la prochaine version de C++ (C++16 ?)

Belhoriann
09/11/2011, 13h20
Rassure moi, ton métier c'est programmeur ?

Teto
09/11/2011, 13h23
Ouais, d'un point de vue conceptuel c'est bien propre. Cependant niveau programmation j'imagine que cela demande un certain doigté que je ne possède pas. Alors je vais laisser les choses comme ça, mon premier jeu ne sera de toute façon jamais un énorme programme ;)
Ouais. Mais je te recommande vivement de prendre de bonnes habitudes tout de suite. :) Tomaka et d'autres programmeurs pourront te confirmer que quand tu prends des habitudes, après pour les changer c'est la plaie (d'Égypte). Tu pars quand même sur un petit jeu qui va te prendre du temps, parce que tu apprends. Si tu assimiles des choses qui fonctionnent mais qui sont crades, ce sera beaucoup plus difficile pour toi de "désapprendre". Ne serait-ce que parce que tu voudras aller vite, et t'auras "pas le temps" de penser à ta manière de programmer.

Surtout que si ton jeu fonctionne bien, tu seras plus ambitieux pour le suivant, et là tes mauvaises habitudes te reviendront à la face. ;)

Exemple mylife : J'ai appris le graphisme avec The Gimp et la souris. Pour dessiner, le top c'est quand même le crayon. Je me suis acheté une tablette. Elle prend la poussière. Pourquoi ? J'avais tellement appris à dessiner avec une souris que je n'arrivais à rien avec un stylet. Pathétique.

Belhoriann
09/11/2011, 14h05
Je suis entièrement d'accord avec toi, c'est d'ailleurs pour cela que j'ai abandonné le truc des méthodes static pour quelque chose de plus propre, comme suggéré par Sebum et Tomaka. Mais j'ai pu le faire parce que j'avais suffisamment de connaissance technique pour y arriver. Dans le cas des callbacks, n'y connaissant strictement rien, je préfère ne pas les utiliser de peur de m'y embourber et de me décourager rapidement.

Teto
09/11/2011, 14h30
Pas le temps de développer (boulot) mais rien de sorcier. C'est un jargon pour dire "Je donne des actions/demandes à mon parent, et il s'en démerde".

Tu vas avoir beaucoup plus de mal avec les gestions d'événements, crois-moi (c'est d'ailleurs un peu la même chose). Une fois compris, c'est ultra-simple à s'en servir, mais faut comprendre, sinon ça ne fonctionne pas ou sa bogue et on ne sait pas pourquoi.

Tomaka17
09/11/2011, 14h39
Le principe d'un callback, c'est que plutôt qu'une classe fasse une action elle-même, c'est son propriétaire qui lui dit quelle action effectuer

Imagine par exemple que tu as une classe "Bouton". Quand l'utilisateur clique sur un bouton, la classe le détecte, mais plutôt que d'effectuer l'action elle-même, elle va signaler à son propriétaire qu'on lui a cliqué dessus, et c'est le propriétaire qui fait ce qu'il faut faire. Ça permet d'avoir des classes plus génériques, et ça c'est le bien :p

Encore une fois je n'ai jamais fait de C#, mais par exemple en C++ ça donnerait grosso-modo ça :

class Menu {
Bouton boutonJouer;
Bouton boutonOptions;
Bouton boutonQuitter;

Menu() {
// constructeur de la classe Menu

// on dit au bouton jouer ce qu'il doit faire quand on lui clique dessus
boutonJouer.setActionCallback([&]() {
// le code ici sera exécute quand on clique sur le bouton jouer
jouer();
});

// pareil pour les autres boutons
boutonOptions.setActionCallback([&]() {
ouvrirOptions();
});

boutonQuitter.setActionCallback([&]() {
exit();
});
}

void jouer() {
...
}

void ouvrirOptions() {
...
}
};


class Bouton {
std::function<void ()> callback; // variable dans laquelle on va stocker le callback, ne prête pas attention au type un peu bizarre, c'est du C++

void setActionCallback(std::function<void ()> cb) {
callback = cb;
}

void clickDetecte() {
// on a détecté un click !
// on appelle le callback
callback();
}
};

De cette façon tu as la même classe "Bouton" qui sert à la fois aux boutons Jouer, Options et Quitter.

Parfois tu peux aussi croiser du code basé sur les événements : le bouton déclenche un événement nommé "click" qui est détecté par son propriétaire. C'est une variante qui a ses avantages et ses inconvénients.

Un autre avantage des "good practices" dont on parle depuis 3 pages c'est que tu arrives assez vite à des classes "définitives", c'est-à-dire que tu n'as plus besoin de les modifier par la suite. Là par exemple je code une fois la classe Bouton, et après je n'ai plus besoin d'y toucher. Alors que si je n'utilise pas de callback je suis obligé de modifier la classe Bouton à chaque fois que je rajoute un bouton dans le menu.

Raddi
10/11/2011, 05h16
Je veux pas vous faire chier, mais vous pourriez pas créer un autre topic pour parler de tout ça ? C'est un peu hors-sujet je trouve : vous ne parlez pas de la rubrique du mag et je suis bien certain que les débutants dans mon genre ne comprennent pas un mot de ce que vous racontez. Or cet espace leur est destiné si j'ai bien compris. Après, ceux qui sont plus avancés peuvent demander des conseils bien sûr mais en faire des pages et des pages c'est un peu lourd... Voilà, vous pouvez me balancer des pierres ou des termes abscons maintenant :p

Teto
10/11/2011, 09h13
Nan, t'as parfaitement raison.

Conan3D
10/11/2011, 09h22
Je veux pas vous faire chier, mais vous pourriez pas créer un autre topic pour parler de tout ça ? C'est un peu hors-sujet je trouve : vous ne parlez pas de la rubrique du mag et je suis bien certain que les débutants dans mon genre ne comprennent pas un mot de ce que vous racontez. Or cet espace leur est destiné si j'ai bien compris. Après, ceux qui sont plus avancés peuvent demander des conseils bien sûr mais en faire des pages et des pages c'est un peu lourd... Voilà, vous pouvez me balancer des pierres ou des termes abscons maintenant :p

Tu n'es pas seul :emo:

Belhoriann
10/11/2011, 10h47
Arf, je m'excuse d'avoir un peu monopolisé le topic avec mes soucis :emo:
Cela dit moi aussi je débute, et je pense que notre discussion contient de nombreuses informations importantes, alors profitez en au lieu de pleurer :ninja:
Mais dans le fond vous avez raison, la prochaine fois que j'ai besoin d'aide sur mon jeu, je créerai un topic dédié.

Teto
10/11/2011, 16h40
Je te conseille même de créer un topic de ton jeu qui te servira aussi de blog. ;) Plein de canards font ça et ça marche bien.

Metalsphere
10/11/2011, 22h45
Bonjour, suite à la découverte de la rubrique développez couché, je me suis motivé pour la suivre et assouvir un vieux rêve: coder des jeux sérieusement.

J'ai téléchargé les outils sans problème, et compilé le monochrome. Par contre, je n'arrive pas à lancer Lapin sur un fond gris.

Voici une capture du code et de l'explorateur de fichier:
http://tof.canardpc.com/view/98198dd7-ef47-4a90-9013-45388061186a.jpg

Normalement, il ne manque rien, pourtant j'obtiens le message d'erreur suivant:

Error loading "gros_lapin.png". File not found.

Une bonne âme qui aurait une idée ? :emo:

L-F. Sébum
10/11/2011, 23h09
Une bonne âme qui aurait une idée ? :emo:

Replace "gros_lapin.png" par "gros_lapin" dans ton code. Dans XNA, il ne faut pas (sauf si on renomme la ressource) préciser l'extension. C'est idiot mais c'est comme ça.

Metalsphere
11/11/2011, 00h02
Nickel, merci bien. J'attends la suite avec intérêt. :)

olaf
12/11/2011, 01h06
En tout cas, je vote pour au moins une deuxième page consacrée à développez-couché dans les prochains mags.
En gros nOObs, je me suis jeté corps et âmes depuis une semaine dans tous les tutoriaux.
Bon ...J'ai pas encore tout compris, mais j'ai déjà plus trop peur de rêver de classe, de variable et d'incrémentation la nuit!
Je me donne plus très longtemps pour être au niveau <_<

En gros Sébum, ta rubrique je sens qu'elle va se faire attendre de quinze en quinze avec autant de fébrilité qu'un troupeau de buffle dans un slip trop serré.

Nacodaco
15/11/2011, 00h40
Je soutiens aussi cette nouvelle rubrique ! (pourquoi 1 seul page ? :'( ) Merci beaucoup à toi !

J'attend personnellement encore 1 ou 2 mags avant de me lancer dans le bousin, ça m'évitera de pleurer chaque semaine (c'est déjà fini ?!?). D'autant plus que je ne devrais pas vraiment rencontrer de difficultés pour le début :)

Nashkel
15/11/2011, 21h31
Salut tout le monde, j'ai juste une question débutant pour un code ( j'ai pas trouvé de topic où poser ma question) :


namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int Multiply(int x,int y)
{
return x*y;

int number1= 3;
int number2= 2;
int number3= Multiply (number1, number2);

Console.WriteLine (number3);
Console.Read();
}
}
}
}


Il me retourne tout le temps " } attendue " et " Définition de type ou d'espace de noms, ou fin de fichier attendue", alors que y a bien le bon nombre de parenthèses :huh:

Par ailleurs super idée Sébum, ça m'a donné envie de me mettre enfin au codage !

war-p
15/11/2011, 21h43
Heu pourquoi t'as une un fonction int multiply en plein milieu de ton main?

olaf
15/11/2011, 23h13
En fait je pense que tu dois mettre ton } après ton return, non? sans quoi tu appelles la méthode dans la méthode.
Je pense que tu dois d'abord définir ta méthode, et ensuite l'appeler.

Nashkel
16/11/2011, 03h27
La fonction int Multiply c'est pour tester la méthode Multiply ( un exercice débutant disponible ici (http://www.siteduzero.com/tutoriel-3-344130-les-methodes.html)). Le problème c'est que même avec une autre méthode genre " void SayHello" j'ai le même problème !

Et j'ai toujours le problème si je " ferme" après return.

Edit : Ok merci à vous, le problème c'est que je pensais qu'il fallait tout mettre dans le Main, mais j'ai déplacé mon int Multiply avant le Main et j'ai mis static devant int Multiply et ça marche !

Stele
16/11/2011, 16h33
De cette façon, cela fonctionnera:



class Program
{
int Multiply(int x,int y)
{
return x*y;
}

static void Main(string[] args)
{
Program p = new Program();

int number1= 3;
int number2= 2;
int number3= p.Multiply (number1, number2);

Console.WriteLine (number3);
Console.Read();
}
}


La fonction main sert à lancer ton programme.
Pour appeler les méthodes de la classe Program, tu dois instancier un objet de type Program dans ton main : Program p = new Program();
Tu peux ensuite utiliser cet objet pour appeler les méthodes de la classe Program:
int number3= p.Multiply (number1, number2);

Nashkel
16/11/2011, 19h47
Merci ! Effectivement, ça me permet de me passer du static devant ma fonction int Multiply

rOut
17/11/2011, 23h12
Moi je dis juste : excellente initiative, j'aurais adoré lire ce genre d'article il y a quelques années (maintenant c'est trop tard et de toute manière sous Linux, c'est mort), et si ça permet de faire un véritable jeu de bout en bout, c'est encore mieux.

Et peu importe le langage, le C# c'est parfait pour ce genre d'apprentissage.

L-F. Sébum
18/11/2011, 20h15
Le code source de la leçon 1 est en ligne.

olaf
18/11/2011, 21h05
Alors j'ai une petite question à propos de la leçon n°2 :

Dans la méthode Draw, on inscrit :


spriteBatch.Draw(texture_lapin, new Vector2(x, y), Color.White);

mais voilà, la deuxième valeur est un vecteur à 2 dimensions, et non un "rectangle de destination" comme indiqué sur l'aide de Visual...
J'avoue que je saisi pas comment ça peut fonctionner.

ça voudrait dire que l'on peut remplacer un rectangle par un vecteur2 ? Mais du coup il manque la moitié des informations, non?

L-F. Sébum
19/11/2011, 00h54
En fait, la méthode Draw de Spritebatch accepte plusieurs séquences de paramètres.

C'est ce qu'on appelle une méthode surchargée. Il est par exemple possible d'écrire une méthode qui accepte comme paramètres un int puis un string, ou bien un int seulement (c'est très utile quand on a des paramètres optionnels pas nécessaires dans toutes les situations).

Parmi les options possibles pour Spritebatch.Draw(), on a :

SpriteBatch.Draw (Texture2D, Vector2, Color)
SpriteBatch.Draw (Texture2D, Rectangle, Color)
SpriteBatch.Draw (Texture2D, Rectangle, Rectangle, Color)
SpriteBatch.Draw (Texture2D, Rectangle, Rectangle, Color, Single, Vector2, SpriteEffects, Single)

et encore un ou deux autres (la liste complète ici (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.draw. aspx)).

Dans la leçon numéro 2, c'est "texture2D, vector2, color" qui est utilisé.

Bien entendu, quand on passe un vecteur en paramètre et pas un rectangle, c'est la taille d'origine de l'image qui est utilisée.

olaf
19/11/2011, 01h06
Yes! Merci Mister Sebum pour cette explication claire!

Je constate d'ailleurs en manipulant la méthode que lorsqu'on ajoute une virgule, le programme nous fait apparaître une petite info-bulle, dans laquelle on peut faire défiler les différentes formules.

Classe.
Je retourne coder....

gros_bidule
19/11/2011, 20h46
Mais mais... mais qu'est-ce donc que cette indentation dans le dernier numéro ? Pourquoi tant de haine ? :emo:

L-F. Sébum
19/11/2011, 21h13
Mais mais... mais qu'est-ce donc que cette indentation dans le dernier numéro ? Pourquoi tant de haine ? :emo:

Ah oui en effet, j'avais même pas fait gaffe. Des tabulations ont dû être rajoutées au moment du copier-coller vers la maquette.

En même temps c'est un bon test pour savoir si tu souffres de trouble obsessionnel compulsif.

Tomaka17
19/11/2011, 22h10
Petite question, mais le "override" est obligatoire en C# ? Ou il est là juste parce que c'est bien de le mettre ?

rOut
19/11/2011, 23h20
C'est obligatoire quand tu implémentes une méthode virtuelle ou abstraite héritée.

Don Moahskarton
23/11/2011, 21h58
Ma didonc, c'est que tu as du succès, LFS, avec tes cours d'XNA ^^
J'ai franchement pas trop de temps en ce moment pour me pencher sur ton sujet, mais je suis curieux de ce que ca donnera sur le long terme.
Est-ce la le renouveau ce ce qu'était 3D Game Creator en son temps ?

@Tomaka17 : Je m'y connait pas trop trop en C#, mais root a raison (toujours). Lors d'un héritage, il faut toujours redéfinir dans la classe fille les méthodes dites "abstraites" dans la mère. C'est un moyen d'avoir un code polymorphique.

Algent
24/11/2011, 14h26
Vraiment sympatoche tes cours, c'est très accessible et pour quelqu'un comme moi qui a fait principalement du C et du Java jusque la c'est plutôt intéressant.
Et bon sang après un mois de C ansi ça fait du bien de revoir des classes :wub:, et une vraie ide aussi (emacs... ><).

Pour les débutant qui se demandent comment centrer un sprite, il faut utiliser les dimension de votre fenêtre (idéalement de façon dynamique) et du sprite.

x = GraphicsDevice.Viewport.Width / 2 - texture_lapin.Width / 2;
y = GraphicsDevice.Viewport.Height / 2 - texture_lapin.Height / 2;

Nacodaco
03/12/2011, 22h01
Une question :

Apparemment, Visual C# express est une partie de Visual Studio 2010. Si on a accès à ce dernier est qu'on peut l'utiliser à la place ? Ca ne posera pas trop de problème ?

---------- Post added at 21h01 ---------- Previous post was at 20h53 ----------

D'ailleurs, je suis le lien en premier poste, je clique sur "Télécharger", je remplis le formulaire et ça me télécharge Microsoft Visual Basic Express...WTF ?!?

TheToune
03/12/2011, 22h26
Les Visual express sont effectivement des versions allégé de visual studio ... Donc fonce tu ne peut qu'y gagner.
Perso j'utilise c++ 2010 express sur mon pc perso ( J'ai une License visual studio 2008 pour le boulot mais qui n'est pas compatible avec mon seven 64 ) et certains manque sont parfois pénible (principalement le débogueur trop limité et l'impossibilité d'annuler une compilation ).

Nacodaco
03/12/2011, 22h36
Merci de ta réponse :)

Par contre c'est vraiment étrange pour le lien en première page. Il y a bien marqué "C# express" au début, mais après le formulaire, ça télécharge Visual Basic (qui apparemment ne permet pas de faire de projet C#).

nunch
04/12/2011, 22h12
Merci de ta réponse :)

Par contre c'est vraiment étrange pour le lien en première page. Il y a bien marqué "C# express" au début, mais après le formulaire, ça télécharge Visual Basic (qui apparemment ne permet pas de faire de projet C#).J'ai eu le même problème.
Je suis passé par la page anglaise de Visual C# express (http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express). On peut sélectionner le français comme langue.

ElGato
05/12/2011, 10h23
Si je peux me permettre, et même si ça demande un petit effort au début, il vaut mieux utiliser un environnement en anglais.

Parce que du coup toutes les options, tous les messages d'erreur seront aussi en anglais, et qu'il sera donc bien plus facile de faire des recherches sur Internet en cas de souci.
Et il y aura forcément plein de messages d'erreur au début, et ils ne seront pas beaucoup plus compréhensibles en français qu'en anglais de toute façon...

Tomaka17
05/12/2011, 10h29
C'est pas forcément vrai, mon Visual C++ est en français et affiche tous ses messages d'erreur en français (remarque, je l'ai relancé juste pour vérifier avant de poster parce que j'étais plus sûr)
Au pire des cas il y a un code d'erreur devant qu'il suffit de taper dans Google pour avoir des informations un peu plus fournies à son sujet

En revanche là où l'anglais est omniprésent c'est dans le code lui-même et dans ses commentaires. Par exemple tu n'écriras jamais "largeurEcran" mais plutôt "screenWidth".
Il y a rien de plus chiant que de tomber sur un code source en portugais ou en bengali, et c'est à ce moment là que tu comprends qu'il faut éviter de coder en français

TheToune
05/12/2011, 11h18
En revanche là où l'anglais est omniprésent c'est dans le code lui-même et dans ses commentaires. Par exemple tu n'écriras jamais "largeurEcran" mais plutôt "screenWidth".
Il y a rien de plus chiant que de tomber sur un code source en portugais ou en bengali, et c'est à ce moment là que tu comprends qu'il faut éviter de coder en français

Tu fais comme tous les codeurs fr ... tu code en franglais ! :ninja:

rOut
05/12/2011, 11h42
A quand un langage dont les mots clefs seraient localisés ? Genre :


si(bla > 0) {
tantque(bla > 0) {
pour(entier32 i = 0; i < bla; ++i) {
affichef("test2 %d\n", bla);
}
bla--;
}
} sinon {
affichef("test %d\n", bla);
}


:3

TheToune
05/12/2011, 11h50
A quand un langage dont les mots clefs seraient localisés ? Genre :


si(bla > 0) {
tantque(bla > 0) {
pour(entier32 i = 0; i < bla; ++i) {
affichef("test2 %d\n", bla);
}
bla--;
}
} sinon {
affichef("test %d\n", bla);
}


:3

Il y en a ... Mais j'ai la flemme de rechercher les noms ... ^^

Il y avait aussi un délire avec un language qui permettait une "localisation" et ça a donné des dérivé en fr , en language roxor et autres conneries ...

Chov
05/12/2011, 12h00
hey les canards! petit souçis pour afficher les saucisses....me dit que "le nom saucisses n'existe pas dans le contexte actuel" dans la fenetre liste d'erreurs....

merci pour votre aide...

Conan3D
05/12/2011, 20h05
hey les canards! petit souçis pour afficher les saucisses....me dit que "le nom saucisses n'existe pas dans le contexte actuel" dans la fenetre liste d'erreurs....

merci pour votre aide...

J'ai ri. Je sais pas pourquoi. Un rire gros et gras.

L-F. Sébum
05/12/2011, 20h12
hey les canards! petit souçis pour afficher les saucisses....me dit que "le nom saucisses n'existe pas dans le contexte actuel" dans la fenetre liste d'erreurs....

merci pour votre aide...

Rien ne devrait s’appeler "saucisses".

Tu as "texture_saucisse" d'un côté (un objet de type Texture2D) et le fichier "saucisse.png" de l'autre. C'est tout.

Chov
06/12/2011, 11h04
Bon, je veux pas faire le relou avec mes saucisses volantes, mais bon, donc je suis le tuto depuis le debut tout se passe bien....j'arrive à avoir le lapin dans la soucoupe volante nikel par contre au niveau du paragraphe
Chapelet de saucisses j'y arrive plus....
y'a marqué "Ajoutez ces lignes dans la méthode Draw donc déjà la, un peu pommé et donc y'a la ligne :

for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);


Alors j'ai inséré ça dans ce paragraphe je sais pas si c'est le bon ....

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Gray);

spriteBatch.Begin();
spriteBatch.Draw(texture_lapin, new Vector2(x, y), Color.White);
spriteBatch.End();
for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);

voilà voilà et désolé de poser des questions de noob monsieur Conan3D.....

Stele
06/12/2011, 11h18
Tu dois ajouter ces lignes entre les appels spriteBatch.Begin() et spriteBatch.End(). Sinon, je ne pense pas que tes instructions "Draw" soient prises en compte.

MoB
06/12/2011, 11h19
Chov, je pense que Conan3D se moque plus du message d'erreur contenant le mot saucisse (ce qui est très drôle il faut l'avouer) que de toi.

Teto
06/12/2011, 11h59
Chov, je pense que Conan3D se moque plus du message d'erreur contenant le mot saucisse (ce qui est très drôle il faut l'avouer) que de toi.
Voilà.

Et à priori,
spriteBatch.End();
se met après
for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);

Chov
06/12/2011, 12h43
Merci pour ton aide Stele mais toujours le même problème......

spriteBatch.Begin();
spriteBatch.Draw(texture_lapin, new Vector2(x, y), Color.White);
for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);
spriteBatch.End();

c'est le nom saucisse après le "new Vector2" qu'il veut pas en marquant dans la liste d'erreur qu'il n'existe pas dans le contexte actuel...
Et désolé Conan3D, cette histoire de saucisse me tiens trop à coeur et me fais perdre mon sens de l'humour.......

LaVaBo
06/12/2011, 13h11
Merci pour ton aide Stele mais toujours le même problème......

spriteBatch.Begin();
spriteBatch.Draw(texture_lapin, new Vector2(x, y), Color.White);
for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);
spriteBatch.End();

c'est le nom saucisse après le "new Vector2" qu'il veut pas en marquant dans la liste d'erreur qu'il n'existe pas dans le contexte actuel...
Et désolé Conan3D, cette histoire de saucisse me tiens trop à coeur et me fais perdre mon sens de l'humour.......

Tu as déclaré ton tableau appelé saucisse quelque part ?

Ensuite, est-ce qu'il est "initialisé" (ie les 4 cases contiennent quelque chose) au moment de rentrer dans ce morceau de code ?
Faudrait que tu envoies un morceau de ton code plus conséquent pour investiguer.

Chov
06/12/2011, 13h18
Voilà le code en entier :

public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D texture_lapin;
Texture2D texture_saucisse;

float x;
float y;

public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}

/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here

base.Initialize();
}

/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
texture_lapin =
Content.Load<Texture2D>("canardage_lapin");
texture_saucisse = Content.Load<Texture2D>("saucisse");

float[]saucisses=new float[4];
saucisses[0] = 750;
saucisses[1] = 700;
saucisses[2] = 650;
saucisses[3] = 600;

x = 0;
y = 0;
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);

// TODO: use this.Content to load your game content here
}

/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}

/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
if (Keyboard.GetState().IsKeyDown(Keys.Up)) y = y - 1;
if (Keyboard.GetState().IsKeyDown(Keys.Down)) y = y + 1;

if (Keyboard.GetState().IsKeyDown(Keys.Left)) x = x - 1;
if (Keyboard.GetState().IsKeyDown(Keys.Right)) x = x + 1;


base.Update(gameTime);
}

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Gray);

spriteBatch.Begin();
spriteBatch.Draw(texture_lapin, new Vector2(x, y), Color.White);
for (int i = 0; i < 4; i += 1)
spriteBatch.Draw(texture_saucisse, new Vector2(saucisse[i], i * 125), Color.White);
spriteBatch.End();

// TODO: Add your drawing code here


base.Draw(gameTime);

En espérant que vous y verrez plus clair, moi suis paumé dans tout ça.......