JeuWeb - Crée ton jeu par navigateur
images sur canvas qui ne se génèrent pas - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : images sur canvas qui ne se génèrent pas (/showthread.php?tid=7724)

Pages : 1 2


images sur canvas qui ne se génèrent pas - fortz - 20-11-2016

Bonjour, je suis actuellement en train de créer une map en utilisant les canvas. Je me trouve confronter à un problème lorsque je veux dessiner chacune de mes tiles dans ce canvas. Mon algo est assez simple : je crée une balise canvas, je récupère le context et ensuite je fais appel à 3 fonctions : une qui fait génère les tiles en background, la deuxième qui génère les tiles au-dessus des tiles de background et la dernière qui créer une grille. Le problème est que seules les tiles de background sont générées et tout le reste n'apparaît pas sur la map. Voici mon code :

Code :
drawMapContent: function() {
this.ctx = document.getElementById(this.id).getContext("2d");
camera.constructCamera(map, this.width, this.height);

this.drawTilesMap(0, this.ctx); // je génère les tiles en background layer de la map
this.drawTilesMap(1, this.ctx); // je génère les tiles en top layer de la map

this.drawGridMap(this.ctx); // je génère la grille de la map
},

drawTilesMap: function(layer, ctx) {
var tileSize = map.getTileSize();
var startCol = Math.floor(camera.x / tileSize);
   var startRow = Math.floor(camera.y / tileSize);
   
   /*********** On empêche l'algo de créer des cases juste pour combler la vue caméra ***********/
   var endCol; var endRow;
   if (camera.width > tileSize * map.cols) endCol = startCol + map.cols - 1;
   else  endCol = startCol + (camera.width / tileSize);

   if (camera.height > tileSize * map.rows) endRow = startCol + map.rows - 1;
   else  endRow = startRow + (camera.height / tileSize);
   /*********************************************************************************************/
   
   var offsetX = -camera.x + startCol * tileSize;
   var offsetY = -camera.y + startRow * tileSize;

// on précharge l'image de tous les tiles, une fois chargée on peut commencer à drawImage()
   var imageTilesAtlas = new Image();
    imageTilesAtlas.src = this.tileAtlas;
       imageTilesAtlas.onload = function() {
   for (var c = startCol; c <= endCol; c++) {
       for (var r = startRow; r <= endRow; r++) {
           var tile = map.getTile(layer, c, r); // recupère le type de case (0, 1, 2, 3, 4, 5 ou 6)
           var x = (c - startCol) * tileSize + offsetX;
           var y = (r - startRow) * tileSize + offsetY;
           if (tile !== 0) { // 0 => empty tile
               ctx.drawImage(
                   imageTilesAtlas, // image contenant les tiles
                   (tile - 1) * tileSize, // x à partir duquel prendre l'image (pour sélectionner la bonne texture)
                   0, // y à partir duquel prendre l'image (pour sélectionner la bonne texture)
                   map.defaultTileSize, // source width
                   map.defaultTileSize, // source height
                   Math.round(x),  // target x
                   Math.round(y), // target y
                   tileSize, // target width
                   tileSize // target height
               );
           }
       }
   }
};

   camera.recenterOnMyCity();
},

drawGridMap: function (ctx) {
var tileSize = map.getTileSize();
   var width = map.cols * tileSize;
   var height = map.rows * tileSize;
   var x, y;

   ctx.strokeStyle = "rgba(100,100,100,0.3)"; // couleur et opacité du quadrillage

   for (var r = 0; r < map.rows; r++) {
       x = - camera.x;
       y = r * tileSize - camera.y;
       ctx.beginPath();
       ctx.moveTo(x, y);
       ctx.lineTo(width, y);
       ctx.stroke();
   }
   for (var c = 0; c < map.cols; c++) {
       x = c * tileSize - camera.x;
       y = - camera.y;
       ctx.beginPath();
       ctx.moveTo(x, y);
       ctx.lineTo(x, height);
       ctx.stroke();
   }
},



RE: images sur canvas qui ne se génèrent pas - Xenos - 20-11-2016

J'ai vu un if sans accolade avec l'instruction sur la même ligne que la condition, du styling au milieu, et une "," pour terminer la dernière instruction donc je n'ai pas envie d'analyser en profondeur ce code.

Regarde ta console, tu as certainement une erreur explicite. A défaut, tu peux poser des points d'arrêt dans ton code Javascript (facile depuis Firebug dans Firefox) et suivre pas à pas l'exécution de ce code.

Pour terminer, la réinvention de la roue ne te permettra pas de finir ton jeu. Si c'est à loisir pour passer le temps, pas de soucis, mais si tu comptes avoir un résultat diffusable, jouable et maintenable, prend soit des bibliothèques existantes, soit du full-standard (SVG, en réajustant peut-être ton gameplay) soit des SDK.


RE: images sur canvas qui ne se génèrent pas - fortz - 20-11-2016

