Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução ao desenvolvimento de jogos com PhaserJS

Ian Ramos
September 26, 2015
150

Introdução ao desenvolvimento de jogos com PhaserJS

Com a chegada do HTML5(com a tag canvas) e com o flash se tornando obsoleto, vários frameworks surgiram. Usaremos o PhaserJS como ferramenta para desenvolvimento de jogos para navegadores.

Ian Ramos

September 26, 2015
Tweet

Transcript

  1. Flash • Software proprietário • Suporte fraco para dispositivos móveis

    • Difícil de atualizar • Precisa ser instalado
  2. E por que PhaserJS? • Photon Storm • Open Source

    • Comunidades(html5gamedevs) • Sintaxe simples e fácil - Javascript básico • Responsivo
  3. PhaserJS • Abril 2013 - Setembro 2013 • Desktop/Mobile •

    Suporte nativo ao CocoonJS • Suporte para Node Webkit • Javascript puro - Fácil, mas nem sempre bom • Typescript (com guia oficial)/Coffeescript
  4. O que precisamos para começar? • Um navegador • Um

    editor de textos (bloco de notas, sublime) • Um servidor web (xampp, http-server) e… • SÓ!
  5. Código inicial (HTML básico) <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

    <title>Meu jogo</title> </head> <body> <script src="js/phaser.min.js"></script> <script src="js/game.js"></script> </body> </html>
  6. Phaser.Game(w, h, render, parent, state); var game = new Phaser.Game(800,

    600, Phaser.AUTO, ‘’, {preload: preload, create: create, upload: upload}); Iniciando...
  7. Phaser.Loader • Imagens • Sprite Sheets • Texture Atlases (incluindo

    pack de texturas, JSON Hash, JSON Array, Flash CS6/CC, e formato XML Starling) • Arquivos de audio(*.ogg, *.mp3, *.wav, *.m4a ...) • Arquivos de dados (XML, JSON, texto) • Arquivos JavaScript (você pode carregar partes do seu jogo ou recursos baseados em JS) • Tilemaps (CSV e Tiled map) • Fontes Bitmap
  8. Sprite Sheets game.load.spritesheet(‘nome’, ‘url’, w, h, nFrames, margin, spacing); Animações

    var dude = game.add.sprite(x, y, ‘nome’, frame, ‘group’); dude.animations.add(‘jump’, frames, fps, loop); dude.animations.play(‘jump’);
  9. function create() {} Função responsável por criar elementos na tela

    em um primeiro momento. Esta função é chamada após a função preload()
  10. function update() {} Função responsável por lidar com qualquer atualização

    feita, em tempo real. Também conhecida como ‘game loop’.
  11. function shutdown() {} Função chamada quando um estado é ‘desligado’.

    Exemplo: Quando um novo estado é chamado a partir do estado atual.
  12. Finalmente nosso jogo. :D Tendo noção básica a respeito do

    carregamento de arquivos e das funções de estado do Phaser, a próxima etapa é iniciar o desenvolvimento do jogo.
  13. Setando variáveis var background , player , playerSpeed = 200

    , enemies , enemy , bullets , bullet , infoText = {} , shotSpeed = 300 , shotTime = 0 , Keys = {};
  14. Iniciando o jogo Criando o objeto usando o construtor Phaser.Game

    var game = new Phaser.Game(800, 600, Phaser.AUTO, ‘’);
  15. Adicionando um background Um tileSprite é um Sprite que possui

    uma textura que se repete. Nota: Não se deve criar um tileSprite maior que a tela, ao invés disso use a propriedade ‘tilePosition’.
  16. Adicionando o personagem function createPlayer() { player = game.add.sprite(10, game.world.height/2,

    'spaceship'); game.physics.arcade.enable(player); player.anchor.setTo(0, 0.5); player.body.collideWorldBounds = true; }
  17. Adicionando tiros function create() { //… bullets = game.add.group(); bullets.enableBody

    = true; bullets.physicsBodyType = Phaser.Physics.ARCADE; bullets.createMultiple(30, 'bullet'); bullets.setAll('outOfBoundsKill', true); bullets.setAll('checkWorldBounds', true); createPlayer(); //…
  18. Adicionando tiros function shot() { if(game.time.now > shotTime) { bullet

    = bullets.getFirstExists(false); if(bullet) { bullet.reset(player.x + player.width, player.y); bullet.body.velocity.x = shotSpeed; shotTime = game.time.now + 300; } } }
  19. Mais movimento ao jogador function update() { //… player.body.velocity.setTo(0, 0);

    if(Keys.cursors.up.isDown) { player.body.velocity.y = -playerSpeed; } if(Keys.cursors.down.isDown) { player.body.velocity.y = playerSpeed; } //…
  20. Mais movimento ao jogador function update() { //… if(Keys.cursors.right.isDown &&

    player.body.x < 210) { player.body.velocity.x = +playerSpeed; } if(Keys.cursors.left.isDown && player.body.x > 10) { player.body.velocity.x = -playerSpeed; } //…
  21. Adicionando inimigos function create() { //… enemies = game.add.physicsGroup(Phaser.Physics.ARCADE, game.world,

    'enemies'); game.enemyGenerator = game.time.events.loop(Phaser.Timer.SECOND * 1.25, createEnemies, this); game.enemyGenerator.timer.start();
  22. Adicionando inimigos function createEnemies() { var x = game.world.width ,

    y = game.rnd.integerInRange(50, game.world.height - 50); enemy = enemies.create(x, y, 'enemies'); enemy.anchor.setTo(0, 0.5); enemy.health = 2; enemy.body.velocity.x = game.rnd.integerInRange(-150, -200); ; enemy.outOfBoundsKill; }
  23. Trabalhando com colisões function update() { //… game.physics.arcade.overlap(bullets, enemies, killEnemy,

    null, this); game.physics.arcade.overlap(player, enemies, hitPlayer, null, this); //…
  24. Trabalhando com colisões - Score function create() { //… infoText.currentScore

    = 0; infoText.scoreText = game.add.text(10, 10, 'Score: ' + infoText.currentScore, { font: '34px Arial', fill: '#FFF'} ); //…