|
|
|
|
Le monde de la programmation orientée objetVoilà alors ici je vais vous expliquez plus en détail comment fonctionnent les classes, les méthodes appelées sur les objets ou les classes.
Sommaire du chapitre :
![]() Qu'est-ce donc la POO ?DéfinitionLa POO (programmation orientée objet) est une manière simplifiée pour encoder un programme, la POO recherche donc la simplicité de conception et non la performance. Les langages orientés objets sont donc plus simple à comprendre pour l'homme mais plus long lors de la compilation et comme java interprète du code à l'exécution pour le rendre compréhensible par votre plateforme, il est plus lent à l'exécution, pour cela que la plupart des jeux sont codé en c++. Le java ne vise pas la performance à la base, mais la simplicité de conception, malgré cela, avec les librairies Java tel que JOGL, JMonkeyEngine, Ogre4j, etc... ce langage peut égaler le c/c++ au niveau des performances, de plus, les jvm deviennent de plus en plus performantes..., avec des mécanisme permettant d'accélérer ce temps d'interprétation du code, du coup le temps d'exécution peut être plus long au premier lancement du jeux mais plus court part la suite. De plus avec la performance des processeurs actuels, la différence ne se voit presque plus. Hiérarchie aux niveau des langagesIl était une fois... Le langage machine :Seul langage assimilable par votre machine. C'est une suite de 0 et de 1 : complexe à comprendre et à déchiffrer pour l'homme. Le langage assembleur :Celui-ci était utilisé pour rendre le langage machine plus simple à comprendre pour nous, car votre ordinateur n'est capable de comprendre qu'un seul langage appelé le langage binaire, qui est une suite de zéros et de un... L'assembleur fait correspondre un symbole à une instruction binaire, ce qui permettait de rendre le code plus lisible, seulement, le langage variait selon le processeur. (intel, amd, etc...) Ce langage n'est presque plus utilisé sauf pour faire fonctionner les processeurs correctement, le programme qui traduit les instructions en assembleur en langage binaire est appelé un assembleur, ce programme est différent suivant la marque du processeur. Il faut cependant savoir que la carte graphique possède aussi un processeur, ce processeur est appelé le GPU, tandis que celui de la carte mère est appelé le CPU, l'utilité du GPU est de pouvoir faire des calculs pour améliorer la qualité d'affiche sans pour autant charger le CPU et faire ainsi ramer votre PC. A cause de certaines anciennes cartes graphique ou certaines machines équipée de chipset intel pour l'affichage par exemple qui ne gère pas les langages de haut niveau pour améliorer le rendu, certains moteurs de jeux doivent utilisé un langage GPU de bas niveau, donc, de l'assembleur, ce langage varie selon le moteur utilisé, il en existe deux (direct3D et opengl) contrairement au CPU ou là ça varie selon la marque du processeur. Heureusement il existe des logiciels qui permettent de traduire des langages GPU de haut niveau en un langage assembleur supporté par ces deux moteurs! (Ce logiciel s'appelle C.G., je tenterai de vous le présenter plus loin..., pour résoudre tout ces problèmes d'incompatibilité.) Les langages évoluésEnsuite après l'assembleur, nous avons les langages de 3ème génération, dit langages évolués. Eux ils ont l'avantage de fonctionner avec n'importe quel type de processeur. C'est votre compilateur qui se chargera de traduire ce langage en assembleur, puis en langage binaire selon la marque de votre processeur. Et votre code source, est traduit en langage de bas niveau, grâce à un compilateur. Il y a notamment les langages procéduraux connus comme le C, le Pascal, le Visual Basic et plein d'autres. Ceux-ci ont la particularité de décomposer les programmes en fonctions. Le procédural s'intéresse donc surtout aux grandes fonctionnalités que va devoir gérer votre programme. Et enfin il y a les langages de POO, eux, ils ne s'intéressent pas uniquement aux grandes fonctionnalités du programme, mais aussi aux différents acteurs de ce programme. (Java, Python, c++, c#, etc...) Tout ces acteurs sont considéré comme des objets, et chacun possède ses propres caractéristiques et ses propres fonctionnalités. On fait donc deux découpes dans le code, d'abord on découpe le programme en fonction des grands acteurs de celui-ci et ensuite on découpe le programme en fonction des grandes fonctionnalités que doivent accomplir ces acteurs. Exemple pour bien comprendre On doit créer un mmorpg avec des personnages et chaque personnage appartient à une classe bien particulière. (guerrier, magicien, marchand, voleur, ninja, taekwan, fusilleur, chasseur à l'arc, etc...) Bah on va donc commencer en POO à s'intéresser à coder la classe Personnage qui contiendra des fonctions (méthodes) et caractéristiques (variables) qui seront communes à tout ces personnages. Ensuite on va s'intéresser aux classes qui auront des fonctions plus spécifique chacune. Le magicien par exemple pourra lancer des sors avec un bâton. Le guerrier aura une épée et une cheval par exemple. Le ninja pourra utiliser des shuriken et des kunaï pour se battre. Le taekwon attaquera avec ses pieds. Le marchand lui sont but sera de vendre un max d'objets, il faudra donc qu'il puisse vendre, etc ... On fait donc 2 découpes : Quels sont les objets de notre programme et que peuvent ils faire ? Il y a aussi là une hiérarchie d'objets plus généraux (un personnage) vers des objets plus spécifiques (des magiciens), cela s'appelle l'héritage, je vous en parlerai plus loin dans la POO. Conséquences de la POO: Dépendance fonctionnelle : chaque objets devront être modifié avec les méthodes de la classe à laquelle il appartient. Indépendance de développement : Chaque classe agit indépendamment d'une autre. Un petit mot sur les autres langages.Le mySQL : c'est un langage de 4ème génération, là, la différence est que on ne doit plus écrire tout le corps des méthodes, et se préoccuper de l'algorithme, ce langage en effet, comprends une séries d'instructions, telles que des instructions pour faire des recherches dans un tableau de données, trier, faire la moyenne, etc... Et lorsque vous écrirez vos instructions, celles ci vont être interprétées, et le langage mySQL utilisera donc les bonnes méthodes, et algorithmes en fonction de ce que vous lui avez demander, et va vous renvoyer les résultats. Là donc, on a plus de fonctions, ni d'objets, le langage les fabriques lui même, à partir de ce qu'on lui demande. Et pour ce qui est du Prolog (devenu erlang qui est son évolution.), ce langage est utilisé pour produire de nouvelles procédures, à partir d'autres procédures existantes, c'est un langage de 5ème génération. Mais on n'utilisera pas deux ces langages, je ne détaillerai donc pas plus, on verra le MySQL qui sera utilisé lorsqu'on verra les bases de données mais il existe des cours comme celui sur le site du zéro qui explique bien comment fonctionne le langage MySQL. Voila vous connaissez l'histoire des langages de programmation maintenant. Les notions de baseJe vais peut-être me redire mais mieux vaut que je le fasse, surtout sur ces notions fondamentales à absolument maîtriser, si vous ne les maîtrisez pas, pas la peine de commencer à créer des jeux avec le langage Java, vous ne comprendrai rien! Un objet c'est quoi ? Bah en fait il n'est pas vraiment possible de définir précisément ce qu'est un objet, ça peut être n'importe quoi, se sera à vous de voir en fonction du jeux que vous voudrez créer, quels seront les objets de votre jeux. Ces objets seront donc différents pour chaque jeux. Les deux parties d'un objetUn objet aura toujours deux parties : [souligne]une partie statique : [/souligne] Ce sont les variables propres à chaque objets. (Ses caractéristiques) Exemple : sa taille de type entier. Et une partie dynamique : Ce sont les méthodes qui permettent de modifier la valeur des variables pour un objet. Ceci définit le comportement de l'objet. Toutes les variables et méthodes propre à un type d'objet devront se retrouver dans sa classe!!! Une classe d'objets c'est quoi ? C'est tout simplement un genre de moule qui permet de créer des objets de même type, une classe est une sorte d'usine si vous voulez. (Vous avez une usine qui crée des objet vitre, une autre qui crée des objets voitures, etc...bah les classes c'est pareil!) Pour chaque objets que vous devrez créer, il faudra donc lui définir une classe avec ses caractéristiques et ses méthodes. Exemple, on veut créer des objets de type Voiture. On souhaite lui définir une couleur (un entier) et une marque. (un String) Ensuite on souhaite pouvoir la faire avancer. Bah voici ce que ça va donner en java : Code de la classe voiture :
Il y aura donc 2 choses que vous serez amener à faire : utiliser des méthodes de classes d'objets déjà définies et créer vous même vos propres classes. Pour bien comprendre je vous invite maintenant à ouvrir blue-J. ManipulationsMaintenant je vais vous faire effectuer quelques manipulations pour vous bien comprendre le rôle des classes et des méthodes sur les objets.^^ Plus tard, nous apprendront à sortir de blue-J et à effectuer toutes les manipulations nécessaire dans un main, mais pour pas tout mélanger, nous allons (contrairement aux exercices précédents ou je vous ai fait tout écrire dans une seule classe, celle du main) ne plus utiliser cette classe avec le main pour l'instant. Nous nous intéresserons uniquement aux classes, méthodes et objets.^^ En effet, jusqu'ici donc je vous ai fait utiliser que une seule classe dans les exercices, la classe du main, on a donc fait pratiquement que du procédural jusqu'à maintenant. Bon maintenant je vous invite à cliquer sur project, open project, shapes. Il est normalement dans le répertoire C:\blueJ\examples La vous devriez voir apparaitre une séries de rectangles qui sont en faîtes, des classes. Faîtes clique droit puis compiler pour les compiler. On ne va s'intéresser que aux classes Triangle, Circle et Square pour le moment, la classe Canvas est trop complexe. Faîtes un coup un clic droit sur la classe Triangle et après sélectionner new Triangle (). Laissez triangle1 dans le champ Name Of Instance qui est le nom référençant votre objet. Puis vous voyez en dessous normalement apparaître un objet triangle1 de type Triangle!! Comme sur l'image ci dessous : ![]() Cliquer dessus (clic droit) et vous voyez toute une série de méthodes! Un genre à l'image ci dessous : (Ne vous étonnez pas si vous n'avez pas les même méthodes, j'ai prit les images sur des classes que j'ai faîtes) ![]() Avec certaines, des arguments entre les (). Pour voir votre triangle, faîtes makeVisible () La on voit un triangle qui s'affiche. Maintenant vous pouvez modifier sa taille par exemple. Cliquer sur changeSize et entrer la largeur et la hauteur que vous voulez donnez à votre triangle. On peut aussi le faire décaler à droite et à gauche, avec les méthode moveRight et moveLeft, etc ... Si vous voulez consulter la valeur des variables de votre objet, cliquer tout en bas sur inspect et vous avez normalement une fenêtre de ce genre ci : ![]() Vous aller maintenant analyser le code de la classe Triangle, pour cela, clic droit sur la classe Triangle puis vous faîtes "open editor". Cette classe que contient - elle ? Ouvrez donc l'éditeur de la classe Triangle maintenant. Vous voyez que on a d'abord importer un répertoire de java qui est awt, je vous expliquerai plus loin ce qu'il contient. On voit que pour donner un nom à la classe il est écrit : public class Triangle { Et en dessous ?^ En dessous on a les attributs ou variables du triangle : sa hauteur (un entier), etc ... Après la déclaration des variables, on a ce que l'on appelle un constructeur. C'est quoi ça un constructeur ??? Ce sera l'objet du tutoriel suivant.^^ Et les méthodes En dessous, enfin on a les méthodes avec leurs corps. Voila donc le code de base d'une classe en Java qui crée des objets.^^ Maintenant vous pouvez aussi analyser celui de la classe Square et celui de la classe Circle. Je vous invite à dessiner une maison avec blue-j^^. Sympa non ? Remarque : vous remarquerai sans doute (ceux qui font du c++), qu'il n'y à pas d'instruction "delete" dans le code ni de destructeurs, c'est normal car les objets en Java sont virés automatiquement de la mémoire dès qu'ils ne sont plus utilisé dans le programme, il y a en Java ce que l'on appelle le "garbage collector" (collecteur de crasses), qui supprime de la mémoire les objets (qui ne sont plus utilisés dans le programme) automatiquement pour vous. Le cycle de vie d'un objet est donc : 1) Sa création. (avec le mot clef new = l'instanciation) 2) Une série de modifications. (avec l'appel des méthodes sur lui même) 3) Sa mort (le "garbage collector" s'en charge pour nous) Vous pouvez créer dans chacune de vos classe une méthode main pour la tester! A l'exécution, une seule méthode main sera exécutée, même si vous en avez plusieurs dans vos différentes classes. On verra cela lorsque l'on fera des jar files ou on devra préciser la classe contenant la méthode main qui démarrera notre programme lorsqu'on le lancera. Code de classes pour ceux qui ont un autre IDE.Circle :
Square :
Et enfin la classe Canvas pour dessiner le tout : [code=java] import javax.swing.*; import java.awt.*; import java.util.List; import java.util.*; /** * Canvas is a class to allow for simple graphical drawing on a canvas. * This is a modification of the general purpose Canvas, specially made for * the BlueJ "shapes" example. * * @author: Bruce Quig * @author: Michael Kolling (mik) * * @version: 1.6 (shapes) */ public class Canvas { // Note: The implementation of this class (specifically the handling of // shape identity and colors) is slightly more complex than necessary. This // is done on purpose to keep the interface and instance fields of the // shape objects in this project clean and simple for educational purposes. private static Canvas canvasSingleton; /** * Factory method to get the canvas singleton object. */ public static Canvas getCanvas() { if(canvasSingleton == null) { canvasSingleton = new Canvas("BlueJ Shapes Demo", 300, 300, Color.white); } canvasSingleton.setVisible(true); return canvasSingleton; } // ----- instance part ----- private JFrame frame; private CanvasPane canvas; private Graphics2D graphic; private Color backgroundColour; private Image canvasImage; private List objects; private HashMap shapes; /** * Create a Canvas. * @param title title to appear in Canvas Frame * @param width the desired width for the canvas * @param height the desired height for the canvas * @param bgClour the desired background colour of the canvas */ private Canvas(String title, int width, int height, Color bgColour) { frame = new JFrame(); canvas = new CanvasPane(); frame.setContentPane(canvas); frame.setTitle(title); canvas.setPreferredSize(new Dimension(width, height)); backgroundColour = bgColour; frame.pack(); objects = new ArrayList(); shapes = new HashMap(); } /** * Set the canvas visibility and brings canvas to the front of screen * when made visible. This method can also be used to bring an already * visible canvas to the front of other windows. * @param visible boolean value representing the desired visibility of * the canvas (true or false) */ public void setVisible(boolean visible) { if(graphic == null) { // first time: instantiate the offscreen image and fill it with // the background colour Dimension size = canvas.getSize(); canvasImage = canvas.createImage(size.width, size.height); graphic = (Graphics2D)canvasImage.getGraphics(); graphic.setColor(backgroundColour); graphic.fillRect(0, 0, size.width, size.height); graphic.setColor(Color.black); } frame.setVisible(visible); } /** * Draw a given shape onto the canvas. * @param referenceObject an object to define identity for this shape * @param color the color of the shape * @param shape the shape object to be drawn on the canvas */ // Note: this is a slightly backwards way of maintaining the shape // objects. It is carefully designed to keep the visible shape interfaces // in this project clean and simple for educational purposes. public void draw(Object referenceObject, String color, Shape shape) { objects.remove(referenceObject); // just in case it was already there objects.add(referenceObject); // add at the end shapes.put(referenceObject, new ShapeDescription(shape, color)); redraw(); } /** * Erase a given shape's from the screen. * @param referenceObject the shape object to be erased */ public void erase(Object referenceObject) { objects.remove(referenceObject); // just in case it was already there shapes.remove(referenceObject); redraw(); } /** * Set the foreground colour of the Canvas. * @param newColour the new colour for the foreground of the Canvas */ public void setForegroundColor(String colorString) { if(colorString.equals("red")) graphic.setColor(Color.red); else if(colorString.equals("black")) graphic.setColor(Color.black); else if(colorString.equals("blue")) graphic.setColor(Color.blue); else if(colorString.equals("yellow")) graphic.setColor(Color.yellow); else if(colorString.equals("green")) graphic.setColor(Color.green); else if(colorString.equals("magenta")) graphic.setColor(Color.magenta); else if(colorString.equals("white")) graphic.setColor(Color.white); else if (colorString.equals("gray")) graphic.setColor (Color.gray); else graphic.setColor(Color.black); } /** * Wait for a specified number of milliseconds before finishing. * This provides an easy way to specify a small delay which can be * used when producing animations. * @param milliseconds the number */ public void wait(int milliseconds) { try { Thread.sleep(milliseconds); } catch (Exception e) { // ignoring exception at the moment } } /** * Redraw ell shapes currently on the Canvas. */ private void redraw() { erase(); for(Iterator i=objects.iterator(); i.hasNext(); ) { ((ShapeDescription)shapes.get(i.next())).draw(graphic); } canvas.repaint(); } /** * Erase the whole canvas. (Does not repaint.) */ private void erase() { Color original = graphic.getColor(); graphic.setColor(backgroundColour); Dimension size = canvas.getSize(); graphic.fill(new Rectangle(0, 0, size.width, size.height)); graphic.setColor(original); } /************************************************************************ * Inner class CanvasPane - the actual canvas component contained in the * Canvas frame. This is essentially a JPanel with added capability to * refresh the image drawn on it. */ private class CanvasPane extends JPanel { public void paint(Graphics g) { g.drawImage(canvasImage, 0, 0, null); } } /************************************************************************ * Inner class CanvasPane - the actual canvas component contained in the * Canvas frame. This is essentially a JPanel with added capability to * refresh the image drawn on it. */ private class ShapeDescription { private Shape shape; private String colorString; public ShapeDescription(Shape shape, String color) { this.shape = shape; colorString = color; } public void draw(Graphics2D graphic) { setForegroundColor(colorString); graphic.fill(shape); } } } [/code] Le constructeurC'est quoi un constructeur ?C'est une méthode particulière qui sert à donner une valeur par défaut aux variables présentes dans votre classe. Donc, on peut, lorsque vous créer un objet avec l'opérateur new, donner une valeur par défaut aux variables de cet objet. Le constructeur porte le même nom que la classe et n'admet aucun type de retour, même pas void!! Si vous ne définissez pas de constructeur dans votre classe, un constructeur est automatiquement appelé par défaut et donne une valeur par défaut à toutes les variables de votre classe. Les valeurs par défault des variables La valeur par défaut pour les nombres, c'est zéro, et pour les autres variables (variables d'instance), c'est la valeur particulière null. (qui veut dire rien) Pour les variables de type char c'est le caractère null le '\0'. Pour les variables de type boolean c'est la valeur false. Lorsque vous déclarer un objet au début d'une classe, sa valeur vaut null. Donc si vous ne créer pas de constructeur, et si vous voulez utiliser une méthode qui modifie les valeurs de votre objet qui vaut null, ça ne marchera pas!! Erreur fréquente en Java. Créer une classe maison, effacer tout le blalabla qui a entre les crochets qui délimitent la classe, et écriver ceci :
Là vous avez une belle erreur en exécution car en faîtes, votre objet toit vaut null, en effet, on l'a juste déclaré mais pas créé! Vous aurez une erreur de type NullPointerException. Alors il vous faut rajouter un constructeur dans votre classe maison qui s'en chargera. code Java :
Voilà donc l'utilité des constructeurs, il est conseiller de toujours en avoir au moins un. Dans chaque classe que vous créerez à partir de maintenant, vous devrez donc définir au moins un constructeur. Le nombre d'arguments dans votre constructeur doit correspondre avec le nombre d'arguments dans votre new lorsque vous créez un objet. La surcharges des méthodes et des constructeursLa signature des méthodes :C'est ce qui permet au compilateur Java, lorsque vous invoquer une méthode, de reconnaitre la méthode qu'il doit rechercher en mémoire pour pouvoir ensuite l'exécuter. Mais sur base de quels critères recherche t - il une méthode ? Sur base de son nom tout d'abord; mais aussi sur base de la liste des types de ses arguments. (le nom des arguments il s'en moque tout comme le type de retour de la méthode) Le critère sur lequel se base le compilateur lors des appels de méthodes s'appelle la signature d'une méthode. Celle-ci caractérise donc une méthode (servent d'identifiant pour une méthode si vous voulez) La signature d'une méthode c'est quoi donc ? Le nom de la méthode suivit de la liste des types de ses arguments entre les (). S'il n'y a pas d'arguments dans la méthode, la signature c'est juste le nom de la méthode alors. Exemple La signature de la méthode changeSize de la classe Triangle est donc : changeSize (int, int) La surcharge des méthodes :Ce sont des méthodes dans une même classe, qui portent le même nom, mais dont la liste des types de leurs arguments n'est pas la même. Donc si je veux surcharger la méthode changeSize, il suffit que j'écrive : public void changeSize (double weigth, double heigth) signature : changeSize (double, double) Vous voyez que j'ai plus mit des int mais des double. Attention, jamais deux fois la même signature dans une même classe!!! On peut aussi surcharger les constructeurs? Bah oui bien sûr, pourquoi on ne pourrait pas. Cela sert lorsque l'on doit donner des valeurs par défaut différemment aux variables. En gros lorsque l'on veut pouvoir créer des objets différemment. Par exemple, il serait mieux dans la classe Triangle, de pouvoir, lors de la création d'un triangle, lui donner soi-même une position initiale. Je veux dans ma classe maison, positionner le toit dans le coin supérieur gauche de l'écran (coordonnées : (0, 0)) D'où l'utilité de créer une surcharge du constructeur de la classe triangle. Rajouter en dessous du constructeur de la classe triangle ceci.
Ensuite dans la classe Maison ajouter (0, 0) après le new Triangle comme ceci :
Voilà, il n'est plus à la même place, vous pouvez faire la même chose avec la variable color, etc... Mais n'oublier pas d'initialiser toutes les variables de votre classe dans le constructeur sinon ça fait un joli bug. L'encapsulationC'est quoi encore de ce truc vous allez me dire. Bah en fait c'est simple à comprendre. Encapsulation : Chaque variable d'instance ou objet, appartient à sa classe et doit se conformer aux méthodes de cette classe, seul les méthodes de cette classe peuvent modifier la valeur des variables membre de ses objets. Donc les variables sont, comme vous le constater dans la classe Triangle, déclarées private ça veut dire qu'on ne peut pas y accéder directement. (à partir une autre classe) On ne peut pas écrire dans une autre classe par exemple triangle.x = 5; x est privé et n'est pas accessible en dehors de la classe Triangle. Il faudra utilisé obligatoirement une méthode de la classe Triangle qui va modifier la valeur de x. Il faudra aussi en créer une pour récupérer la valeur de x. Ce sont ce qu'on appelle des getters et des setters. (aussi connus sous le nom d'accesseurs et mutateurs) Les setters :
Ainsi pour récupérer le contenu de x dans une autre classe, on écrira : valeur = triangle.getX (); (getX est déclaré public donc pas de problème) Si vous écrivez "valeur = triangle.x" ça ne marchera pas car x est déclaré private dans la classe Triangle et n'est donc pas accessible en dehors de celle-ci. Bien sur il y a parfois des exceptions, comme par exemple quand on écrit tableau.length Mais c'est pas conseillé car ça ne respecte pas le principe d'encapsulation. Il se peut aussi que des classes ou méthodes soient private, je verrai cela avec vous plus loin mais c'est assez rare. En général ce sont des méthodes qui sont appelée dans des méthodes publiques pour simplifier le code d'une méthode publique. Il dernière choses, une méthode récursive est une méthode qui est appelée dans celle-ci. Exemple :
A partir de maintenant je vous oblige à déclarer toutes vos variables private et vos méthodes public, et je le ferai aussi. Si vous ne mettez rien (pas de public, ni de private, ...) alors ce qui suit sera par défaut visible uniquement dans le package ou votre classe se trouve. Le mot clef thisC'est quoi encore ce mot vous allez me dire ?Il pointe vers l'objet qui est entrain d'être créé ou modifié lors de l'appel d'un constructeur ou d'une méthode sur lui même. Le mot clé this pointe donc vers l'objet lui même. Utilité de thisDans la classe Triangle par exemple, vous avez du donner un nom différent dans les arguments de votre constructeur :
Bah grâce au mot clef this, on peut écrire ceci :
this pointe vers l'objet lui même. (Celui que l'on en entrain de créer) Ainsi le compilateur sais faire la distinction entre vos variables d'instances de l'objet lui même et les arguments de votre constructeur. Sinon il peut aussi être utilisé lors de la surcharge des constructeurs. Exemple :
Donc grâce à this, on peut faire appel au premier constructeur dans le second pour éviter de devoir retaper du code. le "this (0, 0)" doit être la première ligne de votre constructeur! Sérieusement, moi je trouves ce mot clef vraiment très pratique! Exercices (Méthodes, classes, objets et constructeurs)1) Rajouté une méthode dans les classes Triangles, square et Circle, une méthode moveTo qui permettra de faire bouger une forme à un endroit précis sur l'écran. 2) Compléter la classe maison afin de créer une maison. Vous devez mettre dans votre constructeur, un toit, une façade, deux fenêtre et une porte. Créé une méthode pour déplacer la maison. Solution des exercices. (classes, objets, méthodes et ....)1) Il suffit tout simplement de rajouter une méthode moveTo dans chacune de ces 3 classes qui modifie les coordonnées de l'objet créé. Elle doit recevoir en argument la nouvelle position en x et en y de l'objet. Ensuite reste plus qu'à remplacer les positions dans le corps de la méthode ce qui donne :
2) Alors là je vous ai demandé de compléter notre classe maison, il faut d'abord modifier le constructeur. Bon je vais centrer le toit, je vais donc voir dans la classe Canvas quel est la largeur de la fenêtre. Là, il l'a écrit lors de la création de son Canvas, elle vaut 300, et la hauteur aussi. Je placerai moi donc le toit au départ aux coordonnées 150, 10. Je vais lui mettre comme taille, 50 de hauteur et 200 de largeur. N'oublier pas de le rendre visible! Ensuite il faut créer un rectangle et le placer juste en dessous du toit. Bon histoire de pas m'ennuyer de trop, je vais surcharger les constructeurs de la classe Triangle et de la classe Square pour leur donner directement leur positon, taille et couleur quand je les créées dans le constructeur de ma classe Maison. Ce qui me donne en définitif pour la classe Triangle le constructeur suivant :
Je vais donc vous mettre le constructeur de ma classe maison maintenant :
Allons y. =) Voici donc ma méthode^^
Nous voyons donc ici que la POO peux s'avérer très pratique. Elle permet de géré la composition des objets grâce aux classes, qui définit les variables et méthodes pour chaque type d'objets, donc pas besoin de redéclarer à chaque fois les variables et méthodes lors de la créations de plusieurs objets de même type grâce aux classes. Les constructeurs permettent une initialisation par défaut des attributs/variables des objets lors de leurs création. Pas besoin de delete ni de destructeur, les objets sont automatiquement supprimés lors de leur inutilité grâce au garbage collector!! Perso je trouves le Java que c'est quand même bien pratique, c++ j'ai du mal à comprendre avec les delete et les pointeurs sur les objets pouwaaa. ![]() Rédigé par Lo
Consulté 482 fois |
||||||||||||||||||||||||||||||||||||||||||||
|
Hébergeur du site : 1and1.fr Site de création de Jeux Vidéo Apprenez à créer vos propres Jeux Video |
1198752 pages ont été consultées sur le site ! Dont 2273 pages pendant les 24 dernières heures. Page générée en 0.882 secondes Nos partenaires - Otium Production : Aide aux débutants à créer leurs jeux - Les bibliothèques de développement de jeux vidéo |