Tutorial Phaser – Criando um RPG – Parte 2 – Utilizando sprites e criando um personagem

Tutorial Phaser – Este é o segundo artigo da série “Phaser para iniciantes”. No primeiro artigo (https://programandojuntos.com.br/phaser-para-iniciantes-parte-1/) criamos nosso primeiro mapa e agora nesse segundo artigo vamos criar nosso personagem e fazer ele aparecer no mapa.

Se você prefere acompanhar tudo em vídeo, temos também um canal no Youtube com esse mesmo conteúdo:

Arquivos necessários

Para poder seguir esse tutorial, será necessário realizar o download de 3 arquivos ‘.png’ que iremos utilizar para criar as animações do nosso personagem. Hospedei esses arquivos em um Drive pra ficar mais fácil o download: https://drive.google.com/drive/folders/1g08uuOC7NPEuxw-92CxraN4a_nsBYfGV?usp=sharing

Basta clicar no link acima e baixar todos os arquivos dessa pasta.

Após isso, dentro do projeto do nosso jogo, crie uma pasta chamada ‘player’ dentro de ‘dist/assets/’ e copie os arquivos baixados para dentro dessa pasta ‘player’ que você acabou de criar.

Carregando sprites do personage – Tutorial Phaser

Primeiramente vamos criar um arquivo ‘player.ts’ dentro da pasta ‘src’. Dentro desse arquivos iremos copiar o seguinte código:

export const loadSprites = (scene: Phaser.Scene): void => {
  // Essa função 'scene.load.spritesheet' é responsável por carregar os sprites na instância do Phaser.
  // Aqui iremos carregar a animação do personagem parado na tela.
  // O primeiro parâmetro 'player_idle' é o nome do índice que iremos dar a esse sprite carregado.
  // O segundo parâmetro é o caminho do sprite. Repare que aqui estamos utilizando a imagem que baixamos no passo anterior.
  scene.load.spritesheet("player_idle", "./assets/player/idle.png", {
    frameWidth: 83, // Largura do frame dessa animação
    frameHeight: 64, // altura do frame dessa animação
    spacing: 45, // O espaçamento em pixels entre um frame e outro. Se você abrir a imagem, vai reparar que os frames estão espaçados
  });

  // Essa função faz a mesma coisa que a de cima, porém carregando o sprite de 'caminhada' do personagem
  scene.load.spritesheet("player_walk", "./assets/player/walk.png", {
    frameWidth: 83,
    frameHeight: 64,
    spacing: 45,
  });

  // Essa função faz a mesma coisa que a de cima, porém carregando o sprite de 'ataque' do personagem
  scene.load.spritesheet("player_attack", "./assets/player/attack.png", {
    frameWidth: 83,
    frameHeight: 64,
    spacing: 45,
  });
};

Após isso os sprites estão carregados na instância do Phaser.

A seguir vamos configurar as animações do sprite do nosso personagem.

Configurando animação de sprite – Tutorial Phaser

Nessa etapa vamos transformar esses sprites em animações, dizendo ao Phaser quantas vezes o sprite será executado por segundo e outros detalhe assim.

Logo abaixo copie e cole o seguinte código no arquivo ‘player.ts’:

const createAnimations = (scene: Phaser.Scene): void => {
  // A função 'scene.anims.create' cria uma animação na instância do Phaser para podermos usar em qualquer momento do jogo.
  // Aqui iremos criar a animação do personagem parado
  scene.anims.create({
    key: "player_idle",
    frames: scene.anims.generateFrameNames("player_idle", {  // Aqui você informa qual sprite você está carregando. Nós configuramos esse nome na etapa anterior
      start: 0, // Em qual dos frames irá começar a executar a animação. Nesse caso escolhemos 0, mas poderia ser qualquer outro.
      end: 7, // Aqui em qual dos frames irá terminar a execução da animação.
    }),
    frameRate: 8, // Quantas frames serão apresentados por segundo. Aqui iremos exibir 8 frames por segundo.
    repeat: -1, // Quantas vezes a animação irá se repetir. Deixamos -1 para repetir infinitamente.
    yoyo: true, // Indica se a animação deve ser executada de traz pra frente também, como um yoyo, vai e volta.
  });

  // Faz a mesma coisa da função acima, mas cria a animação de 'caminhada'
  scene.anims.create({
    key: "player_walk",
    frames: scene.anims.generateFrameNames("player_walk", {
      start: 0,
      end: 6,
    }),
    frameRate: 8,
    repeat: -1,
  });

  // Faz a mesma coisa da função acima, mas cria a animação de 'ataque'
  scene.anims.create({
    key: "player_attack",
    frames: scene.anims.generateFrameNames("player_attack", {
      start: 0,
      end: 3,
    }),
    frameRate: 12,
    repeat: 0,
  });
};

Criando personagem

E finalmente iremos criar nosso personagem, para isso copie a seguinte função no mesmo arquivo ‘player.ts’:

export const createPlayer = (scene: Phaser.Scene) => {
  // Essa função adiciona um elemento no jogo usando um sprite. O sprite que vamos usar aqui é o 'player_idle'
  const player = scene.physics.add.sprite(200, 200, "player_idle");
  // chamamos a função implementada anteriormente para criar todas as animações para nosso personagem
  createAnimations(scene);
  return player;
};

Agora no arquivo ‘src/game.ts’ iremos importar duas funções criadas anteriormente:

import { createPlayer, loadSprites } from "./player";

Vamos criar a propriedade ‘player’ dentro da classe Demo, ficando assim:

import * as Phaser from "phaser";
import { createPlayer, loadSprites } from "./player";

export default class Demo extends Phaser.Scene {
  player;

  ...
  ...
  ...

Dentro da função ‘preload’, ainda no arquivo ‘src/game.ts’ iremos chamar a função para carregar os sprites do personagem, ficando assim:

preload() {
    this.load.image("tiles", "./assets/map/grass.png");
    this.load.image("border", "./assets/map/water.png");
    this.load.tilemapTiledJSON("map", "./assets/map/map.json");
    loadSprites(this);
}

Por último dentro da função ‘create’ vamos chame a função de criação de personagem, ficando assim:

create() {
    const map = this.make.tilemap({ key: "map" });
    const tilesetGrass = map.addTilesetImage("grass", "tiles");
    const tilesetWater = map.addTilesetImage("water", "border");
    const ground = map.createLayer("grass", tilesetGrass, 0, 0);
    const water = map.createLayer("water", tilesetWater, 0, 0);
    this.player = createPlayer(this);
 }

Desse modo podemos finalmente ver o personagem aparecendo no nosso mapa. Basta salvar todos os arquivos e acessar o endereço http://localhost:10001/ (que é o endereço onde está rodando nosso projeto)

Exemplo personagem sendo exibido no jogo

Conclusão

Nesse Tutorial Phaser aprendemos como carregar e utilizar sprites dentro do Framework Phaser. E também aprendemos como criar um personagem na tela.



Você pode gostar...