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

Introdução ao desenvolvimento de jogos com Phas...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Ian Ramos Ian Ramos
September 26, 2015
160

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.

Avatar for Ian Ramos

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'} ); //…