Yogurts-Quest/html/src/Player.ts

107 lines
2.6 KiB
TypeScript
Executable File

class Player extends Phaser.GameObjects.Sprite {
velX: number;
velY: number;
rawX: number;
rawY: number;
ground: Ground[];
constructor(scene: Phaser.Scene, x: number, y: number, groundBits: Ground[]) {
super(scene, x, y, "player", 0);
this.rawX = x;
this.rawY = y;
this.velX = 0;
this.velY = 0;
this.ground = groundBits;
this.scene.anims.create({
key: 'run',
frames: this.scene.anims.generateFrameNumbers('player', {start: 0, end: 4}),
frameRate: 15,
repeat: -1
});
this.scene.anims.create({
key: 'idle',
frames: [{key: "player", frame: 0}, {key: "player", frame: 5}, {key: "player", frame: 6}],
frameRate: 3,
repeat: -1
});
this.anims.play('idle');
this.setScale(4, 4);
this.setOrigin(0.5, 0);
this.scene.add.existing(this);
}
preUpdate(time: number, delta: number) {
super.preUpdate(time, delta);
for (let i = 0; i < Math.abs(this.velX); i++) {
if (!this.collides(this.rawX + this.sin(this.velX), this.rawY)) {
this.rawX += this.sin(this.velX);
}
}
for (let i = 0; i < Math.abs(this.velY); i++) {
if (!this.collides(this.rawX, this.rawY + this.sin(this.velY))) {
this.rawY += this.sin(this.velY);
}
else {
if (this.velY < 0) this.velY = 0;
}
}
if (this.collides(this.rawX, this.rawY + 1)) this.velY = 0;
else this.velY = Math.min(this.velY + 1, 16);
this.x = Math.round(this.rawX / 4) * 4;
this.y = Math.round(this.rawY / 4) * 4;
if (this.velX == 0) {
if (this.anims.currentAnim.key != "idle") this.anims.play('idle');
}
else {
if (this.anims.currentAnim.key != "run") this.anims.play('run');
}
if (this.velX < 0) this.scaleX = -4;
if (this.velX > 0) this.scaleX = 4;
this.velX = Math.max(0, Math.abs(this.velX) - 0.25) * (this.velX < 0 ? -1 : 1);
}
moveLeft(): void {
this.velX = Math.max(this.velX - 1, this.collides(this.rawX, this.rawY + 1) ? -6 : -6);
}
moveRight(): void {
this.velX = Math.min(this.velX + 1, this.collides(this.rawX, this.rawY + 1) ? 6 : 6);
}
jump(): void {
if (this.collides(this.rawX, this.rawY + 1)) {
this.velY = -16;
}
}
collides(x: number, y: number): boolean {
for (let bit of this.ground) {
if (Math.abs(bit.x - x) > 1200) continue;
for (let i = -24; i < 24; i += 4) {
for (let j = 12; j < 60; j += 4) {
let collides = bit.collidesAt(x + i, y + j);
if (collides == 1) return true;
if (collides == 2) { this.scene.scene.restart(); return true; }
}
}
}
return false;
}
sin(num: number): number {
if (num < 0) return -1;
if (num > 0) return 1;
return 0;
}
}