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
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
120
Sass workshop
alvinberthelot
0
160
Devoxx15 - Let's sketch together
alvinberthelot
1
140
Let's sketch together
alvinberthelot
0
1.7k
Other Decks in Programming
See All in Programming
Webプラットフォームで議論されているセキュリティ課題 / Security issues being discussed on Web Platforms
petamoriken
0
210
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.5k
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
640
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
120
新卒PdEのリアル
ryu1013
1
420
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
160
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
不幸な GC
chencmd
0
890
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
3
540
Webの地図
yosuke_furukawa
PRO
1
310
Featured
See All Featured
Evolving SEO for Evolving Search Engines
ryanjones
0
280
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Google's AI Overviews - The New Search
badams
0
1.6k
A Soul's Torment
seathinner
7
3.6k
The untapped power of vector embeddings
frankvandijk
2
1.9k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
650
Believing is Seeing
oripsolob
1
210
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
470
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
690
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