Programmation objet pour jeu 2D

Comment concevoir les classes et les méthodes dans un jeu 2D en javascript ?

Le problème exposé dans ce sujet a été résolu.

Bonjour

J'ai créé un jeu 2D de type RPG en javascript avec la balise canvas, Guyana Dream, pour illustrer un tuto. Bien que les persos aient été créés dans Blender (pour le fun !), ils sont utilisés sous forme de spritesheet en 2D. Le jeu est très très simple car je ne progresse pas vite, mais j'aimerais l'améliorer. Je documente tout ce que je fais sur le site du jeu, en espérant que ça puisse servir à quelqu'un un jour.

Je pensais pouvoir compléter le tuto, que son créateur n'a plus le temps d'écrire, mais je n'ai pas le niveau en programmation, et il ne l'avait pas mis pas sous licence libre. J'ai quand même réussi à aller plus loin que le début de tuto qu'il m'avait fourni et j'en suis déjà fière. Cela m'a bien fait progresser en javascript.

J'aimerais étudier la programmation objet, que je maîtrise mal, et pour ça, j'ai réfléchi aux classes et méthodes dont j'aurais besoin dans un .doc mais je ne suis pas très sûre de moi.

Quelqu'un connaît-il un tuto suffisamment simple (mais pas trop non plus) ou pourriez-vous me donner vos conseils pour améliorer tout ça, SVP ? Les tutos que j'ai trouvés jusqu'ici ne m'ont pas permis de bien comprendre comment faire.

Tu as essayé celui qui est dispo sur le site ? ( Apprenez à programmer en java ! ) C'est ce cours là que j'ai suivi pour apprendre à programmer en java, et je trouve qu'il est pas mal, |quoique peut être un peu moins clair que certains sur la partie explication de ce que sont les objets.

Sinon, si tu veux juste appréhender la "philosophie" de l'orienté objet, rien ne t'empêche je pense, |d'aller fouiner un peu dans d'autres cours (que l'on me corrige si c'est une mauvaise idée). Je pense par |exemple à un cours sur la programmation en C++ (Hélas sur notre feu SdZ…) que je suivait avant que |j'arrête, et me mette au java. Il a l'avantage de très bien décrire ce que sont les objets, et surtout |pourquoi on en utilise.

Par contre, je n'arrive à lire ton .doc ni avec LibreOffice, ni avec notepad++… Désolé. :(

EDIT : Mea culpa, j'ai mal lu, et cru qu'elle faisait du java, au lieu du javascript…

+0 -0

@Popiette : Je crois que tu confonds Java et JavaScript.

@doudoulolita : Je n'arrive pas non plus à lire ton .doc (LibreOffice moi aussi). Tu pourrais nous faire un petit PDF, ou un copier-coller s'il te plaît ? Sinon ça va être dur de t'aider. :p

J'ai pas tout lu en détail (j'avoue, j'ai la flemme :p de me faire les 8 pages). Mais ce que j'ai pût lire, ça à l'air d'être une bonne façon d'organiser ton jeu.

En JS, si tu veut faire de la POO, tu a plusieurs façons de procéder.

N°1 : JavaScript Object Notation

C'est pas vraiment un bon moyen de faire de la POO (du moins dans ton cas), ce n'est même pas vraiment de la POO. C'est plutôt une façon de bien ranger ses variables. Exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Création

var monObjet = {
    maPropriete: 'Je suis un propriété !',
    maFonction: function () {
        console.log ('Je suis une fonction !');
    },
    objetDansObjet: {
        propiete: 'foo bar !'
    }
};

// Utilisation

var x = monObjet.maPropiete;
// x = 'Je suis une propiété'

monObjet.maFonction ();
// Affiche "Je suis une fonction !" dans la console.

console.log(monObjet.objetDansObjet.propriete);
// Affichera "foo bar !" dans la console

Mais le problème, c'est que tu ne peux pas instancier des objets suivant une certaine structures autant de fois que tu veux. Tu n'as pas non plus ce qu'on appelle l'héritage. Par contre, ça peut être très utile, par exemple si tu as des fichiers JSON. Tu les récupère via AJAX, tu les transforme en objet comme ceux qu'on vient de voir avec la fonction JSON.parse et puis tu les lis ou les modifies … bref tu les utilises.