Un if sans accolade, est-ce interdit ? il ne me semble pas, je n'ai qu'une seule petite instruction dans mon if, enlever les accolades permet simplement un gain de temps (minime je l'accorde).
Du styling au milieu ? où exactement ?
Le "," est simplement parce que j'ai d'autres fonctions après que je n'ai pas mis dans le code afin de ne pas mettre des choses inutiles sur le sujet !

Bien-sûr que non, je n'ai aucune erreur explicite, je ne suis pas stupide au point de ne pas regarder ça et de venir poster ici ! et rien n'est de travers, le context est bon, chaque variable à sa valeur...

En effet, je fais cette map pour m'amuser, m'entraîner, me montrer ce que je peux faire sans aller copier un algorithme existant ! Je ne pense pas que ce soit un crime ! Je pourrais prendre un bibliothèque en effet mais à la vue de ce que j'ai dit ci-dessus, tu comprendras que je n'ai pas ce projet. J'ai regardé beaucoup de sujets sur beaucoup de forums concernant la création de map 2D, et pour la plupart, ils disaient d'utiliser la balise canvas (et même toi il me semble que tu me l'as dit également). Canvas n'est pas "full-standard' ?

Je ne comprends pas ton comportement sur ce sujet, tu as toujours répondu de manière construite et c'était toujours intéressant et là tu te mets simplement à critiquer sans chercher à comprendre la raison pour laquelle je poste ici.


RE: images sur canvas qui ne se génèrent pas - Xenos - 20-11-2016

Ce n'est pas interdit, c'est une règle Sonar standard pour rendre un code lisible.

ctx.strokeStyle = "rgba(100,100,100,0.3)"; // couleur et opacité du quadrillage
Pour moi, c'est une règle de style. C'est probablement inhérent au canva (d'où mes réticences face à cette "techno", parfaitement standard et adaptée pour faire de l'affichage à l'utilisateur mais qui requiert des libs pour faire de l'interaction avec l'utilisateur). En tous cas, cela reste du style inline (et par habitude et convention, les commentaires vont plutôt avant la ligne de code qu'à la fin).

Okay, t'as pas d'erreur explicite. Cela ne change pas le fait que je te conseille de passer en pas-à-pas pour voir si tu rentres correctement dans chaque boucle avec les bonnes valeurs, car tu as certainement une erreur de ce genre.

Et non, y'a donc pas de mal à perdre passer du temps sur canvas si c'est effectivement juste pour passer du temps. C'est simplement que, par habitude, les posteurs qui viennent ici ont la création de leur jeu en tête, donc je préfère avoir tort dans 5% des cas (ici) que dans les 95% d'autres. D'autant que le code étant résumé, j'ai aussi résumé ma réponse (=donner des méthodes & pistes plutôt qu'une solution mâchée).


RE: images sur canvas qui ne se génèrent pas - fortz - 20-11-2016

Voilà je préfère quand on discute comme ça, là je prends note des standards pour les if et pour les commentaires (je suis étudiant donc les standards on nous les apprend malheureusement pas bcp, j'ai appris tout par moi-même concernant le web donc j'ai certainement de mauvaises habitudes).
En faisant du pas à pas dans le code, je ne vois vraiment rien qui cloche vraiment, les boucles sont parcourus comme il faut et les valeurs sont bonnes Sad

Concentrons-nous sur la fonction drawGridMap, aucun des traits ne se dessine, ce ne serait pas un problème de contexte ? je suis assez perdu là Sad Je vais continuer de chercher de mon côté.


RE: images sur canvas qui ne se génèrent pas - Xenos - 21-11-2016

Je ne vois surtout pas ce que tu cherches à faire: y'a qu'une seule tile de dessinée, donc si tu dessines deux fois la même couche de trucs, tu ne verras pas de différence?!

Tu peux jeter un oeil sur les protos que j'ai, canvas-color et game of life. Les deux utilisent canvas me semble-t-il. Si cela peut t'aider.

PS: tu peux aussi jeter un oeil à SonarQube. C'est un outil d'analyse de code répandu qui sera toujours un plus à connaître en sortant d'école (ça n'avancera pas ton jeu, mais ta carrière, c'est possible). Il doit y avoir des tutos pour le prendre en main (et tu peux jeter un oeil sur mon blog car j'y ai peut-être noté ma démarche pour l'installer et l'utiliser).


RE: images sur canvas qui ne se génèrent pas - fortz - 21-11-2016

Alors pour comprendre plus facilement, voilà le lien pour que tu vois : http://hypora.fr/modules/test_map_private/Troisieme/ (clique sur le globe en bas à gauche pour ouvrir la map). Il y a en fait 2 tiles à dessiner sur chaque case (le fond : eau, herbe, ... + ce qu'il y a dessus : oasis, ville, ....). Et par dessus la grille pour bien différencier chacune des cases.
Je jette un oeil et SonarQube et tes deux projets (que j'ai commencé à regarder) Smile

Merci


RE: images sur canvas qui ne se génèrent pas - Xenos - 21-11-2016

Et donc, qu'est ce qui est censé foirer sur la démo (qui marche même si elle rame quand on la déplace)?


RE: images sur canvas qui ne se génèrent pas - fortz - 21-11-2016

tu vois la grille sur la démo ? en fait ca lag pas, je suis en train de le modifier là, mais ça ne prend en compte que quand tu bouges ta souris en fait du coup quand elle bouge pas il considère qu'il y a pas de mouvement donc pas de déplacement de map. J'y travaille. Le mystère de la grille reste entier Smile


RE: images sur canvas qui ne se génèrent pas - Xenos - 22-11-2016

Vérifie les coordonnées des traits que tu trace. Affiche une image au lieu de tracer le trait et voit si elle est bien là (et à la bonne place).

Et je réitère quand même: cela ne sent pas le "test & tries" tout ça, mais bien le jeu web, et tu te fais chier pour quedale. T'imagines pas la maintenance que tu vas te taper derrière (là, t'en es à 3 jours pour la déboguer, donc bon...). Tu devrais clairement séparer le "je fais joujou sur canvas pour voir ce que je sais en faire" et ton projet de jeu que tu veux voir aboutir puis joué (enfin, sauf si tu ne veux pas le voir "terminé un jour" [sachant que ce ne sera de toute façon jamais fini] et joué)