enchant.js - 3e partie
Rédigé par Fred - - Aucun commentaire
Pour cette partie, on va voir quelque chose d’un peu plus concret, la
classe Sprite
.
L’attribut image
Dans ce premier exemple (les sources sont toujours au même endroit),
on va voir comment afficher une image. Pour cela, revenons au premier
tutoriel. J’avais fait un game.rootScene.addChild(new
Sprite(32,32));
sans expliquer. Et ben c’est aussi simple que ça : on
crée une instance de Sprite
et on l’ajoute à quelque chose. Le
souci, c’est que dans cet exemple, ça affiche une image vide… Pour
vraiment afficher une image, le mécanisme va rester le même : on crée
une instance de Sprite
en lui donnant des dimensions, on lui dit
quelle image afficher et on l’ajoute à une scène.
Pour pouvoir afficher une image dans le sprite, le mieux, c’est de
précharger l’image avec game.preload(urlDeLImage);
puis de mettre
cette image sur l’attribut image
de notre instance en utilisant
notreSprite.image = game.assets[urlDeLImage];
.
Voilà donc ce que ça donne :
game.preload('../images/chara1.png'); game.onload = function() { var player = new Sprite(200, 200); player.image = game.assets['../images/chara1.png']; game.rootScene.addChild(player); };
Quand on spécifie à Sprite
des dimensions plus grandes que celles de
l’image chargée, enchant.js répète l’image comme on peut le voir dans
ce premier exemple.
À l’inverse, si on spécifie des dimensions plus petites, l’image sera
tronquée. Dans cet exemple, on voit aussi que pour spécifier où
afficher l’image, on utilise les attributs x
et y
du Sprite
:
player.x = 100; player.y = 50;
L’origine du sprite — le point en haut à gauche —, sera positionné à 100 pixels à droite, et 50 pixels plus bas que l’origine de la scène sur laquelle il est placé.
L’attribut frame
Comment faire pour choisir quelle portion de l’image afficher ? Il y a
au moins deux façons de faire. La première, c’est d’utiliser les
attributs _frameLeft
et _frameTop
. En fixant ces deux valeurs, on
dit à partir de quels pixels on doit découper l’image, en partant d’en
haut à gauche (son origine étant 0×0). Par exemple, pour afficher le
deuxième et troisième personnage de la troisième ligne, il faut
découper une image de 64 de large par 32 de haut, en partant du 32e
pixel d’en haut et du 64e de la gauche.
On fait donc un player1 = new Sprite(64, 32);
pour découper l’image
aux bonnes dimensions, puis player1._frameLeft = 32;
et
player1._frameTop = 64;
pour découper la bonne portion de l’image.
Une autre façon de faire, et d’utiliser l’attribut frame
. On a vu
que l’image chargée est découpée en un rectangle aux dimensions du
Sprite
. En fait, elle est découpée en plusieurs rectangles, collés
les uns aux autres. Quand on a affiché le sprite, on a en fait affiché
le premier rectangle, la frame
0. Pour afficher le rectangle d’à
côté, il suffit de faire player.frame = 1
.
Dans ce quatrième exemple, l’image chara1.png
est découpée en un
carré de 32×32 (Sprite(32, 32)
), puis on décale le carré en
indiquant quelle frame afficher (player.frame = i+j*5;
). J’ai
rajouté un label avec le numéro de la frame sur chaque sprite si ce
n’est pas suffisamment clair.
On peut donc faire en sorte que notre personnage « marche » en
changeant le carré à afficher à chaque nouvelle frame du jeu. Pour
cela, on peut passer à l’attribut frame
une liste de valeur. En
faisant player.frame = [0, 1, 0, 2];
la frame de l’image affichée
sera 0 à la première frame du jeu, puis 1 à la seconde, puis 0, 2, et
recommencera au début : 0 à la cinquième, puis 1, 0, 2, 0, 1, 2…
Pour ne plus qu’il fasse du surplace, on peut utiliser
addEventListener('enterframe'...)
pour changer sa position, et
l’arrêter s’il va trop loin.
player.addEventListener('enterframe', function(){ if (player.x > 50) player.frame = 8; else { player.x+=2; player.y+=3; } });
Le reste
Bon, ça commence à ressembler à quelque chose. Mais comment on fait pour le faire partir dans l’autre sens ?
Pour inverser gauche/droite et haut/bas, c’est comme pour le faire
changer de taille : on utilise scale()
, scaleX
, ou scaleY
.
L’attribut scaleX
indique quelle est la mise à l’échelle sur la
largeur du sprite : une valeur de 2 indique que le sprite est 2 fois
plus large que normalement. À l’inverse, si on fixe scaleX
à 0.5, le
sprite sera deux fois moins large. Si on a modifié sa taille, et que
l’on veut la doubler, il faudrait faire player.scaleX*=2;
puis
player.scaleY*=2;
. À la place, on peut utiliser la méthode scale
:
player.scale(2, 2);
qui va multiplier la valeur de scaleX
et
scaleY
par 2. Quand on veut changer le sens d’un sprite sur l’axe
des x, il faut donc faire player.scale(-1, 1);
, quelque soit le
sens.
De la même façon, on peut faire tourner le sprite. Soit en valorisant
l’attribut rotation
, soit en utilisant la méthode rotate()
. Les
angles de rotations sont en degrés. Comme pour la mise à l’échelle, si
on fait .rotate(45)
deux fois de suite, on aura un .rotation
à
90°.
La rotation, comme pour la mise à l’échelle, se fait à partir de
(sprite.x, sprite.y)
. Si on veut changer ça, il faut modifier
l’origine en changeant les attributs .originX
et .originY
.
Pour modifier les attributs .scaleX, scaleY
, on a la méthode
.scale()
. Pour modifier les attributs .rotateX, .rotateY
, on a la
méthode .rotate()
. Pour modifier .x, .y
, il existe aussi une
méthode. Ou plus exactement, deux : .moveBy()
et .moveTo()
. La
première permet de déplacer le sprite par rapport à sa position :
player.x += 1; player.y += 1;
et
player.moveBy(1, 1);
sont donc équivalent.
De même, pour déplacer le sprite à (100, 100), on peut faire indifféremment :
player.x = 100; player.y = 100;
ou
player.moveTo(100, 100);
Toutes ces méthodes sont montrées dans l’exemple 7.
Et si on veut dessiner une image
Si on ne peut pas utiliser un fichier image, mais plutôt dessiner un
rectangle, des lignes… il faut créer une instance de Surface
et
associer l’image du sprite à cet instance :
surface.context.stokeStyle = "Red"; surface.context.lineWidth = 8; surface.context.rect(10, 10, 30, 80); surface.context.fillStyle = "rgb(150, 150, 150)"; surface.context.fill(); surface.context.stroke(); sprite.image = surface;
Surface.context
permet en fait d’accéder à l’API Canvas (mozilla.org). Quelques
fonctionnalités sont montrées dans l’exemple 8.
Il nous restera deux trois choses à voir pour les sprites, mais on attendra un prochain tutoriel. La prochaine fois, on va voir de nouveaux événements, notamment pour pouvoir s’amuser avec le clavier et la souris !