Tu peux par exemple faire ça pour gérer tes différents niveaux, avec des fichiers décrivant tes maps.

N°2 : Prototype

Cette méthode te permettra de créer autant d'objet de ce type que tu veux, d'utiliser l'héritage, mais je la trouve (ce n'est que mon avis) un peu sale.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// Cette fonction est le constructeur, qui initialise chaque nouvelle entité
var Entité = function (nom) {
    this.nom = nom; // On initialise une propriété utilisable partout dans l'objet
    console.log ('Nouvelle entité crée !');
}

// On ajoute une fonction utilisable sur chacune de nos entités
Entité.prototype.saluer = function () {
    console.log('Bonjour, je m'appelle ' + 'this.nom + ' !';
}

var monEntité = new Entité ('Joe'); // on crée une nouvelle entité : on appelle le constructeur
console.log(monEntité.nom); // Affiche 'Joe' dans la console
monEntité.saluer (); // Affiche 'Bonjour je m'appele Joe' dans la console.

Tu as aussi le Mozilla Developer Network qui explique ça surement mieux que moi. Et puis il montrent des trucs rigolo, comme l'héritage. C'est drôle l'héritage.

N°3 : Les classe ES6 (<3)

Ça c'est ma solution préférée, mais elle est un peu nouvelle, donc elle n'est pas supportée dans les navigateurs (surtout les vieux).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Dragon {
    constructor (nom) {
        this.nom = nom + ' le dragon';
        console.log('Un dragon nommé ${this.nom} est né !');
    }

    voler () {
        // TODO : Faire des animations sympa, où le dragon vole et tout.
    }

    cramerVillageois (nomVillageois) {
        console.log (`Bonjour je suis ${this.nom}. Maintenant fait tes prières ${nowVillageois} !`);
    }
}

var dragonBleu = new Dragon ('Siméon');
dragonBleu.cramerVillageois ('Jean-Louis-Bernard');
// Affichera : Bonjour je suis Siméon le dragon. Maintenant fait tes prières Jean-Louis-Bernard !

Voilà, donc ce que je te conseille de faire c'est d'utiliser la notation JSON pour tes maps, voir tes différents personnages. Ensuite si tu t'en fiche de la compatibilité avec les vieux naviagteurs, prends la solution ES6 (n°3) pour tes classes du style Tuile. Sinon opte pour les prototypes.

En espérant t'avoir aidé. :)

+1 -0

Merci beaucoup ! Le tuto que j'avais commencé à faire utilisait un système de constructeur que je ne reconnais pas dans ce que tu me donnes comme exemples. Voila l'exercice final. il charge le fichier js dans un script de ce type, situé dans le fichier html (il y a aussi un fichier php):

1
2
3
4
5
        var sprite = new Image();
        sprite.onload = function() {
            chargerMap("room.js");
        }
        sprite.src = "sprite.png" ;

Dans room.js, il y a des choses de ce type:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Map() {
    this.map0 = [
        // tableau lignes map
    ],

    this.tileset = "tileset.png",

    this.evenements = function() {
        // instructions
    }   
}

var map = new Map();

function chargerMap(carte) {
    // intructions
}

function drawMap0() {
    for (var j=0; j<map.map0.length; j++) {//map.map0 représente toutes les lignes de la carte
        for (var i=0; i<map.map0[j].length; i++) {//map.map0[j] représente maintenant une ligne de la carte
            drawTile(map.map0[j][i], i*16, j*16, context[0]); // cette fonction est précisée ailleurs, je t'en fais grâce !
        }
    }
}

Dans mon jeu perso, plutôt que php, j'avais choisi d'utiliser json, et je trouvais ça pratique, effectivement.

Par ailleurs, j'ai enfin réussi à faire le tuto de SebCap26 qui travaille le début d'un RPG avec les prototypes, ce que je trouvais un peu compliqué jusque là, mais je dois avoir pas mal progressé en javascript car je n'ai pas trop eu de problèmes à le comprendre.

Je partirais bien sur ce système car je commence à saisir comment il fonctionne. Il n'a pas prévu des tonnes de classe mais comme son tuto s'arrête lui aussi assez vite, peut-être comptait-il en rajouter.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte