Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser.
while (true) {
processarEntradaUsuari();
actualitzarElementsJoc();
mostrarJoc();
}
while (true) {
processarEntradaUsuari();
actualitzarElementsJoc();
MostrarJoc();
for (i=1;i<1000;i++){}
}
var FPS = 60;
function gameLoop() {
processarEntradaUsuari();
actualitzarElementsJoc();
MostrarJoc();
}
setInterval(gameLoop, 1000/FPS);}
var FPS = 60;
function gameLoop() {
processarEntradaUsuari();
actualitzarElementsJoc();
MostrarJoc();
setTimeout(gameLoop, 1000/FPS);
}
gameLoop();
function gameLoop() {
processarEntradaUsuari();
actualitzarElementsJoc();
MostrarJoc();
}
requestAnimationFrame(gameLoop);
var FPS = 60;
var darreraCrida = new Date().getTime();
function gameLoop() {
processarEntradaUsuari();
actualitzarElementsJoc();
MostrarJoc();
var ara = new Date().getTime();
var seguentCrida = Math.max(0, 1000/FPS - (ara - darreraCrida));
setTimeout(gameLoop, seguentCrida);
darreraCrida = ara + seguentCrida;
}
gameLoop();
$sudo apt-get update
$sudo apt-get install curl
$curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
$sudo apt-get install -y nodejs
var game = new Phaser.Game(
800, /* Amplada del joc window.innerWidth fa que ocupi tot l'ample*/
600, /* Alçada del joc window.innerHeight fa que ocupi tot l'alt */
Phaser.AUTO, /* Renderer a fer servir (CANVAS o WEBGL) */
'', /* Element HTML on posa el canvas. Si no s'indica és <body>*/
{
init: ferInit, /* Codi per inicialitzar el joc*/
preload: ferPreload, /* Codi per carregar els elements gràfics*/
create: ferCreate, /* Codi per crear la situació inicial del joc*/
update: ferUpdate, /* Game Loop, codi que es repeteix a 60 FPS*/
render: ferRender /* Game Loop, després de dibuixar tots els elements*/
}
);
A Phaser aquestos callback van asociats a un estat del joc. En un joc hi pot haver diferents estats (nivells). Això permet alliberar recursos i anar carregant i descarregant els elements per fases.
var v1 = 0; /* GLOBAL*/
function f(){
v1=3; /* LOCAL (definida baix) */
var v1 = 2; /* LOCAL amaga la V.Global */
v2 = 3; /* GLOBAL implícitament */
}
/* Variables pel fons del joc*/
var fonsNebulosa, fonsPedres;
/* Crea el joc i associa les funcions de Callback*/
var game = new Phaser.Game(600, 800, Phaser.AUTO, '',
{preload: ferPreload, create: ferCreate, update: ferUpdate});
function ferPreload(){
/* Carrega els elements gràfics pel fons*/
game.load.image('nebulosa', 'assets/nebulosa.png');
game.load.image('pedres', 'assets/pedres.png');
}
function ferCreate(){
/* Posa el fons del joc*/
game.stage.backgroundColor = '#000000';
fonsNebulosa = game.add.tileSprite(0, 0,
game.width, game.height, 'nebulosa');
fonsPedres = game.add.tileSprite(0, 0,
game.width, game.height, 'pedres');
}
function ferUpdate(){
/* Mou cap cap a la dreta les pedres*/
fonsPedres.tilePosition.x += 0.5;
}
/* Variable per la nau*/
var nau;
function ferPreload(){
/* Carrega la imatge de la nau. Hi ha dos imatges: */
/*una quan acelera i l'altra amb els motors apagats*/
game.load.spritesheet('nau', 'assets/nau-x2.png', 90, 90);
}
function ferCreate(){
/* Inicialitza el motor de física ARCADE*/
game.physics.startSystem(Phaser.Physics.ARCADE);
/* Dibuixa la nau*/
nau = game.add.sprite(game.width / 2, game.height / 2, 'nau');
/* Indica el punt de referència de la nau*/
nau.anchor.x = 0.5;
nau.anchor.y = 0.5;
/* Associa el motor físic amb la nau per controlar-la*/
game.physics.enable(nau, Phaser.Physics.ARCADE);
/* Defineix el fregament de la nau*/
nau.body.drag.set(100);
nau.body.angularDrag = 200;
/* Defineix la màxima velocitat de la nau*/
nau.body.maxAngular = 200;
nau.body.maxVelocity.set(200);
}
A Phaser hi ha diferents punters per controlar tant el ratolí com els dispositius tàctils.
Als punters poden associar-se callbacks pels següents events. Els callback reben un paràmetre punter que és un objecte amb tota la informació sobre la posició clicada, tipus de punter, identificador....
Tot i que en aquest exemple no ho farem servir, també es poden associar callbacks a events produits sobre un sprite o sobre un botó. Els events als que podem associar callbacks són:
/* Variables per les tecles que controlen el joc*/
var acelerar, girarDreta, girarEsquerra, disparar;
function ferCreate() {
acelerar = game.input.keyboard.addKey(Phaser.Keyboard.UP);
acelerar.onDown.add(function() {
game.physics.arcade.accelerationFromRotation(
nau.rotation, 200, nau.body.acceleration
);
nau.frame = 1;
});
acelerar.onUp.add(function() {
nau.body.acceleration.set(0, 0);
nau.frame = 0;
});
girarDreta = game.input.keyboard.addKey(Phaser.Keyboard.RIGHT);
girarDreta.onDown.add(function() {
nau.body.angularAcceleration = 100;
});
girarDreta.onUp.add(function() {
nau.body.angularAcceleration = 0;
});
girarEsquerra = game.input.keyboard.addKey(Phaser.Keyboard.LEFT);
girarEsquerra.onDown.add(function() {
nau.body.angularAcceleration = -100;
});
girarEsquerra.onUp.add(function() {
nau.body.angularAcceleration = 0;
});
/* Evita que les tecles es propaguin al navegador*/
this.game.input.keyboard.addKeyCapture([Phaser.Keyboard.UP,
Phaser.Keyboard.RIGHT, Phaser.Keyboard.LEFT
]);
}
function ferUpdate() {
/* Verifica si la nau surt de la pantalla*/
surtPantalla(nau);
}
function surtPantalla(sprite) {
/* Comprova si surt horitzontalment*/
if (sprite.x < 0) {
sprite.x = game.width;
} else if (sprite.x > game.width) {
sprite.x = 0;
}
/* Comprova si surt verticalment*/
if (sprite.y < 0) {
sprite.y = game.height;
} else if (sprite.y > game.height) {
sprite.y = 0;
}
}
function ferPreload() {
/* Carrega la imatge de una bala*/
game.load.image('bala', 'assets/bala.png');
}
function ferCreate() {
/* Crea un conjunt de bales amb 30 bales*/
bales = game.add.group();
bales.enableBody = true;
bales.physicsBodyType = Phaser.Physics.ARCADE;
bales.createMultiple(30, 'bala');
bales.setAll('anchor.x', 0.5);
bales.setAll('anchor.y', 1);
/* Controla la tecla per disparar*/
disparar = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
disparar.onHoldCallback = function (e) {
if (game.time.now > seguentBala) {
bala = bales.getFirstExists(false); /* Reviu una bala*/
if (bala) {
bala.reset(nau.body.x + (nau.body.width / 2),
nau.body.y + (nau.body.height / 2));
bala.lifespan = 1000; /* Temps de vida (1seg)*/
bala.rotation = nau.rotation;
game.physics.arcade.velocityFromRotation(
nau.rotation, 400, bala.body.velocity);
seguentBala = game.time.now + 80; /* Espera 80ms*/
}
}
};
/* Evita que les tecles es propaguin al navegador*/
this.game.input.keyboard.addKeyCapture([Phaser.Keyboard.SPACEBAR]);
}
/* Variable pel conjunt d'asteroides*/
var asteroides;
/* Variable per demorar un temps fins el següent asteroide*/
var seguentAsteroide = 0;
function ferPreload() {
/* Carrega la imatge de un asteroide*/
game.load.image('asteroide', 'assets/asteroide.png');
}
function ferCreate() {
/* Crea conjunt d'asteroides amb 12 asteroides*/
asteroides = game.add.group();
asteroides.enableBody = true;
asteroides.physicsBodyType = Phaser.Physics.ARCADE;
asteroides.createMultiple(12, 'asteroide');
asteroides.setAll('anchor.x', 0.5);
asteroides.setAll('anchor.y', 0.5);
}
function ferUpdate() {
/* Comprova el temporitzador per crear un nou asteroide*/
if (game.time.now > seguentAsteroide && nau.alive) {
creaAsteroide();
}
/* Verifica que no surtin de la pantalla*/
asteroides.forEachExists(surtPantalla, this);
}
function creaAsteroide() {
var asteroide = asteroides.getFirstExists(false);
if (asteroide) {
/* Evita que l'asteroide surti massa prop de la nau*/
do {
asteroide.reset(game.rnd.integerInRange(0, game.width),
game.rnd.integerInRange(0, game.height));
} while (game.physics.arcade.distanceBetween(asteroide, nau) < 100);
asteroide.body.angularVelocity = game.rnd.integerInRange(-300, 300);
asteroide.body.velocity.setTo(game.rnd.integerInRange(-30, 60),
game.rnd.integerInRange(-30, 60));
seguentAsteroide = game.time.now + 1000;
}
}
/* Variable pel conjunt d'explosions*/
var explosions;
function ferPreload() {
/* Carrega la imatge per fer una explosió*/
game.load.spritesheet('explosio', 'assets/explosio.png', 128, 128);
}
function ferCreate() {
/* Crea conjunt d'explosions */
explosions = game.add.group();
explosions.createMultiple(12, 'explosio');
explosions.setAll('anchor.x', 0.5);
explosions.setAll('anchor.y', 0.5);
explosions.forEach(function (explosio) {
explosio.animations.add('explosio');
}, this);
}
function ferUpdate() {
/* Revisa les colisions entre el grup de bales i el grup d'asteroides*/
game.physics.arcade.overlap(bales, asteroides, function (bala, asteroide) {
/* Amaga la bala i l'asteroide*/
bala.kill();
asteroide.kill();
/* Crea una explosió*/
var explosio = explosions.getFirstExists(false);
explosio.reset(asteroide.body.x, asteroide.body.y);
explosio.play('explosio', 30, false, true);
explosio.kill;
/* Suma punts*/
punts += 10;
}, null, this);
}
/* Variable per comptar les vides que ens queden*/
var vides = 3;
function ferUpdate() {
/* Revisa les colisions entre nau i asteroides */
game.physics.arcade.overlap(nau, asteroides, function (nau, asteroide) {
/* Fa desapareixer l'asteroide*/
asteroide.kill();
/* Mostra una explosió*/
var explosio = explosions.getFirstExists(false);
explosio.reset(asteroide.body.x, asteroide.body.y);
explosio.play('explosio', 30, false, true);
vides--;
}, null, this);
}
var textPunts, textVides;
function ferCreate() {
/* Afegim la informació dels punts i les vides*/
textPunts = game.add.text(10, 10, "Punts: " + punts, {
font: '34px Arial',
fill: '#fff'
});
textVides = game.add.text(game.width-150, 10, "Vides: "+vides, {
font: '34px Arial',
fill: '#fff'
});
}
function ferUpdate() {
/* Afegim la informació dels punts i les vides*/
textPunts.text = "Punts: " + punts;
textVides.text = "Vides: " + vides;
}
function ferUpdate() {
/* Step_8 */
/* Revisa les colisions entre nau i asteroides */
game.physics.arcade.overlap(nau, asteroides, function (nau, asteroide) {
.......
/* Step_10 */
if (vides <= 0) {
textEstat = game.add.text(game.world.centerX,
game.world.centerY,
'GAME OVER',
{font: '30px Arial', fill: '#fff'}
);
textEstat.anchor.setTo(0.5, 0.5);
asteroides.callAll('kill');
nau.kill();
}
}, null, this);
}
/* Variables pels controls tàctils*/
var touchDreta, touchEsquerra,
cercleEsquerra, cercleDreta
touchEsquerraPosInicial = new Phaser.Point(0, 0);
function ferCreate() {
/* Step_11 */
/* Defineix els callbacks pels dispositius mòbils*/
if (game.device.desktop === false) {
game.input.onDown.add(function (punter) {
if (punter.pointerMode == 3 || punter.punterMode == Phaser.PointerMode.CONTACT) {
if (punter.positionDown.x < game.world.centerX && !touchEsquerra) {
touchEsquerra = punter;
touchEsquerraPosInicial.copyFrom(punter.positionDown);
} else if (punter.positionDown.x > 100 /*game.world.centerY*/ && !touchDreta) {
touchDreta = punter;
}
}
}, this);
game.input.onUp.add(function (punter) {
if (punter.pointerMode == 3 || punter.punterMode == Phaser.PointerMode.CONTACT) {
if (touchEsquerra && punter.id == touchEsquerra.id) {
touchEsquerra = null;
touchEsquerraPosInicial.setTo(0, 0);
} else if (touchDreta && punter.id == touchDreta.id) {
touchDreta = null;
}
}
}, this);
}
}
function ferUpdate() {
/* Step_11 */
/* Control tàctil*/
if (game.device.desktop === false) {
if (cercleEsquerra) {
cercleEsquerra.destroy();
}
if (cercleDreta) {
cercleDreta.destroy();
}
if (touchEsquerra) {
cercleEsquerra = game.add.graphics(0, 0);
cercleEsquerra.lineStyle(6, 0x00ff00);
cercleEsquerra.drawCircle(touchEsquerraPosInicial.x, touchEsquerraPosInicial.y, 40);
cercleEsquerra.lineStyle(2, 0x00ff00);
cercleEsquerra.drawCircle(touchEsquerraPosInicial.x, touchEsquerraPosInicial.y, 60);
/* Moviment de la nau*/
var distancia = touchEsquerraPosInicial.distance(touchEsquerra, true);
var angRad = touchEsquerraPosInicial.angle(touchEsquerra);
var angDeg = touchEsquerraPosInicial.angle(touchEsquerra, true);
if (distancia > 10) {
nau.rotation = angRad;
game.physics.arcade.velocityFromAngle(angDeg, distancia * 2, nau.body.velocity);
}
} else {
nau.body.acceleration.set(0);
nau.body.angularAcceleration = 0;
}
if (touchDreta) {
cercleDreta = game.add.graphics(0, 0);
cercleDreta.lineStyle(6, 0xff0000);
cercleDreta.drawCircle(touchDreta.x, touchDreta.y, 40);
cercleDreta.lineStyle(2, 0xff0000);
cercleDreta.drawCircle(touchDreta.x, touchDreta.y, 60);
dispararBala();
}
}
}
Phaser permet carregar diferents tipus de fitxers d'audio: mp3, ogg.. Ho fa mitjançant el objecte sound, que permet reproduïr audio. Al crear l'objecte hem d'indicar si volem que reprodueixi l'arxiu de forma contínua en un bucle (loop) o si només es reprodueix un cop.
Els principals mètodes del objecte Sound són
Les principals proietats del objecte Sound són:
/* Sons del joc*/
var musica_sound, accelera_sound, explota_sound;
function preload() {
/* Carrega els sons*/
game.load.audio('musica', 'assets/musica.ogg');
game.load.audio('accelera', 'assets/thrust.ogg');
game.load.audio('explosio', 'assets/explosio.ogg');
}
function create() {
/* Crea els elements d'audio */
musica_sound = game.add.audio('musica', 0.5, true);
accelera_sound = game.add.audio('accelera', 1, true);
explosio_sound = game.add.audio('explosio');
/* Step_3 */
/* Controla les tecles que gestionen el moviment de la nau */
acelerar = game.input.keyboard.addKey(Phaser.Keyboard.UP);
acelerar.onDown.add(function () {
if (!accelera_sound.isPlaying) {
accelera_sound.play();
}
});
acelerar.onUp.add(function () {
accelera_sound.stop();
});
/* Inicia la reproducció del fons musical */
musica_sound.play();
}
function ferUpdate() {
/* Step_7 */
/* Revisa les colisions entre el grup de bales i el grup d'asteroides */
game.physics.arcade.overlap(bales, asteroides, function (bala, asteroide) {
explosio_sound.play();
}, null, this);
/* Hem de fer el mateix al Step_8 */
}
Fes servir l'espai o les fletxes dels cursors per navegar