Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Phaser workshop
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Alvin Berthelot
April 07, 2016
Programming
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Phaser workshop
Alvin Berthelot
April 07, 2016
More Decks by Alvin Berthelot
See All by Alvin Berthelot
Sass, pratique tout de suite
alvinberthelot
0
100
css-tooling
alvinberthelot
0
110
Sass workshop
alvinberthelot
0
150
Devoxx15 - Let's sketch together
alvinberthelot
1
130
Let's sketch together
alvinberthelot
0
1.7k
Other Decks in Programming
See All in Programming
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
110
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
5.8k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
170
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
4.2k
The NotImplementedError Problem in Ruby
koic
1
780
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.9k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
240
Inside Stream API
skrb
1
710
さぁV100、メモリをお食べ・・・
nilpe
0
140
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.3k
Oxcを導入して開発体験が向上した話
yug1224
4
310
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
7
4.4k
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Mobile First: as difficult as doing things right
swwweet
225
10k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Believing is Seeing
oripsolob
1
140
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Practical Orchestrator
shlominoach
191
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Building Applications with DynamoDB
mza
96
7.1k
Technical Leadership for Architectural Decision Making
baasie
3
410
Evolving SEO for Evolving Search Engines
ryanjones
0
220
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Transcript
Code & Play
Hello Pierre CHABILAND @PierreChabiland casusludi.com Alvin BERTHELOT @alvinberthelot webyousoon.com
Our goals Coder un jeu web Découvrir Phaser Se faire
plaisir
Progress 1. Présentation Phaser 2. Présentation du code/Git 3. Concepts
puis réalisation du jeu “Step by step” 4. Temps d’expérimentation et de fun
The game to build ARKANOID
Phaser
Phaser Framework de jeu 2D en HTML5/JS pour le web
mobile et desktop Exploite WebGL et Canvas (se base sur PIXI.JS pour le rendu d’affichage) Accent mis sur les performances web mobiles
Features - Sprites / Animation - Particules - Moteurs physique
(3 par défaut, possibilité d’en ajouter) - Camera - Tilemaps (décors en tuiles, comme sur les 1ers Zelda) - Sons (musiques / effets sonores) - Etc….
Code Git
TUTORIAL git clone https://github. com/alvinberthelot/phaser-example-arkanoid cd phaser-example-arkanoid npm install gulp
localhost:3000
TUTORIAL git checkout game
Press start
Phaser init var Phaser = require('phaser'); var SCALE = 3;
var game = new Phaser.Game( 120 * SCALE, 60 * SCALE, Phaser.AUTO, 'phaser-example-arkanoid', { preload: _preload, create: _create, update: _update }, false, false );
Loading assets function _preload() { game.load.image('ball', 'game/assets/ball.png'); }
Add sprite function _create() { var ball = game.add.sprite(x, y,
'ball'); }
Change game function _update() { if(ball.x > ...) { ...
} }
UNLOCK LEVEL 1 1. Add background colour to the game
2. Show ball in the game
PASSWORD LEVEL 1 git checkout feat/game-view
Add life to your sprite function _update() { ball.x +=
10; }
Add physics function _create() { ... game.physics.enable(ball, Phaser.Physics.ARCADE); }
Velocity function _create() { ... var angle = 0; ball.body.velocity.setTo(
Math.cos(angle) * ballSpeed, Math.sin(angle) * ballSpeed ); }
Collide function _create() { ... ball.body.collideWorldBounds = true; }
Keep dynamic function _create() { ... ball.body.bounce.set(1); }
UNLOCK LEVEL 2 1. Move the ball in the old
school way 2. With physics the ball can’t exit 3. Use velocity instead of the old school way and add bounce
PASSWORD LEVEL 2 git checkout feat/game-physics
Add controls function _create() { ... cursor = game.input.keyboard.createCursorKeys(); }
function _update() { ... bar.body.velocity.x = 0; if (cursor.left.isDown) { bar.body.velocity.x = - barSpeed * SCALE; } else if (cursor.right.isDown) { bar.body.velocity.x = barSpeed * SCALE; } }
Collide bar / ball function _create() { ... bar.body.immovable =
true; } function _update() { ... game.physics.arcade.collide(bar, ball, null, null, this); }
function _update() { ... game.physics.arcade.collide(bar, ball, null, _reflect, this); }
function _reflect(bar, ball) { ... } Action when collide
function _reflect(bar, ball) { if (ball.y > (bar.y + 5))
{ return true; } else { var rate = (1 - (ball.x + ball.width * 0.5 - bar.x ) / bar.width); if(rate < 0.1) rate = 0.1; if(rate > 0.9) rate = 0.9; var angle = - Math.PI*rate; ball.body.velocity.setTo( Math.cos(angle) * ballSpeed, Math.sin(angle) * ballSpeed ); return false; } } Action when collide
UNLOCK LEVEL 3 1. Add a bar and move it
with the keyboard 2. Add physics between ball and bar 3. Calculate new angle when ball touch bar
PASSWORD LEVEL 3 git checkout feat/game-keyboard
Create a brick function _create() { ... var brick =
game.add.sprite(x, y, 'brick'); brick.scale.set(SCALE); game.physics.enable(brick, Phaser.Physics.ARCADE); brick.body.immovable = true; }
Collide ball / brick function _update() { ... game.physics.arcade.collide(ball, brick,
null, null, this); }
Group of brick function _createBricks() { var bricks = game.add.group();
var widthBrick = game.cache.getImage('brick').width; var heightBrick = game.cache.getImage('brick').height; for (var i = 0; i < 10; i++) { for (var j = 0; j < 6; j++) { var brick = _createOneBrick( widthBrick * SCALE * i, heightBrick * SCALE * j, 'brick'); bricks.add(brick); } } return bricks; }
Kill a brick function _update() { ... game.physics.arcade.collide( ball, bricks,
null, _breakBrick, this); } function _breakBrick(ball, brick) { brick.kill(); return true; }
UNLOCK LEVEL 4 1. Create a brick 2. Create a
group of bricks 3. Kill a brick when the ball touch it
PASSWORD LEVEL 4 git checkout feat/game-bricks
Pause function _create() { ... game.paused = true; spaceKey =
game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR); spaceKey.onDown.add(function() { game.paused = !game.paused; }, this); }
UNLOCK LEVEL 5 1. Init bar, ball and bricks with
game dimensions 2. Game paused by default 3. Toggle pause with spacebar
PASSWORD LEVEL 5 git checkout feat/game-paused
Show text var message; var style = { font: '32px
Arial', fill: '#ffffff' }; message = game.add.text( game.width * 0.5, game.height * 0.5, 'Ready ?', style); message.anchor.set(0.5); message.text = 'Bye';
Prepare WebFont // The Google WebFont Loader will look for
this object, so create it before loading the script. WebFontConfig = { active: function() { game.time.events.add( Phaser.Timer.SECOND, _createMessage, this); }, google: { families: ['Pacifico', 'Cookie'] } };
Use WebFont function _preload() { ... // Load the Google
WebFont Loader script game.load.script( 'webfont', '//ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js'); } var style = { font: '32px Cookie', fill: '#ffffff' };
UNLOCK LEVEL 6 1. Show text when game paused 2.
Load web font 3. Show text when win or lose
PASSWORD LEVEL 6 git checkout feat/game-text
Class Brick var Brick = function(game, x, y, image) {
Phaser.Sprite.call(this, game, x, y, 'brick'); this.scale.set(SCALE); this.game.physics.enable(this, Phaser.Physics.ARCADE); this.body.immovable = true; }; Brick.prototype = Object.create(Phaser.Sprite.prototype); Brick.prototype.constructor = Brick; var brick = new Brick(...);
Handle events Brick.prototype = Object.create(Phaser.Sprite.prototype); Brick.prototype.constructor = Brick; Brick.prototype.destruct =
function() { this.events.onKilled.addOnce(this._onKillHandler, this); this.kill(); }; Brick.prototype._onKillHandler = function() { ... };
Particles Brick.prototype._onKillHandler = function() { var emitter = this.game.add.emitter(0, 0,
100); emitter.makeParticles('brick-dust'); emitter.x = this.x + this.width * 0.5; emitter.y = this.y + this.height * 0.5; emitter.minParticleSpeed.setTo(-50 * SCALE, -50 * SCALE); emitter.maxParticleSpeed.setTo(50 * SCALE, 50 * SCALE); emitter.minParticleScale = 1 * SCALE; emitter.maxParticleScale = 1.5 * SCALE; emitter.start(true, 300, null, 10); this.game.time.events.add(2000,function() { emitter.destroy(); }); };
UNLOCK LEVEL 7 1. Create specific class for brick 2.
Destroy bricks with particles
PASSWORD LEVEL 7 git checkout feat/game-particles
Gamepad function _create() { ... game.input.gamepad.start(); gamepad1 = game.input.gamepad.pad1; }
function _update() { ... var mainAxis = gamepad1.axis(Phaser.Gamepad.XBOX360_STICK_LEFT_X); if (gamepad1.isDown(Phaser.Gamepad.XBOX360_DPAD_LEFT) || mainAxis < -0.1) { bar.body.velocity.x = - barSpeed * SCALE; } ... }
Audio function _preload() { ... // Load sounds game.load.audio('sound', 'game/assets/sounds/sound1.ogg');
} function _create() { ... sound = game.add.audio('sound'); } function _update() { ... sound.play(); }
BONUS LEVEL Your rules Add sounds Try gamepad
Questions
Thank you