Created
July 15, 2024 20:10
-
-
Save samme/f2683a542c98b4f5010f195ead8a6852 to your computer and use it in GitHub Desktop.
Magic Cliffs <https://samme.itch.io/magic-cliffs>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Phaser from 'phaser'; | |
const playerPositions = { | |
1: { x: 112, y: 112 }, | |
2: { x: 1376, y: 160 }, | |
3: { x: 2000, y: 48 }, | |
4: { x: 2176, y: 144 }, | |
}; | |
export class GameScene extends Phaser.Scene { | |
constructor() { | |
super({ | |
key: 'game', | |
physics: { | |
arcade: { | |
debug: false, | |
fps: 60, | |
gravity: { | |
y: 512, | |
}, | |
}, | |
}, | |
plugins: ['InputPlugin'], | |
}); | |
} | |
create() { | |
const { add, cameras, input, physics } = this; | |
const { keyboard } = input; | |
// Bg, Fg | |
add | |
.image(-896, 0, 'bg') | |
.setOrigin(0, 0) | |
.setAlpha(1) | |
.setScrollFactor(0.5, 0.5); | |
add.image(0, 0, 'fg').setOrigin(0, 0).setDepth(2); | |
// Zones | |
const zones = []; | |
for (const [x, y, width, height] of [ | |
[64, 112, 80, 48], | |
[224, 160, 1184, 80], | |
[144, 208, 48, 32], | |
[1536, 256, 496, 48], | |
[1952, 48, 112, 40], | |
[2160, 144, 16, 16], | |
[2256, 144, 32, 16], | |
]) { | |
const zone = add.zone(x, y, width, height).setOrigin(0, 0); | |
physics.add.existing(zone, true); | |
zones.push(zone); | |
} | |
// Player | |
this.player = this.physics.add | |
.sprite(560, 120, 'sprites', 'idle1') | |
.setOrigin(0.5, 1) | |
.setDepth(1) | |
.on('animationupdate', this.onPlayerAnimationUpdate, this) | |
.play('idle'); | |
this.player.body.setSize(16, 32, false).setOffset(56, 16); | |
// Sword | |
this.sword = this.add.zone(0, 0, 32, 16).setOrigin(0.5, 1); | |
this.physics.add.existing(this.sword); | |
this.sword.body.moves = false; | |
// Fox | |
this.fox = this.physics.add | |
.sprite(1320, 160, 'sprites', 'fox1') | |
.setOrigin(0.5, 1) | |
.play('fox'); | |
this.fox.body | |
.setSize(48, 16, false) | |
.setOffset(16, 32) | |
.setCollideWorldBounds(true, 1, 1) | |
.setBoundsRectangle(new Phaser.Geom.Rectangle(224, 0, 1184, 288)) | |
.setVelocityX(160); | |
// Guy | |
this.guy = this.physics.add | |
.sprite(1784, 256, 'sprites', 'dude1') | |
.setOrigin(0.5, 1) | |
.play('dudeIdle') | |
.setFlipX(true) | |
.on('animationupdate', this.onDudeAnimationUpdate, this) | |
.on('animationcomplete', this.onDudeAnimationComplete, this); | |
this.guy.body.setSize(16, 48, false).setOffset(32, 16); | |
// Star | |
this.star = this.physics.add | |
.sprite(0, 0, 'sprites', 'shuriken1') | |
.play('shuriken') | |
.disableBody(true, true); | |
this.star.body.allowGravity = false; | |
// Camera | |
cameras.main.startFollow(this.player, true).setBounds(0, 0, 2512, 304); | |
// Collisions | |
this.physics.add.collider([this.player, this.fox, this.guy], zones); | |
this.physics.add.overlap(this.star, zones, this.onStarHitTerrain); | |
this.physics.add.overlap(this.star, this.player, this.onStarHitPlayer); | |
this.physics.add.overlap(this.sword, this.guy, this.onSwordHitGuy); | |
// Keyboard | |
this.cursors = keyboard.createCursorKeys(); | |
this.attackKey = keyboard.addKey('Z'); | |
keyboard | |
.on('keydown-R', this.restart, this) | |
.on('keydown-T', this.teleport, this) | |
.on('keydown-ONE', this.teleport, this) | |
.on('keydown-TWO', this.teleport, this) | |
.on('keydown-THREE', this.teleport, this) | |
.on('keydown-FOUR', this.teleport, this); | |
} | |
update() { | |
const { attackKey } = this; | |
const { left, right, up, down, shift } = this.cursors; | |
const { anims, body } = this.player; | |
const { velocity } = this.player.body; | |
const currentAnim = anims.getName(); | |
this.fox.flipX = this.fox.body.velocity.x < 0; | |
if ( | |
anims.isPlaying && | |
(currentAnim === 'attack' || anims.getName() === 'hurt') | |
) { | |
return; | |
} | |
if (velocity.x > 0) this.player.flipX = false; | |
else if (velocity.x < 0) this.player.flipX = true; | |
if (this.player.body.onFloor()) { | |
if (attackKey.isDown) { | |
velocity.x = 0; | |
anims.play('attack'); | |
return; | |
} | |
if (left.isDown) { | |
velocity.x = -128; | |
anims.play('run', true); | |
} else if (right.isDown) { | |
velocity.x = 128; | |
anims.play('run', true); | |
} else { | |
velocity.x = 0; | |
anims.play('idle', true); | |
} | |
if (up.isDown) { | |
velocity.y = -256; | |
} | |
if (shift.isDown) { | |
velocity.x *= 1.5; | |
velocity.y *= 1.5; | |
} | |
} else { | |
if (down.isDown && body.wasTouching.down) { | |
velocity.x = 0; | |
velocity.y = 64; | |
} | |
if (velocity.y < 0) { | |
this.player.play('jump', true); | |
} else { | |
this.player.play('fall', true); | |
} | |
} | |
} | |
hurtPlayer() { | |
this.player.play('hurt').setVelocityX(0); | |
} | |
onDudeAnimationComplete(anim, animFrame, sprite, frameName) { | |
if (anim.key === 'dudeIdle') { | |
const dx = sprite.x - this.player.x; | |
const dy = sprite.y - this.player.y; | |
if (Math.abs(dx) <= 192 && Math.abs(dy) <= 32) { | |
sprite.flipX = sprite.x < this.player.x; | |
sprite.play('dudeThrow'); | |
} else { | |
sprite.play('dudeIdle'); | |
} | |
} else { | |
sprite.play('dudeIdle'); | |
} | |
} | |
onDudeAnimationUpdate(anim, animFrame, sprite, frameName) { | |
if (frameName === 'dude6') { | |
this.throwStar(); | |
} | |
} | |
onPlayerAnimationUpdate(anim, animFrame, sprite, frameName) { | |
if (frameName === 'attack5') { | |
const x = sprite.x + (sprite.flipX ? -32 : 32); | |
const y = sprite.y - 16; | |
this.sword.body.enable = true; | |
this.sword.body.reset(x, y); | |
} else if (frameName === 'attack6') { | |
const x = sprite.x + (sprite.flipX ? 16 : -16); | |
const y = sprite.y - 32; | |
this.sword.body.enable = true; | |
this.sword.body.reset(x, y); | |
} else { | |
this.sword.body.enable = false; | |
} | |
} | |
onStarHitTerrain(star) { | |
star.disableBody(true, true); | |
} | |
onStarHitPlayer(star, player) { | |
player.play('hurt').setVelocityX(0.5 * star.body.velocity.x); | |
star.disableBody(true, true); | |
} | |
onSwordHitGuy(sword, guy) { | |
guy.active = false; | |
guy.body.checkCollision.none = true; | |
} | |
throwStar() { | |
const { flipX } = this.guy; | |
const x = this.guy.x + (flipX ? 32 : -32); | |
const y = this.guy.y - 32; | |
this.star | |
.enableBody(true, x, y, true, true) | |
.setVelocityX(flipX ? 256 : -256); | |
} | |
restart() { | |
this.scene.restart(); | |
} | |
teleport(event) { | |
const { x, y } = playerPositions[event.key]; | |
this.player.enableBody(true, x, y).play('idle'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment