30

Tu programmes quoi ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

31

une appli graphique genre win32 avec un frame sur lequel je dessine, et des évènements souris/clavier à gérer grin

au début j'ai fait du winmain/messageloop puis j'ai vite migré en Qt pour que ce soit portable smile

32

Zephyr (./22) :
En revanche le verdana.drawText me semble difficilement justifié ("verdana" si c'est une police est un attribut ou "entité", et non un contrôleur, et devrait donc logiquement être un paramètre plutôt qu'un objet possédant des méthodes d'affichage)... enfin ça demande vraiment tout un roman pour justifier ces différents choix, pour le coup happy

Mais du coup en faisant drawText(verdana, ...) j'ai d'autres soucis de conception: en fait là actuellement une partie des membres de ma classe sont privés (ceux qui ne servent qu'à ce qui est implémentation: comme par exemple la position des caractères sur la texture en interne) donc je ne peux pas y accéder depuis une fonction ou méthode d'un objet externe sad
Est-ce que ça ne signifie pas que je devrais plutôt faire autrement?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

33

Tu peux utiliser friend non ?
Par exemple définir une classe InternalFont qui sera accessible partout à l'intérieur de ton programme, et implémenter ta classe Font comme un wrapper public de celle-ci, en laissant l'accès aux données internes à ta classe de dessin tongue
Tu pourrais aussi implémenter la méthode de dessin dans l'objet Font (mais tu devrais aussi avoir des membres private nécéssaire dans ta classe de dessin non ? confus) et l'apeller indirectement avec ton objet de dessin. (Je n'aime pas trop cette façon de faire, mais pourquoi pas ^^)
Et il y a certainement plein d'autres façons de faire mais bon wink
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

34

#define private public
#include "Font.h"
#undef private

gni
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

35

Et qu'est-ce qui te garantis que cette chose immonde fonctionne ? Y'a un truc dans la norme qui force les compilateur a respecter un ordre particulier pour les membres d'ne classe peu importe le statut privé ou public ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

36

Non, d'ailleurs il me semble que le compilateur n'est même pas obligé d'accepter #define private public.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

37

Euh on a parfaitement le droit de redéfinir des mots-clés a priori...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

38

39

Pollux (./37) :
Euh on a parfaitement le droit de redéfinir des mots-clés a priori...

Ca me rappelle une vieille discussion ça. Il me semblait que non en c++.
Faudrait retrouver le topic.

40

Remontage du topic ^^ On avait discuté plus haut de 2 solutions pour gérer le dessin d'une image dans un contexte graphique, à savoir:
Graphics g = new Graphics(...);
Image i = new Image(...);
g.drawImage(i);

Ou bien:
Graphics g = new Graphics(...);
Image i = new Image(...);
i.draw(g);

Cela pose toujours des problèmes puisque dans un cas dans l'autre, les objets doivent être intimement liés (l'image a besoin d'accéder au contexte graphique pour s'y dessiner, et le Graphics a besoin de propriétés spéciales qui doivent être cachées telles que le nom de texture pour dessiner l'image).

J'ai réfléchi à une autre solution, mais en java cette fois (qui est quand même bien plus pratique pour ça, notamment grâce aux packages):
package maLibrairieGraphique;

-- Image.java --
class Image {
    Graphics linkedGfx;
    Image(Graphics g, String filename) { linkedGfx = g; ... }
    public void draw() { linkedGfx.gl.glBegin(...); ... }
}

-- Graphics.java --
class Graphics {
    GLAutoDrawable gl;
    public Graphics(GLAutoDrawable gl) { this.gl = gl; }
    public void clearScreen() { gl.glClear(...); }
    public Image createImage(String filename) { return new Image(this, filename); }
}

Ainsi on peut faire ceci:
Graphics g = new Graphics(...);
Image i = g.createImage("test.png");
g.clearScreen();
i.draw();

L'histoire du linkedGfx dans image est pour simuler une classe interne (-> Graphics.Image). Cela aurait été plus intuitif à l'implémentation, puisqu'une image est forcément issue d'une instance de Graphics et y est toujours lié, mais Java ne permet visiblement pas d'avoir des classes internes dans des fichiers .java séparés.
Je trouve ça moyennement convaincant, mais c'est assez logique, car en OpenGL en particulier l'image est liée à un contexte graphique (qui peut représenter une carte vidéo, incluant sa VRAM; et c'est le cas du GLAutoDrawable: si je fais glGenTextures ça ne va générer des textures valables que pour ce contexte).

J'aurais aimé avoir des retours sur cette solution smile
Merci d'avance!
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

41

Euh, es-tu conscient que tu es dans le forum C/C++? grin

Et la solution à ton problème en C++, ça s'appelle friend.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

42

C'est une très mauvaise solution à son problème. Il est venu ici pour discuter d'une problématique de conception, et le mot-clé "friend" n'existe que pour palier des problèmes qui traduisent justement une mauvaise conception.

Pour revenir au post ./40 je trouve assez dommage de lier de façon aussi forte tes deux classes, mais pour pouvoir faire une suggestion utile il faudrait que je relise le topic et pas le temps pour le moment ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

43

Bah non, je ne suis pas d'accord, le mot-clé friend est indispensable si on veut faire de l'encapsulation stricte, et c'est l'équivalent des packages en Java.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

44

Hmm c'est pas faux, je n'avais pas fait gaffe à ce point, pas moyen de faire autrement en C++. Ceci dit je reste assez peu convaincu (a priori, il faudrait que je relise le problème en détail) par l'utilisation d'une classe interne ici, je trouve gênant d'être obligé de mettre en place une contrainte aussi forte.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

45

Bah le C++ est et restera une serie de patchs pour tenter de ressembler a de l'objet... (c'est d'ailleurs comme ça que le langage a commencé : un traducteur C++ -> C)

On finit toujours par devoir faire des "hacks" pas propre meme si le design est bon...

(en fait le gros problème du C++ est, et restera son coté hybride 100% compatible C tout en proposant une notion objet: on y retrouve deux effets de bords :
- On peut avoir tendance a ecrire du C++ comme on ferrais du C
- Tout n'est pas objets en C++ ce qui n'arrange pas forcement les choses, sans compter une syntaxe qui peut-être plutôt contraignante par moment (et ça ne veux pas dire que d'autres langages sont parfait hein, loin de la))

Si le langage était bien fait un hack a la ./34 ne devrais pas être possible car même si spectras (./39) pense que ce n'est pas possible dans le cas du C++, d'autres du même genre sont eux possible.

Forcer de rendre "friend" des classes a de gros effets de bords que les packages du Java n'ont pas que je sache. Mais dans le cas de Brunni, je pense que ça trahis une erreur de conception ^^)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

46

Heu justement je voulais parler de conception à proprement parler en fait, indépendamment du langage, mais quand même dans une optique de C++/Java et dérivés ^^
Sinon si quelqu'un veut développer en quoi c'est mauvais d'imposer une contrainte si forte (classe interne) je serais intéressé smile
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

47

C'est toujours intéressant de coder de façon générique pour pouvoir réutiliser au maximum ton code et éviter d'avoir à le dupliquer tôt ou tard (ou de te retrouver bloquer parcequ'une contrainte que tu auras adoptée va t'empêcher de faire un truc assez pratique par la suite). Je donne un exemple qui n'aura peut-être pas beaucoup de sens pour ton projet, mais imaginons que tu veuilles faire une bibliothèque de traitements d'images : ça pourrait être intéressant de l'autoriser à travailler sur ta classe Image, mais là tu risque de t'empêcher cette possibilité future puisqu'Image est définitivement liée à Graphics (qui n'a pas tellement de sens pour la lib de traitement d'image, en revanche).

Dans ton cas, je ne suis pas sûr d'avoir bien saisi le problème (pourtant j'ai relu le topic), tu parles de devoir faire accès à des champs privés mais tu ne donnes pas beaucoup de détails (ou alors j'ai mal lu) ; tu n'as pas moyen de t'en sortir en dotant ta classe Image des méthodes nécessaires pour que Graphics puisse la manipuler ? En théorie, si Graphics n'est pas capable d'afficher une Image, c'est probablement qu'il manque quelques méthodes fondamentales pour ta classe Image et donc qu'elle est incomplète (ou alors pas destinée à être autonome, mais pour ce genre d'objet ça me semblerait quand même plus naturel)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

48

Brunni (./46) :
Heu justement je voulais parler de conception à proprement parler en fait, indépendamment du langage, mais quand même dans une optique de C++/Java et dérivés ^^


Ce que tu n'as pas suivit en faisait en gros juste une surcouche a OpenGL wink
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

49

C'est vrai que j'ai jugé utile de préciser que c'était une surcouche à OpenGL pour montrer que j'allais passer par une API direct-mode procédurale wink (ça peut changer pas mal de choses niveau conception optimale)
Zephyr> Merci pour ton avis. C'est vrai qu'avec ça on limite un peu parce que l'image ne peut pas "sortir" de son contexte.
Sinon concernant les trucs qui manquent, j'avais pris comme exemple le texture ID: je n'ai pas envie d'exposer ça, seul le graphics doit le savoir.
Maintenant je verrai mal comment faire pour sortir l'image du contexte graphique à vrai dire, vu qu'un texture ID n'est valable que pour un contexte donné, il n'est pas possible de faire un Graphics.drawImage(Image) en fait. C'est un problème de conception de mon côté, ou simplement une limitation de l'API sous-jacente avec laquelle je dois faire?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

50

C'est vrai que cette contrainte d'OpenGL est assez chiante à gérer. Pour moi, c'est vraiment une caractéristique très "bas niveau" qu'il ne faut surtout pas essayer de prendre en compte dans la conception de ta bibliothèque (qui se veut plus générique). J'aurais plutôt vu un mécanisme en interne façon "assert" qui vérifie, au moment où on affiche une Image avec un Graphics, que l'opération est bien valide (= que l'image appartient bien au contexte dans lequel on essaie d'afficher).

Tu pourrais par exemple généraliser ça avec une méthode style Image::isCompatibleWith (const Graphics& g), qui dans un autre cas qu'OpenGL pourrait retourner toujours "true" mais dans ton cas va vérifier que l'Image est bien affichable sur ce contexte. C'est pas génial comme solution, mais ça me semble quand même plus propre que de répercuter la liaison forte texture<->contexte d'OpenGL sur ta conception.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

51

Je vois, par contre je continue d'avoir un lien avec Graphics, puisque soit le constructeur d'Image doit prendre un Graphics, soit la méthode createImage doit se trouver dans Graphics, donc dans tous les cas il y a un lien, non?
Je vois même pas de manière d'abstraire cette caractéristique bas niveau :/
(merci pour ton aide ^^)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

52

C'est parcequ'OpenGL ne te permet plus de savoir si une texture a été créée sur un contexte donné que tu dois conserver ce lien ? Il n'y a pas moyen à partir du contexte de récupérer les IDs des textures générées, par exemple ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

53

En fait je crois que j'ai compris le problème. C'est exactement le même qui se pose avec AWT par exemple? On ne peut pas s'amuser à instancier et utiliser ses composants comme ça sans qu'on ait bien une fenêtre qui tourne avec un contexte graphique et tout, alors que ça pourrait être très utile (charger des images grâce à elle par exemple).

Pour répondre à ta question on ne peut pas le savoir sad On pourrait très bien avoir un contexte qui a généré l'ID '1' pour une image du personnage principal et un autre qui a aussi généré l'ID '1' pour la première image qu'on lui a demandée, un objet par exemple, tu vois?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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

54

ok alors c'est mort, je ne vois pas trop de solution propre pour éviter le "Image::Image (Graphic& g)" ou "Image Graphic::createImage () const" :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

55

Tant pis... merci de ton aide smile et puis dans la mesure où AWT fait pareil, je me sens moins seul grin
Ca me tente de plus en plus de me lancer dans ça comme projet de semestre à l'école (enfin, si c'est possible). Il y a un sacré boulot de modélisation. J'ai fait un début de diagramme UML pour une API en retained mode, mais il se trouve qu'à l'implémentation c'est pas aussi beau que ça grin
[URL=http://img526.imageshack.us/my.php?image=defaultbn8.gif][IMG]http://img526.imageshack.us/img526/3315/defaultbn8.th.gif[/IMG][/URL]
Bref y'a de quoi réfléchir hehe
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

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