#cpbr9 #inovacaoedesenvolvimento
Talita Pagani | @talitapagani
Bacharel e mestranda em Ciência da Computação.
Pesquisadora em Interação Humano-Computador (IHC) e Acessibilidade Web.
Professora.
Membro do Grupo de Especialistas em Acessibilidade Web do W3C.
Tentativa de fazer uma engine própria, mas não levei adiante.
@soapdog
Canvas é uma API de propósito geral para desenho e não focada em jogos
Alguns jogos consumiam muito processamento por não utilizar de forma eficiente o canvas
Ainda hoje, nem todo framework/engine de jogos é adequada para mobile
Muitos frameworks centralizam o jogo em um único canvas.
1 Jogo != 1 Canvas
Canvas para cenário
Múltiplos canvas
Elementos em HTML
Canvas do cenário
Canvas 2
Canvas 3
1000 x 1
HTML
Assets
Os recursos do jogo, como imagens, spritesheets e sons
Lógica
O próprio JavaScript
Gráficos
O Canvas
Input
Eventos de interação do usuário com o jogo, como pressionar uma tecla ou tocar na tela
Multiplayer
WebSockets
Sons e Música
A tag <audio>
JavaScript
Comportamentos, eventos, lógica, mecânica do jogo
HTML
<canvas>, <audio>, <video>, conteúdo textual
SVG
Gráficos, cenários vetoriais e animações
CSS
Transições, controles, formatação e apresentação
Sprites
Start /
Input
Update
Render
Draw
Loop
Leve e otimizado para uso em dispositivos móveis.
Uso híbrido de Canvas e tags HTML5.
Open-source.
Rápida curva de aprendizagem.
Comunidade ativa.
WebGL e Canvas
Preloader
Physics
Sprites
Groups
Animation
Particles
Camera
Input (incluindo touch)
Sound
Tilemaps
Device Scaling
Plugin System
Mobile Browser
Suporte para desenvolvedores
http://phaser.io/sandbox
var game = new Phaser.Game(800, 600, 
                            Phaser.AUTO, 'game_canvas', 
                            { preload: funcao_de_preload, 
                              create: funcao_de_create, 
                              update: funcao_de_update });Criando um novo jogo
function preload() {
    // Onde todos os assets do jogo são carregados
}
function create() {
    /* É onde os elementos do jogo são criados e posicionados,
        como os personagens, o tilemap, etc. */
}
function update() {
    /* É o game loop, ou seja, onde o jogo acontece de fato */
}Os principais estados do jogo
var game = new Phaser.Game(800, 600, Phaser.AUTO, '');
var Start_Screen = {
    preload: function () { /*...*/ },
    create:  function () { /*...*/ },
    outra_funcao:  function () { /*...*/ }
};
game.state.add('Start', StartScreen);
game.state.start('Start');E se eu precisar adicionar várias telas (cenas) ao jogo?
function preload() {
    game.load.image('sky', 'assets/sky.png');
    game.load.image('ground', 'assets/platform.png');
    game.load.image('star', 'assets/star.png');
    game.load.spritesheet('dude', 'assets/dude.png', 32, 48);
}function create() {
    game.physics.startSystem(Phaser.Physics.ARCADE);
    game.add.sprite(0, 0, 'sky');
    var platforms = game.add.group();
    platforms.enableBody = true;
    var ground = platforms.create(0, game.world.height - 64, 'ground');
    ground.scale.setTo(2, 2);
    ground.body.immovable = true;
    var ledge = platforms.create(400, 400, 'ground');
    ledge.body.immovable = true;
    ledge = platforms.create(-150, 250, 'ground');
    ledge.body.immovable = true;
}function update () {
    game.physics.arcade.collide(player, platforms);
    player.body.velocity.x = 0;
    if (cursors.left.isDown)
    {
        player.body.velocity.x = -250;
    }
    else if (cursors.right.isDown)
    {
        player.body.velocity.x = 250;
    }
    if (jumpButton.isDown && (player.body.onFloor() || player.body.touching.down))
    {
        player.body.velocity.y = -400;
    }
}player = game.add.sprite(32, game.world.height - 150, 'dude');
game.physics.arcade.enable(player);
// Propriedades físicas do personagem
player.body.bounce.y = 0.2;
player.body.gravity.y = 300;
player.body.collideWorldBounds = true;
Animações para andar para a esquerda e direita
player.animations.add('left', [0, 1, 2, 3], 10, true);
player.animations.add('right', [5, 6, 7, 8], 10, true);// Gerenciando pontuação e adicionando textos
var score = 0, scoreText;
scoreText = game.add.text(16, 16, 'Score: 0', 
            { fontSize: '32px', fill: '#000' });
score += 10;
scoreText.text = 'Score: ' + score;
// Removendo objeto depois de colidir
meu_sprite.kill();// Escrevendo um texto em outra engine
var loadingText = Crafty.e("2D, DOM, Text")
		.attr({w: 500, 
                       h: 20, x: ((Crafty.viewport.width) / 2), 
                       y: (Crafty.viewport.height / 2), z: 2})
		.text('Carregando...')
		.css({fontFamily: 'Impact', fontSize: '12px', color: '#FFF'});entity
    .attr({x: ((parent.x+(parent.w/2))-8), y: ((parent.y+(parent.h/2))-8), z: 300})
    .collision(new Crafty.polygon([8,0],[5,3],[5,12],[3,13],[3,15],[14,15],[14,13],[12,3],[9,0]))
    .onHit("nave", function(hit) {
    	if (!explodiu)
    	{
    		Crafty.audio.add("boom", "web/audio/bullet_boom.mp3");
    		Crafty.audio.play("boom",1);
    		
    		explodiu = true;
    	}
    	
    	for(i = 0; i < hit.length; i++) {
    		var nave = hit[i]['obj'];
    					
		var explosion = Crafty.e("2D, Canvas, SpriteAnimation, explosion")
					.attr({x: nave.x, y: nave.y, z: 300})
					.animate('explosion', 0, 0, 8) // setup animation
					.animate('explosion', 8, 0) // start animation
    								    
    		nave.destroy();
    	}
    	
    	this.destroy();
    	
    	var evt = document.createEvent("Event");
    	evt.initEvent("SpaceshipEvent", true, true);
    	document.dispatchEvent(evt);
    	
    }, function() {
    	explodiu = false;
    })http://phaser.io/examples
https://leanpub.com/buildinggamesforfirefoxos
http://tutorialzine.com/2015/06/making-your-first-html5-game-with-phaser/
@talitapagani
talita.cpb@gmail.com
slides.com/talitapagani/cpbr9-phaser/