Files
2024-10-27 18:43:35 +01:00

534 lines
18 KiB
JavaScript

/*
* SUNNY LAND Demo Code
* @copyright 2017 Ansimuz
* @license {@link https://opensource.org/licenses/MIT | MIT License}
* Get free assets and code at: www.pixelgameart.org
* */
var game;
var background;
var middleground;
var gameWidth = 288;
var gameHeight = 192;
var hurtFlag = false;
var hurtTimer;
var frogTimer;
var frogJumpSide = 'left';
window.onload = function () {
game = new Phaser.Game(gameWidth, gameHeight, Phaser.AUTO, "");
game.state.add('Boot', boot);
game.state.add('Preload', preload);
game.state.add('TitleScreen', titleScreen);
game.state.add('PlayGame', playGame);
//
game.state.start("Boot");
}
var boot = function (game) {
};
boot.prototype = {
preload: function () {
this.game.load.image('loading', 'assets/sprites/loading.png');
},
create: function () {
game.scale.pageAlignHorizontally = true;
game.scale.pageAlignVertically = true;
game.scale.scaleMode = Phaser.ScaleManager.SHOW_ALL;
game.renderer.renderSession.roundPixels = true; // no blurring
this.game.state.start('Preload');
}
}
var preload = function (game) {
};
preload.prototype = {
preload: function () {
var loadingBar = this.add.sprite(game.width / 2, game.height / 2, 'loading');
loadingBar.anchor.setTo(0.5);
game.load.setPreloadSprite(loadingBar);
// load title screen
game.load.image('title', 'assets/sprites/title-screen.png');
game.load.image('enter', 'assets/sprites/press-enter-text.png');
game.load.image('credits', 'assets/sprites/credits-text.png');
game.load.image('instructions', 'assets/sprites/instructions.png');
// environment
game.load.image('background', 'assets/environment/back.png');
game.load.image('middleground', 'assets/environment/middle.png');
//tileset
game.load.image('tileset', 'assets/environment/tileset.png');
game.load.tilemap('map', 'assets/maps/map.json', null, Phaser.Tilemap.TILED_JSON);
// atlas sprites
game.load.atlasJSONArray('atlas', 'assets/atlas/atlas.png', 'assets/atlas/atlas.json');
game.load.atlasJSONArray('atlas-props', 'assets/atlas/atlas-props.png', 'assets/atlas/atlas-props.json');
//
game.load.audio('music', ['assets/sound/platformer_level03_loop.ogg']);
},
create: function () {
this.game.state.start('TitleScreen');
}
}
var titleScreen = function (game) {
};
titleScreen.prototype = {
create: function () {
background = game.add.tileSprite(0, 0, gameWidth, gameHeight, 'background');
middleground = game.add.tileSprite(0, 80, gameWidth, gameHeight, 'middleground');
this.title = game.add.image(game.width / 2, 70, 'title');
this.title.anchor.setTo(0.5, 0);
var credits = game.add.image(game.width / 2, game.height - 10, 'credits');
credits.anchor.setTo(0.5, 1);
this.pressEnter = game.add.image(game.width / 2, game.height - 35, 'enter');
this.pressEnter.anchor.setTo(0.5, 1);
var startKey = game.input.keyboard.addKey(Phaser.Keyboard.ENTER);
startKey.onDown.add(this.startGame, this);
game.time.events.loop(700, this.blinkText, this);
this.state = 1;
},
blinkText: function () {
if (this.pressEnter.alpha) {
this.pressEnter.alpha = 0;
} else {
this.pressEnter.alpha = 1;
}
}
,
update: function () {
background.tilePosition.x -= .3;
middleground.tilePosition.x -= .6;
},
startGame: function () {
if (this.state == 1) {
this.state = 2;
this.title2 = game.add.image(game.width / 2, 0, 'instructions');
this.title2.anchor.setTo(0.5, 0);
this.title.destroy();
} else {
this.game.state.start('PlayGame');
}
}
}
var playGame = function (game) {
};
playGame.prototype = {
create: function () {
this.createBackgrounds();
this.createWorld();
this.decorWorld();
this.createPlayer(54, 9);
this.bindKeys();
game.camera.follow(this.player, Phaser.Camera.FOLLOW_PLATFORMER);
this.populateWorld();
// music
this.music = game.add.audio('music');
this.music.loop = true;
this.music.play();
},
bindKeys: function () {
this.wasd = {
jump: game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR),
left: game.input.keyboard.addKey(Phaser.Keyboard.LEFT),
right: game.input.keyboard.addKey(Phaser.Keyboard.RIGHT),
crouch: game.input.keyboard.addKey(Phaser.Keyboard.DOWN)
}
game.input.keyboard.addKeyCapture(
[Phaser.Keyboard.SPACEBAR,
Phaser.Keyboard.LEFT,
Phaser.Keyboard.RIGHT,
Phaser.Keyboard.DOWN]
);
},
decorWorld: function () {
game.add.image(31 * 16, 4 * 16 + 3, 'atlas-props', 'tree');
game.add.image(48 * 16, 3 * 16 + 5, 'atlas-props', 'house');
game.add.image(10 * 16, 8 * 16 + 4, 'atlas-props', 'bush');
game.add.image(11 * 16, 19 * 16 - 4, 'atlas-props', 'sign');
game.add.image(15 * 16, 19 * 16 + 6, 'atlas-props', 'skulls');
game.add.image(23 * 16, 19 * 16, 'atlas-props', 'face-block');
game.add.image(28 * 16, 20 * 16, 'atlas-props', 'shrooms');
},
populateWorld: function () {
// groups
this.enemies = game.add.group();
this.enemies.enableBody = true;
//
this.items = game.add.group();
this.items.enableBody = true;
//timer for frog jumps
frogTimer = game.time.create(false);
frogTimer.loop(2000, this.switchFrogJump, this);
frogTimer.start();
// create items
this.createCherry(30, 5);
this.createCherry(31, 5);
this.createCherry(32, 5);
//
this.createCherry(23, 17);
this.createCherry(24, 17);
this.createCherry(25, 17);
//
this.createGem(3, 6);
this.createGem(4, 6);
this.createGem(5, 6);
//
this.createGem(44, 12);
this.createGem(42, 13);
this.createGem(42, 16);
// create enemies
this.createFrog(15, 9);
this.createFrog(30, 20);
this.createEagle(33, 6);
this.createEagle(6, 7);
this.createOpossum(42, 9);
this.createOpossum(23, 20);
},
switchFrogJump: function () {
frogJumpSide = (frogJumpSide == 'left') ? 'right' : 'left';
},
createBackgrounds: function () {
this.background = game.add.tileSprite(0, 0, gameWidth, gameHeight, 'background');
this.middleground = game.add.tileSprite(0, 80, gameWidth, gameHeight, 'middleground');
this.background.fixedToCamera = true;
this.middleground.fixedToCamera = true;
},
createWorld: function () {
// tilemap
this.map = game.add.tilemap('map');
this.map.addTilesetImage('tileset');
this.layer = this.map.createLayer('Tile Layer 1');
this.layer.resizeWorld();
// which tiles collide
this.map.setCollision([27, 29, 31, 33, 35, 37, 77, 81, 86, 87, 127, 129, 131, 133, 134, 135, 83, 84, 502, 504, 505, 529, 530, 333, 335, 337, 339, 366, 368, 262, 191, 193, 195, 241, 245, 291, 293, 295,]);
// set some tiles one way collision
this.setTopCollisionTiles(35);
this.setTopCollisionTiles(36);
this.setTopCollisionTiles(84);
this.setTopCollisionTiles(86);
this.setTopCollisionTiles(134);
this.setTopCollisionTiles(135);
this.setTopCollisionTiles(366);
this.setTopCollisionTiles(367);
this.setTopCollisionTiles(368);
this.setTopCollisionTiles(262);
},
setTopCollisionTiles: function (tileIndex) {
var x, y, tile;
for (x = 0; x < this.map.width; x++) {
for (y = 1; y < this.map.height; y++) {
tile = this.map.getTile(x, y);
if (tile !== null) {
if (tile.index == tileIndex) {
tile.setCollision(false, false, true, false);
}
}
}
}
},
createPlayer: function (x, y) {
x *= 16;
y *= 16;
this.player = game.add.sprite(x, y, 'atlas', 'player/idle/player-idle-1');
this.player.anchor.setTo(0.5);
game.physics.arcade.enable(this.player);
this.player.body.gravity.y = 500;
this.player.body.setSize(12, 16, 8, 16);
//add animations
var animVel = 15;
this.player.animations.add('idle', Phaser.Animation.generateFrameNames('player/idle/player-idle-', 1, 4, '', 0), animVel - 3, true);
this.player.animations.add('run', Phaser.Animation.generateFrameNames('player/run/player-run-', 1, 6, '', 0), animVel, true);
this.player.animations.add('jump', ['player/jump/player-jump-1'], 1, false);
this.player.animations.add('fall', ['player/jump/player-jump-2'], 1, false);
this.player.animations.add('crouch', Phaser.Animation.generateFrameNames('player/crouch/player-crouch-', 1, 2, '', 0), 10, true);
this.player.animations.add('hurt', Phaser.Animation.generateFrameNames('player/hurt/player-hurt-', 1, 2, '', 0), animVel, true);
this.player.animations.play('idle');
// timer
hurtTimer = game.time.create(false);
hurtTimer.loop(500, this.resetHurt, this);
},
createEnemyDeath: function (x, y) {
this.enemyDeath = game.add.sprite(x, y, 'atlas');
this.enemyDeath.anchor.setTo(0.5);
this.animDeath = this.enemyDeath.animations.add('dead', Phaser.Animation.generateFrameNames('enemy-death/enemy-death-', 1, 6, '', 0), 16, false);
this.enemyDeath.animations.play('dead');
this.animDeath.onComplete.add(function () {
this.enemyDeath.kill();
}, this);
},
createItemFeedback: function (x, y) {
var itemFeedback = game.add.sprite(x, y, 'atlas');
itemFeedback.anchor.setTo(0.5);
var animFeedback = itemFeedback.animations.add('feedback', Phaser.Animation.generateFrameNames('item-feedback/item-feedback-', 1, 4, '', 0), 16, false);
itemFeedback.animations.play('feedback');
animFeedback.onComplete.add(function () {
itemFeedback.kill();
}, this);
},
resetHurt: function () {
hurtFlag = false;
},
createOpossum: function (x, y) {
x *= 16;
y *= 16;
var temp = game.add.sprite(x, y, 'atlas', 'opossum/opossum-1');
temp.anchor.setTo(0.5);
game.physics.arcade.enable(temp);
temp.body.gravity.y = 500;
temp.body.setSize(16, 13, 8, 15);
//add animations
temp.animations.add('run', Phaser.Animation.generateFrameNames('opossum/opossum-', 1, 6, '', 0), 12, true);
temp.animations.play('run');
temp.body.velocity.x = 60 * game.rnd.pick([1, -1]);
temp.body.bounce.x = 1;
temp.enemyType = 'opossum';
this.enemies.add(temp);
},
createEagle: function (x, y) {
x *= 16;
y *= 16;
var temp = game.add.sprite(x, y, 'atlas', 'eagle/eagle-attack-1');
temp.anchor.setTo(0.5);
game.physics.arcade.enable(temp);
temp.body.setSize(16, 13, 8, 20);
//add animations
temp.animations.add('attack', Phaser.Animation.generateFrameNames('eagle/eagle-attack-', 1, 4, '', 0), 12, true);
temp.animations.play('attack');
// tweens
var VTween = game.add.tween(temp).to({
y: y + 50
}, 1000, Phaser.Easing.Linear.None, true, 0, -1);
VTween.yoyo(true);
temp.enemyType = 'eagle';
this.enemies.add(temp);
},
createFrog: function (x, y) {
x *= 16;
y *= 16;
var temp = game.add.sprite(x, y, 'atlas', 'frog/idle/frog-idle-1');
temp.anchor.setTo(0.5);
game.physics.arcade.enable(temp);
temp.body.gravity.y = 500;
temp.body.setSize(16, 16, 8, 11);
//add animations
temp.animations.add('idle', Phaser.Animation.generateFrameNames('frog/idle/frog-idle-', 1, 4, '', 0), 6, true);
temp.animations.add('jump', ['frog/jump/frog-jump-1'], 6, false);
temp.animations.add('fall', ['frog/jump/frog-jump-2'], 6, false);
temp.animations.play('idle');
temp.enemyType = 'frog';
temp.side = 'right';
this.enemies.add(temp);
},
createCherry: function (x, y) {
x *= 16;
y *= 16;
var temp = game.add.sprite(x, y, 'atlas', 'cherry/cherry-1');
temp.anchor.setTo(0.5);
game.physics.arcade.enable(temp);
//add animations
temp.animations.add('idle', Phaser.Animation.generateFrameNames('cherry/cherry-', 1, 7, '', 0), 12, true);
temp.animations.play('idle');
this.items.add(temp);
},
createGem: function (x, y) {
x *= 16;
y *= 16;
var temp = game.add.sprite(x, y, 'atlas', 'gem/gem-1');
temp.anchor.setTo(0.5);
game.physics.arcade.enable(temp);
//add animations
temp.animations.add('idle', Phaser.Animation.generateFrameNames('gem/gem-', 1, 5, '', 0), 12, true);
temp.animations.play('idle');
this.items.add(temp);
},
update: function () {
//this.debugGame();
game.physics.arcade.collide(this.player, this.layer);
game.physics.arcade.collide(this.enemies, this.layer);
game.physics.arcade.overlap(this.player, this.enemies, this.checkAgainstEnemies, null, this);
game.physics.arcade.overlap(this.player, this.items, this.pickItem, null, this);
this.movePlayer();
this.enemiesManager();
this.parallaxBackground();
},
pickItem: function (player, item) {
this.createItemFeedback(item.x, item.y);
item.kill();
},
enemiesManager: function () {
for (var i = 0, len = this.enemies.children.length; i < len; i++) {
var tempEnemy = this.enemies.children[i];
// opossum
if (tempEnemy.enemyType == 'opossum') {
if (tempEnemy.body.velocity.x < 0) {
tempEnemy.scale.x = 1;
} else {
tempEnemy.scale.x = -1;
}
}
// eagle
if (tempEnemy.enemyType == 'eagle') {
if (tempEnemy.x > this.player.x) {
tempEnemy.scale.x = 1;
} else {
tempEnemy.scale.x = -1;
}
}
// frog
if (tempEnemy.enemyType == 'frog') {
if (tempEnemy.side == 'left' && frogJumpSide == 'right') {
tempEnemy.scale.x = 1;
tempEnemy.side = 'right';
tempEnemy.body.velocity.y = -200;
tempEnemy.body.velocity.x = -100;
} else if (tempEnemy.side == 'right' && frogJumpSide == 'left') {
tempEnemy.scale.x = -1;
tempEnemy.side = 'left';
tempEnemy.body.velocity.y = -200;
tempEnemy.body.velocity.x = 100;
} else if (tempEnemy.body.onFloor()) {
tempEnemy.body.velocity.x = 0;
}
// animations
if (tempEnemy.body.velocity.y < 0) {
tempEnemy.animations.play('jump');
} else if (tempEnemy.body.velocity.y > 0) {
tempEnemy.animations.play('fall');
} else {
tempEnemy.animations.play('idle');
}
}
}
},
checkAgainstEnemies: function (player, enemy) {
if ((player.y + player.body.height * .5 < enemy.y ) && player.body.velocity.y > 0) {
this.createEnemyDeath(enemy.x, enemy.y);
enemy.kill();
player.body.velocity.y = -200;
} else {
this.hurtPlayer();
}
},
hurtPlayer: function () {
if (hurtFlag) {
return;
}
hurtFlag = true;
hurtTimer.start();
this.player.body.velocity.y = -100;
this.player.body.velocity.x = (this.player.scale.x == 1) ? -100 : 100;
},
parallaxBackground: function () {
this.background.tilePosition.x = this.layer.x * -0.1;
this.middleground.tilePosition.x = this.layer.x * -0.5;
},
debugGame: function () {
//game.debug.spriteInfo(this.player, 30, 30);
//game.debug.body(this.enemies);
game.debug.body(this.player);
this.enemies.forEachAlive(this.renderGroup, this);
this.items.forEachAlive(this.renderGroup, this);
},
renderGroup: function (member) {
game.debug.body(member);
},
movePlayer: function () {
if (hurtFlag) {
this.player.animations.play('hurt');
return;
}
if (this.wasd.jump.isDown && this.player.body.onFloor()) {
this.player.body.velocity.y = -170;
}
var vel = 150;
if (this.wasd.left.isDown) {
this.player.body.velocity.x = -vel;
this.player.animations.play('run');
this.player.scale.x = -1;
} else if (this.wasd.right.isDown) {
this.player.body.velocity.x = vel;
this.player.animations.play('run');
this.player.scale.x = 1;
} else {
this.player.body.velocity.x = 0;
if (this.wasd.crouch.isDown) {
this.player.animations.play('crouch');
} else {
this.player.animations.play('idle');
}
}
// jump animation
if (this.player.body.velocity.y < 0) {
this.player.animations.play('jump');
} else if (this.player.body.velocity.y > 0) {
this.player.animations.play('fall');
}
}
}