Taking what was done in the LoginScene regarding character selection and putting it in its own scene. Also, making character selection possible via the keyboard.
107 lines
4.3 KiB
TypeScript
107 lines
4.3 KiB
TypeScript
import {PlayerAnimationNames} from "../Player/Animation";
|
|
import {SpeechBubble} from "./SpeechBubble";
|
|
import BitmapText = Phaser.GameObjects.BitmapText;
|
|
|
|
export const PLAYER_RESOURCES: Array<any> = [
|
|
{name: "male1", img: "resources/characters/pipoya/Male 01-1.png" /*, x: 32, y: 32*/},
|
|
{name: "male2", img: "resources/characters/pipoya/Male 02-2.png"/*, x: 64, y: 32*/},
|
|
{name: "male3", img: "resources/characters/pipoya/Male 03-4.png"/*, x: 96, y: 32*/},
|
|
{name: "male4", img: "resources/characters/pipoya/Male 09-1.png"/*, x: 128, y: 32*/},
|
|
|
|
{name: "male5", img: "resources/characters/pipoya/Male 10-3.png"/*, x: 32, y: 64*/},
|
|
{name: "male6", img: "resources/characters/pipoya/Male 17-2.png"/*, x: 64, y: 64*/},
|
|
{name: "male7", img: "resources/characters/pipoya/Male 18-1.png"/*, x: 96, y: 64*/},
|
|
{name: "male8", img: "resources/characters/pipoya/Male 16-4.png"/*, x: 128, y: 64*/},
|
|
|
|
{name: "Female1", img: "resources/characters/pipoya/Female 01-1.png"/*, x: 32, y: 96*/},
|
|
{name: "Female2", img: "resources/characters/pipoya/Female 02-2.png"/*, x: 64, y: 96*/},
|
|
{name: "Female3", img: "resources/characters/pipoya/Female 03-4.png"/*, x: 96, y: 96*/},
|
|
{name: "Female4", img: "resources/characters/pipoya/Female 09-1.png"/*, x: 128, y: 96*/},
|
|
|
|
{name: "Female5", img: "resources/characters/pipoya/Female 10-3.png"/*, x: 32, y: 128*/},
|
|
{name: "Female6", img: "resources/characters/pipoya/Female 17-2.png"/*, x: 64, y: 128*/},
|
|
{name: "Female7", img: "resources/characters/pipoya/Female 18-1.png"/*, x: 96, y: 128*/},
|
|
{name: "Female8", img: "resources/characters/pipoya/Female 16-4.png"/*, x: 128, y: 128*/}
|
|
];
|
|
|
|
export class PlayableCaracter extends Phaser.Physics.Arcade.Sprite {
|
|
private bubble: SpeechBubble;
|
|
private readonly playerName: BitmapText;
|
|
public PlayerValue: string;
|
|
public PlayerTexture: string;
|
|
|
|
|
|
constructor(scene: Phaser.Scene, x: number, y: number, texture: string, name: string, frame?: string | number) {
|
|
super(scene, x, y, texture, frame);
|
|
|
|
this.PlayerValue = name;
|
|
this.PlayerTexture = texture;
|
|
this.playerName = new BitmapText(scene, x, y - 25, 'main_font', name, 8);
|
|
this.playerName.setOrigin(0.5).setCenterAlign().setDepth(99999);
|
|
scene.add.existing(this.playerName);
|
|
|
|
this.scene.sys.updateList.add(this);
|
|
this.scene.sys.displayList.add(this);
|
|
//this.setScale(2);
|
|
this.scene.physics.world.enableBody(this);
|
|
this.setImmovable(true);
|
|
this.setCollideWorldBounds(true);
|
|
this.setSize(16, 16); //edit the hitbox to better match the character model
|
|
this.setOffset(8, 16);
|
|
this.setDepth(-1);
|
|
|
|
this.scene.events.on('postupdate', this.postupdate.bind(this));
|
|
}
|
|
|
|
move(x: number, y: number) {
|
|
|
|
this.setVelocity(x, y);
|
|
|
|
// up or down animations are prioritized over left and right
|
|
if (this.body.velocity.y < 0) { //moving up
|
|
this.play(`${this.PlayerTexture}-${PlayerAnimationNames.WalkUp}`, true);
|
|
} else if (this.body.velocity.y > 0) { //moving down
|
|
this.play(`${this.PlayerTexture}-${PlayerAnimationNames.WalkDown}`, true);
|
|
} else if (this.body.velocity.x > 0) { //moving right
|
|
this.play(`${this.PlayerTexture}-${PlayerAnimationNames.WalkRight}`, true);
|
|
} else if (this.body.velocity.x < 0) { //moving left
|
|
this.anims.playReverse(`${this.PlayerTexture}-${PlayerAnimationNames.WalkLeft}`, true);
|
|
}
|
|
|
|
if (this.bubble) {
|
|
this.bubble.moveBubble(this.x, this.y);
|
|
}
|
|
|
|
//update depth user
|
|
this.setDepth(this.y);
|
|
}
|
|
|
|
postupdate(time: number, delta: number) {
|
|
//super.update(delta);
|
|
this.playerName.setPosition(this.x, this.y - 25);
|
|
}
|
|
|
|
stop(){
|
|
this.setVelocity(0, 0);
|
|
this.anims.stop();
|
|
}
|
|
|
|
say(text: string) {
|
|
if (this.bubble) return;
|
|
this.bubble = new SpeechBubble(this.scene, this, text)
|
|
//todo make the bubble destroy on player movement?
|
|
setTimeout(() => {
|
|
this.bubble.destroy();
|
|
this.bubble = null;
|
|
}, 3000)
|
|
}
|
|
|
|
destroy(fromScene?: boolean): void {
|
|
if (this.scene) {
|
|
this.scene.events.removeListener('postupdate', this.postupdate.bind(this));
|
|
}
|
|
super.destroy(fromScene);
|
|
this.playerName.destroy();
|
|
}
|
|
}
|