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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
110
css-tooling
alvinberthelot
0
110
Sass workshop
alvinberthelot
0
150
Devoxx15 - Let's sketch together
alvinberthelot
1
140
Let's sketch together
alvinberthelot
0
1.7k
Other Decks in Programming
See All in Programming
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
280
テーブルをDELETEした
yuzneri
0
140
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
180
リアルな遅延を測る仕様
kota_yata
1
100
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
680
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
510
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
130
AIが無かった頃の素敵な出会いの話
codmoninc
1
430
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
240
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
490
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
940
yield再入門 #phpcon
o0h
PRO
0
1.1k
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Making Projects Easy
brettharned
120
6.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
410
Mind Mapping
helmedeiros
PRO
1
310
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
270
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Bash Introduction
62gerente
615
220k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
370
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