ShatteredSword/src/_DemoClasses/Player/PlayerStates/Platformer/Jump.ts
2020-12-21 12:32:32 -05:00

112 lines
3.3 KiB
TypeScript

import Vec2 from "../../../../DataTypes/Vec2";
import GameEvent from "../../../../Events/GameEvent";
import AnimatedSprite from "../../../../Nodes/Sprites/AnimatedSprite";
import { EaseFunctionType } from "../../../../Utils/EaseFunctions";
import MathUtils from "../../../../Utils/MathUtils";
import { CustomGameEventType } from "../../../CustomGameEventType";
import Level1, { MarioEvents } from "../../../Mario/Level1";
import { PlayerStates } from "./PlayerController";
import PlayerState from "./PlayerState";
export default class Jump extends PlayerState {
owner: AnimatedSprite;
onEnter(): void {
this.owner.animation.play("JUMP", true);
}
handleInput(event: GameEvent): void {}
update(deltaT: number): void {
super.update(deltaT);
if(this.owner.collidedWithTilemap && this.owner.onCeiling){
// We collided with a tilemap above us. First, get the tile right above us
let pos = this.owner.position.clone();
// Go up plus some extra
pos.y -= (this.owner.collisionShape.halfSize.y + 10);
pos.x -= 16;
let rowCol = this.parent.tilemap.getColRowAt(pos);
let tile1 = this.parent.tilemap.getTileAtRowCol(rowCol);
pos.x += 16;
rowCol = this.parent.tilemap.getColRowAt(pos);
let tile2 = this.parent.tilemap.getTileAtRowCol(rowCol);
pos.x += 16;
rowCol = this.parent.tilemap.getColRowAt(pos);
let tile3 = this.parent.tilemap.getTileAtRowCol(rowCol);
let t1 = tile1 === 17;
let t2 = tile2 === 17;
let t3 = tile3 === 17;
let air1 = tile1 === 0;
let air2 = tile2 === 0;
let air3 = tile3 === 0;
let majority = (t1 && t2) || (t1 && t3) || (t2 && t3) || (t1 && t2 && t3);
let minorityButAir = (t1 && air2 && air3) || (air1 && t2 && air3) || (air1 && air2 && t3);
// If coin block, change to empty coin block
if(majority || minorityButAir){
if(minorityButAir){
// Get the correct position
if(t1){
pos.x -= 32;
} else if(t2){
pos.x -= 16;
}
rowCol = this.parent.tilemap.getColRowAt(pos);
} else {
pos.x -= 16;
rowCol = this.parent.tilemap.getColRowAt(pos);
}
this.parent.tilemap.setTileAtRowCol(rowCol, 18);
this.emitter.fireEvent(MarioEvents.PLAYER_HIT_COIN_BLOCK);
let tileSize = this.parent.tilemap.getTileSize();
this.parent.coin.position.copy(rowCol.scale(tileSize.x, tileSize.y).add(tileSize.scaled(0.5)));
// Animate collision
this.parent.coin.tweens.add("coin", {
startDelay: 0,
duration: 300,
effects: [{
property: "positionY",
resetOnComplete: false,
start: this.parent.coin.position.y,
end: this.parent.coin.position.y - 2*tileSize.y,
ease: EaseFunctionType.OUT_SINE
},
{
property: "alpha",
resetOnComplete: false,
start: 1,
end: 0,
ease: EaseFunctionType.OUT_SINE
}]
});
this.parent.coin.tweens.play("coin");
}
}
if(this.owner.onGround){
this.finished(PlayerStates.PREVIOUS);
}
if(this.owner.onCeiling){
this.parent.velocity.y = 0;
}
let dir = this.getInputDirection();
this.parent.velocity.x += dir.x * this.parent.speed/3.5 - 0.3*this.parent.velocity.x;
this.emitter.fireEvent(CustomGameEventType.PLAYER_MOVE, {position: this.owner.position.clone()});
this.owner.move(this.parent.velocity.scaled(deltaT));
}
onExit(): void {
this.owner.animation.stop();
}
}