added tween features
This commit is contained in:
parent
5bf6e96778
commit
b8849b4c84
|
@ -55,6 +55,7 @@ export default abstract class GameNode implements Positioned, Unique, Updateable
|
||||||
protected layer: Layer;
|
protected layer: Layer;
|
||||||
tweens: TweenManager;
|
tweens: TweenManager;
|
||||||
rotation: number;
|
rotation: number;
|
||||||
|
alpha: number;
|
||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
this.input = InputReceiver.getInstance();
|
this.input = InputReceiver.getInstance();
|
||||||
|
@ -64,6 +65,7 @@ export default abstract class GameNode implements Positioned, Unique, Updateable
|
||||||
this.emitter = new Emitter();
|
this.emitter = new Emitter();
|
||||||
this.tweens = new TweenManager(this);
|
this.tweens = new TweenManager(this);
|
||||||
this.rotation = 0;
|
this.rotation = 0;
|
||||||
|
this.alpha = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------- POSITIONED ----------*/
|
/*---------- POSITIONED ----------*/
|
||||||
|
@ -254,5 +256,6 @@ export enum TweenableProperties{
|
||||||
posY = "positionY",
|
posY = "positionY",
|
||||||
scaleX = "scaleX",
|
scaleX = "scaleX",
|
||||||
scaleY = "scaleY",
|
scaleY = "scaleY",
|
||||||
rotation = "rotation"
|
rotation = "rotation",
|
||||||
|
alpha = "alpha"
|
||||||
}
|
}
|
|
@ -21,6 +21,8 @@ export class TweenData {
|
||||||
/** An array of the effects on the properties of the object */
|
/** An array of the effects on the properties of the object */
|
||||||
effects: [{
|
effects: [{
|
||||||
property: TweenableProperties;
|
property: TweenableProperties;
|
||||||
|
resetOnComplete: boolean;
|
||||||
|
initialValue: number;
|
||||||
start: any;
|
start: any;
|
||||||
end: any;
|
end: any;
|
||||||
ease: EaseFunctionType;
|
ease: EaseFunctionType;
|
||||||
|
|
|
@ -44,6 +44,13 @@ export default class TweenManager {
|
||||||
tween.loop = loop;
|
tween.loop = loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the initial values
|
||||||
|
for(let effect of tween.effects){
|
||||||
|
if(effect.resetOnComplete){
|
||||||
|
effect.initialValue = this.owner[effect.property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Start the tween running
|
// Start the tween running
|
||||||
tween.animationState = AnimationState.PLAYING;
|
tween.animationState = AnimationState.PLAYING;
|
||||||
tween.elapsedTime = 0;
|
tween.elapsedTime = 0;
|
||||||
|
@ -80,7 +87,15 @@ export default class TweenManager {
|
||||||
*/
|
*/
|
||||||
stop(key: string): void {
|
stop(key: string): void {
|
||||||
if(this.tweens.has(key)){
|
if(this.tweens.has(key)){
|
||||||
this.tweens.get(key).animationState = AnimationState.STOPPED;
|
let tween = this.tweens.get(key);
|
||||||
|
tween.animationState = AnimationState.STOPPED;
|
||||||
|
|
||||||
|
// Return to the initial values
|
||||||
|
for(let effect of tween.effects){
|
||||||
|
if(effect.resetOnComplete){
|
||||||
|
this.owner[effect.property] = effect.initialValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +118,7 @@ export default class TweenManager {
|
||||||
tween.elapsedTime -= tween.duration;
|
tween.elapsedTime -= tween.duration;
|
||||||
} else {
|
} else {
|
||||||
// We aren't looping and can't reverse, so stop
|
// We aren't looping and can't reverse, so stop
|
||||||
tween.animationState = AnimationState.STOPPED;
|
this.stop(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +128,7 @@ export default class TweenManager {
|
||||||
tween.reversing = false;
|
tween.reversing = false;
|
||||||
tween.elapsedTime -= 2*tween.duration;
|
tween.elapsedTime -= 2*tween.duration;
|
||||||
} else {
|
} else {
|
||||||
tween.animationState = AnimationState.STOPPED;
|
this.stop(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,19 +66,41 @@ export default class CanvasRenderer extends RenderingManager {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Render tilemaps
|
let tilemapIndex = 0;
|
||||||
tilemaps.forEach(tilemap => {
|
let tilemapLength = tilemaps.length;
|
||||||
this.renderTilemap(tilemap);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Render visible set
|
let visibleSetIndex = 0;
|
||||||
visibleSet.forEach(node => {
|
let visibleSetLength = visibleSet.length;
|
||||||
if(node.visible){
|
|
||||||
this.renderNode(node);
|
while(tilemapIndex < tilemapLength || visibleSetIndex < visibleSetLength){
|
||||||
|
// Check conditions where we've already reached the edge of one list
|
||||||
|
if(tilemapIndex >= tilemapLength){
|
||||||
|
// Only render the remaining visible set
|
||||||
|
let node = visibleSet[visibleSetIndex++];
|
||||||
|
if(node.visible){
|
||||||
|
this.renderNode(node);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
// Render the uiLayers
|
if(visibleSetIndex >= visibleSetLength){
|
||||||
|
// Only render tilemaps
|
||||||
|
this.renderTilemap(tilemaps[tilemapIndex++]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render whichever is further down
|
||||||
|
if(tilemaps[tilemapIndex].getLayer().getDepth() <= visibleSet[visibleSetIndex].getLayer().getDepth()){
|
||||||
|
this.renderTilemap(tilemaps[tilemapIndex++]);
|
||||||
|
} else {
|
||||||
|
let node = visibleSet[visibleSetIndex++];
|
||||||
|
if(node.visible){
|
||||||
|
this.renderNode(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render the uiLayers on top of everything else
|
||||||
uiLayers.forEach(key => uiLayers.get(key).getItems().forEach(node => this.renderNode(<CanvasNode>node)));
|
uiLayers.forEach(key => uiLayers.get(key).getItems().forEach(node => this.renderNode(<CanvasNode>node)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +122,8 @@ export default class CanvasRenderer extends RenderingManager {
|
||||||
|
|
||||||
this.ctx.setTransform(xScale, 0, 0, yScale, (node.position.x - this.origin.x)*this.zoom, (node.position.y - this.origin.y)*this.zoom);
|
this.ctx.setTransform(xScale, 0, 0, yScale, (node.position.x - this.origin.x)*this.zoom, (node.position.y - this.origin.y)*this.zoom);
|
||||||
this.ctx.rotate(node.rotation);
|
this.ctx.rotate(node.rotation);
|
||||||
|
let globalAlpha = this.ctx.globalAlpha;
|
||||||
|
this.ctx.globalAlpha = node.alpha;
|
||||||
|
|
||||||
if(node instanceof AnimatedSprite){
|
if(node instanceof AnimatedSprite){
|
||||||
this.renderAnimatedSprite(<AnimatedSprite>node);
|
this.renderAnimatedSprite(<AnimatedSprite>node);
|
||||||
|
@ -111,6 +135,7 @@ export default class CanvasRenderer extends RenderingManager {
|
||||||
this.renderUIElement(<UIElement>node);
|
this.renderUIElement(<UIElement>node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.ctx.globalAlpha = globalAlpha;
|
||||||
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
|
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,11 @@ export default class ResourceManager {
|
||||||
* @param key The key of the loaded image
|
* @param key The key of the loaded image
|
||||||
*/
|
*/
|
||||||
public getImage(key: string): HTMLImageElement {
|
public getImage(key: string): HTMLImageElement {
|
||||||
return this.images.get(key);
|
let image = this.images.get(key);
|
||||||
|
if(image === undefined){
|
||||||
|
throw `There is no image associated with key "${key}"`
|
||||||
|
}
|
||||||
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
public spritesheet(key: string, path: string): void {
|
public spritesheet(key: string, path: string): void {
|
||||||
|
|
|
@ -13,6 +13,8 @@ import Slider from "../../Nodes/UIElements/Slider";
|
||||||
import TextInput from "../../Nodes/UIElements/TextInput";
|
import TextInput from "../../Nodes/UIElements/TextInput";
|
||||||
import Rect from "../../Nodes/Graphics/Rect";
|
import Rect from "../../Nodes/Graphics/Rect";
|
||||||
import ResourceManager from "../../ResourceManager/ResourceManager";
|
import ResourceManager from "../../ResourceManager/ResourceManager";
|
||||||
|
import UILayer from "../Layers/UILayer";
|
||||||
|
import ParallaxLayer from "../Layers/ParallaxLayer";
|
||||||
|
|
||||||
export default class CanvasNodeFactory {
|
export default class CanvasNodeFactory {
|
||||||
protected scene: Scene;
|
protected scene: Scene;
|
||||||
|
@ -75,7 +77,10 @@ export default class CanvasNodeFactory {
|
||||||
// Add instance to scene
|
// Add instance to scene
|
||||||
instance.setScene(this.scene);
|
instance.setScene(this.scene);
|
||||||
instance.id = this.scene.generateId();
|
instance.id = this.scene.generateId();
|
||||||
this.scene.getSceneGraph().addNode(instance);
|
|
||||||
|
if(!(this.scene.isParallaxLayer(layerName) || this.scene.isUILayer(layerName))){
|
||||||
|
this.scene.getSceneGraph().addNode(instance);
|
||||||
|
}
|
||||||
|
|
||||||
// Add instance to layer
|
// Add instance to layer
|
||||||
layer.addNode(instance);
|
layer.addNode(instance);
|
||||||
|
@ -91,7 +96,10 @@ export default class CanvasNodeFactory {
|
||||||
// Add instance fo scene
|
// Add instance fo scene
|
||||||
instance.setScene(this.scene);
|
instance.setScene(this.scene);
|
||||||
instance.id = this.scene.generateId();
|
instance.id = this.scene.generateId();
|
||||||
this.scene.getSceneGraph().addNode(instance);
|
|
||||||
|
if(!(this.scene.isParallaxLayer(layerName) || this.scene.isUILayer(layerName))){
|
||||||
|
this.scene.getSceneGraph().addNode(instance);
|
||||||
|
}
|
||||||
|
|
||||||
// Add instance to layer
|
// Add instance to layer
|
||||||
layer.addNode(instance);
|
layer.addNode(instance);
|
||||||
|
|
|
@ -180,7 +180,7 @@ export default class Scene implements Updateable, Renderable {
|
||||||
* @param depth The depth of the layer
|
* @param depth The depth of the layer
|
||||||
*/
|
*/
|
||||||
addLayer(name: string, depth?: number): Layer {
|
addLayer(name: string, depth?: number): Layer {
|
||||||
if(this.layers.has(name) || this.uiLayers.has(name)){
|
if(this.layers.has(name) || this.parallaxLayers.has(name) || this.uiLayers.has(name)){
|
||||||
throw `Layer with name ${name} already exists`;
|
throw `Layer with name ${name} already exists`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,13 +202,13 @@ export default class Scene implements Updateable, Renderable {
|
||||||
* @param depth The depth of the layer
|
* @param depth The depth of the layer
|
||||||
*/
|
*/
|
||||||
addParallaxLayer(name: string, parallax: Vec2, depth?: number): ParallaxLayer {
|
addParallaxLayer(name: string, parallax: Vec2, depth?: number): ParallaxLayer {
|
||||||
if(this.layers.has(name) || this.uiLayers.has(name)){
|
if(this.layers.has(name) || this.parallaxLayers.has(name) || this.uiLayers.has(name)){
|
||||||
throw `Layer with name ${name} already exists`;
|
throw `Layer with name ${name} already exists`;
|
||||||
}
|
}
|
||||||
|
|
||||||
let layer = new ParallaxLayer(this, name, parallax);
|
let layer = new ParallaxLayer(this, name, parallax);
|
||||||
|
|
||||||
this.layers.add(name, layer);
|
this.parallaxLayers.add(name, layer);
|
||||||
|
|
||||||
if(depth){
|
if(depth){
|
||||||
layer.setDepth(depth);
|
layer.setDepth(depth);
|
||||||
|
@ -222,7 +222,7 @@ export default class Scene implements Updateable, Renderable {
|
||||||
* @param name The name of the new UIlayer
|
* @param name The name of the new UIlayer
|
||||||
*/
|
*/
|
||||||
addUILayer(name: string): UILayer {
|
addUILayer(name: string): UILayer {
|
||||||
if(this.layers.has(name) || this.uiLayers.has(name)){
|
if(this.layers.has(name) || this.parallaxLayers.has(name) || this.uiLayers.has(name)){
|
||||||
throw `Layer with name ${name} already exists`;
|
throw `Layer with name ${name} already exists`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ export default class MathUtils {
|
||||||
factor *= 16;
|
factor *= 16;
|
||||||
}
|
}
|
||||||
let hexStr = "";
|
let hexStr = "";
|
||||||
while(num > 0){
|
while(factor >= 1){
|
||||||
let digit = Math.floor(num/factor);
|
let digit = Math.floor(num/factor);
|
||||||
hexStr += MathUtils.toHexDigit(digit);
|
hexStr += MathUtils.toHexDigit(digit);
|
||||||
num -= digit * factor;
|
num -= digit * factor;
|
||||||
|
|
|
@ -31,6 +31,7 @@ export default class GoombaController extends StateMachineAI {
|
||||||
this.receiver.subscribe("playerHitCoinBlock");
|
this.receiver.subscribe("playerHitCoinBlock");
|
||||||
if(this.jumpy){
|
if(this.jumpy){
|
||||||
this.receiver.subscribe(CustomGameEventType.PLAYER_JUMP);
|
this.receiver.subscribe(CustomGameEventType.PLAYER_JUMP);
|
||||||
|
this.speed = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
let idle = new Idle(this, owner);
|
let idle = new Idle(this, owner);
|
||||||
|
|
|
@ -6,7 +6,7 @@ import GoombaController, { GoombaStates } from "./GoombaController";
|
||||||
|
|
||||||
export default abstract class GoombaState extends State {
|
export default abstract class GoombaState extends State {
|
||||||
owner: GameNode;
|
owner: GameNode;
|
||||||
gravity: number = 7000;
|
gravity: number = 1000;
|
||||||
parent: GoombaController
|
parent: GoombaController
|
||||||
|
|
||||||
constructor(parent: StateMachine, owner: GameNode){
|
constructor(parent: StateMachine, owner: GameNode){
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import Vec2 from "../../DataTypes/Vec2";
|
import Vec2 from "../../DataTypes/Vec2";
|
||||||
import GameEvent from "../../Events/GameEvent";
|
import GameEvent from "../../Events/GameEvent";
|
||||||
|
import AnimatedSprite from "../../Nodes/Sprites/AnimatedSprite";
|
||||||
import { CustomGameEventType } from "../CustomGameEventType";
|
import { CustomGameEventType } from "../CustomGameEventType";
|
||||||
import { GoombaStates } from "./GoombaController";
|
import { GoombaStates } from "./GoombaController";
|
||||||
import OnGround from "./OnGround";
|
import OnGround from "./OnGround";
|
||||||
|
@ -7,6 +8,11 @@ import OnGround from "./OnGround";
|
||||||
export default class Idle extends OnGround {
|
export default class Idle extends OnGround {
|
||||||
onEnter(): void {
|
onEnter(): void {
|
||||||
this.parent.speed = this.parent.speed;
|
this.parent.speed = this.parent.speed;
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("IDLE", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
onExit(): void {
|
||||||
|
(<AnimatedSprite>this.owner).animation.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleInput(event: GameEvent) {
|
handleInput(event: GameEvent) {
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
import GameEvent from "../../Events/GameEvent";
|
import GameEvent from "../../Events/GameEvent";
|
||||||
|
import AnimatedSprite from "../../Nodes/Sprites/AnimatedSprite";
|
||||||
import { GoombaStates } from "./GoombaController";
|
import { GoombaStates } from "./GoombaController";
|
||||||
import GoombaState from "./GoombaState";
|
import GoombaState from "./GoombaState";
|
||||||
|
|
||||||
export default class Jump extends GoombaState {
|
export default class Jump extends GoombaState {
|
||||||
|
|
||||||
onEnter(): void {}
|
onEnter(): void {
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("JUMP", true);
|
||||||
|
(<AnimatedSprite>this.owner).tweens.play("jump", true);
|
||||||
|
this.gravity = 500;
|
||||||
|
}
|
||||||
|
|
||||||
update(deltaT: number): void {
|
update(deltaT: number): void {
|
||||||
super.update(deltaT);
|
super.update(deltaT);
|
||||||
|
@ -22,5 +27,8 @@ export default class Jump extends GoombaState {
|
||||||
this.owner.move(this.parent.velocity.scaled(deltaT));
|
this.owner.move(this.parent.velocity.scaled(deltaT));
|
||||||
}
|
}
|
||||||
|
|
||||||
onExit(): void {}
|
onExit(): void {
|
||||||
|
(<AnimatedSprite>this.owner).animation.stop();
|
||||||
|
(<AnimatedSprite>this.owner).tweens.stop("jump");
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
import Vec2 from "../../DataTypes/Vec2";
|
import Vec2 from "../../DataTypes/Vec2";
|
||||||
|
import AnimatedSprite from "../../Nodes/Sprites/AnimatedSprite";
|
||||||
import { GoombaStates } from "./GoombaController";
|
import { GoombaStates } from "./GoombaController";
|
||||||
import OnGround from "./OnGround";
|
import OnGround from "./OnGround";
|
||||||
|
|
||||||
|
@ -8,8 +9,11 @@ export default class Walk extends OnGround {
|
||||||
onEnter(): void {
|
onEnter(): void {
|
||||||
if(this.parent.direction.isZero()){
|
if(this.parent.direction.isZero()){
|
||||||
this.parent.direction = new Vec2(-1, 0);
|
this.parent.direction = new Vec2(-1, 0);
|
||||||
|
(<AnimatedSprite>this.owner).invertX = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(<AnimatedSprite>this.owner).animation.play("WALK", true);
|
||||||
|
|
||||||
this.time = Date.now();
|
this.time = Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,16 +23,22 @@ export default class Walk extends OnGround {
|
||||||
if(this.owner.onWall){
|
if(this.owner.onWall){
|
||||||
// Flip around
|
// Flip around
|
||||||
this.parent.direction.x *= -1;
|
this.parent.direction.x *= -1;
|
||||||
|
(<AnimatedSprite>this.owner).invertX = !(<AnimatedSprite>this.owner).invertX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.parent.jumpy && (Date.now() - this.time > 500)){
|
if(this.parent.jumpy && (Date.now() - this.time > 500)){
|
||||||
console.log("Jump");
|
console.log("Jump");
|
||||||
this.finished(GoombaStates.JUMP);
|
this.finished(GoombaStates.JUMP);
|
||||||
this.parent.velocity.y = -2000;
|
this.parent.velocity.y = -300;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.parent.velocity.x = this.parent.direction.x * this.parent.speed;
|
this.parent.velocity.x = this.parent.direction.x * this.parent.speed;
|
||||||
|
|
||||||
this.owner.move(this.parent.velocity.scaled(deltaT));
|
this.owner.move(this.parent.velocity.scaled(deltaT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onExit(): void {
|
||||||
|
(<AnimatedSprite>this.owner).animation.stop();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -11,6 +11,7 @@ import OrthogonalTilemap from "../../Nodes/Tilemaps/OrthogonalTilemap";
|
||||||
import AnimatedSprite from "../../Nodes/Sprites/AnimatedSprite";
|
import AnimatedSprite from "../../Nodes/Sprites/AnimatedSprite";
|
||||||
import Debug from "../../Debug/Debug";
|
import Debug from "../../Debug/Debug";
|
||||||
import { EaseFunctionType } from "../../Utils/EaseFunctions";
|
import { EaseFunctionType } from "../../Utils/EaseFunctions";
|
||||||
|
import Sprite from "../../Nodes/Sprites/Sprite";
|
||||||
|
|
||||||
export enum MarioEvents {
|
export enum MarioEvents {
|
||||||
PLAYER_HIT_COIN = "PlayerHitCoin",
|
PLAYER_HIT_COIN = "PlayerHitCoin",
|
||||||
|
@ -23,20 +24,34 @@ export default class Level1 extends Scene {
|
||||||
coinCountLabel: Label;
|
coinCountLabel: Label;
|
||||||
livesCount: number = 3;
|
livesCount: number = 3;
|
||||||
livesCountLabel: Label;
|
livesCountLabel: Label;
|
||||||
|
bg: Sprite;
|
||||||
|
|
||||||
loadScene(): void {
|
loadScene(): void {
|
||||||
|
this.load.image("background", "/assets/sprites/2bitbackground.png");
|
||||||
|
this.load.image("coin", "/assets/sprites/coin.png");
|
||||||
this.load.tilemap("level1", "/assets/tilemaps/2bitlevel1.json");
|
this.load.tilemap("level1", "/assets/tilemaps/2bitlevel1.json");
|
||||||
this.load.image("goomba", "assets/sprites/Goomba.png");
|
|
||||||
this.load.image("koopa", "assets/sprites/Koopa.png");
|
|
||||||
this.load.spritesheet("player", "assets/spritesheets/walking.json");
|
this.load.spritesheet("player", "assets/spritesheets/walking.json");
|
||||||
|
this.load.spritesheet("hopper", "assets/spritesheets/hopper.json");
|
||||||
|
this.load.spritesheet("bunny", "assets/spritesheets/ghostBunny.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
startScene(): void {
|
startScene(): void {
|
||||||
|
// Add a background layer and set the background image on it
|
||||||
|
this.addParallaxLayer("bg", new Vec2(0.25, 0), -100);
|
||||||
|
let bg = this.add.sprite("background", "bg");
|
||||||
|
bg.scale.set(2, 2);
|
||||||
|
bg.position.set(bg.boundary.halfSize.x, 16);
|
||||||
|
this.bg = bg;
|
||||||
|
this.bg.toString = () => "BackgroundImage";
|
||||||
|
|
||||||
let tilemap = <OrthogonalTilemap>this.add.tilemap("level1", new Vec2(2, 2))[0].getItems()[0];
|
let tilemap = <OrthogonalTilemap>this.add.tilemap("level1", new Vec2(2, 2))[0].getItems()[0];
|
||||||
//tilemap.position.set(tilemap.size.x*tilemap.scale.x/2, tilemap.size.y*tilemap.scale.y/2);
|
//tilemap.position.set(tilemap.size.x*tilemap.scale.x/2, tilemap.size.y*tilemap.scale.y/2);
|
||||||
tilemap.position.set(0, 0);
|
tilemap.position.set(0, 0);
|
||||||
this.viewport.setBounds(0, 0, 128*32, 20*32);
|
this.viewport.setBounds(0, 0, 128*32, 20*32);
|
||||||
|
|
||||||
|
// Add a layer behind the tilemap for coin animation
|
||||||
|
this.addLayer("coinLayer", -50);
|
||||||
|
|
||||||
// Add the player (a rect for now)
|
// Add the player (a rect for now)
|
||||||
// this.player = this.add.graphic(GraphicType.RECT, "Main", {position: new Vec2(192, 1152), size: new Vec2(64, 64)});
|
// this.player = this.add.graphic(GraphicType.RECT, "Main", {position: new Vec2(192, 1152), size: new Vec2(64, 64)});
|
||||||
this.player = this.add.animatedSprite("player", "Main");
|
this.player = this.add.animatedSprite("player", "Main");
|
||||||
|
@ -70,23 +85,37 @@ export default class Level1 extends Scene {
|
||||||
this.viewport.setZoomLevel(2);
|
this.viewport.setZoomLevel(2);
|
||||||
|
|
||||||
// Add enemies
|
// Add enemies
|
||||||
// for(let pos of [{x: 21, y: 18}, {x: 30, y: 18}, {x: 37, y: 18}, {x: 41, y: 18}, {x: 105, y: 8}, {x: 107, y: 8}, {x: 125, y: 18}]){
|
for(let pos of [{x: 21, y: 18}]){//, {x: 30, y: 18}, {x: 37, y: 18}, {x: 41, y: 18}, {x: 105, y: 8}, {x: 107, y: 8}, {x: 125, y: 18}]){
|
||||||
// let goomba = this.add.sprite("goomba", "Main");
|
let bunny = this.add.animatedSprite("bunny", "Main");
|
||||||
// goomba.position.set(pos.x*64, pos.y*64);
|
bunny.position.set(pos.x*32, pos.y*32);
|
||||||
// goomba.scale.set(2, 2);
|
bunny.scale.set(2, 2);
|
||||||
// goomba.addPhysics();
|
bunny.addPhysics();
|
||||||
// goomba.addAI(GoombaController, {jumpy: false});
|
bunny.addAI(GoombaController, {jumpy: false});
|
||||||
// goomba.setPhysicsLayer("enemy");
|
bunny.setPhysicsLayer("enemy");
|
||||||
// }
|
}
|
||||||
|
|
||||||
// for(let pos of [{x: 67, y: 18}, {x: 86, y: 21}, {x: 128, y: 18}]){
|
for(let pos of [{x: 67, y: 18}]){//, {x: 86, y: 21}, {x: 128, y: 18}]){
|
||||||
// let koopa = this.add.sprite("koopa", "Main");
|
let hopper = this.add.animatedSprite("hopper", "Main");
|
||||||
// koopa.position.set(pos.x*64, pos.y*64);
|
hopper.position.set(pos.x*32, pos.y*32);
|
||||||
// koopa.scale.set(2, 2);
|
hopper.scale.set(2, 2);
|
||||||
// koopa.addPhysics();
|
hopper.addPhysics();
|
||||||
// koopa.addAI(GoombaController, {jumpy: true});
|
hopper.addAI(GoombaController, {jumpy: true});
|
||||||
// koopa.setPhysicsLayer("enemy");
|
hopper.setPhysicsLayer("enemy");
|
||||||
// }
|
hopper.tweens.add("jump", {
|
||||||
|
startDelay: 0,
|
||||||
|
duration: 300,
|
||||||
|
effects: [
|
||||||
|
{
|
||||||
|
property: "rotation",
|
||||||
|
resetOnComplete: true,
|
||||||
|
start: -3.14/8,
|
||||||
|
end: 3.14/8,
|
||||||
|
ease: EaseFunctionType.IN_OUT_SINE
|
||||||
|
}
|
||||||
|
],
|
||||||
|
reverseOnComplete: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Add UI
|
// Add UI
|
||||||
this.addUILayer("UI");
|
this.addUILayer("UI");
|
||||||
|
@ -96,6 +125,8 @@ export default class Level1 extends Scene {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateScene(deltaT: number): void {
|
updateScene(deltaT: number): void {
|
||||||
|
Debug.log("pos", this.bg.position);
|
||||||
|
|
||||||
while(this.receiver.hasNextEvent()){
|
while(this.receiver.hasNextEvent()){
|
||||||
let event = this.receiver.getNextEvent();
|
let event = this.receiver.getNextEvent();
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,9 @@ import StateMachineAI from "../../AI/StateMachineAI";
|
||||||
import Vec2 from "../../DataTypes/Vec2";
|
import Vec2 from "../../DataTypes/Vec2";
|
||||||
import Debug from "../../Debug/Debug";
|
import Debug from "../../Debug/Debug";
|
||||||
import GameNode from "../../Nodes/GameNode";
|
import GameNode from "../../Nodes/GameNode";
|
||||||
|
import Sprite from "../../Nodes/Sprites/Sprite";
|
||||||
import OrthogonalTilemap from "../../Nodes/Tilemaps/OrthogonalTilemap";
|
import OrthogonalTilemap from "../../Nodes/Tilemaps/OrthogonalTilemap";
|
||||||
|
import { TweenData } from "../../Rendering/Animations/AnimationTypes";
|
||||||
import IdleTopDown from "./PlayerStates/IdleTopDown";
|
import IdleTopDown from "./PlayerStates/IdleTopDown";
|
||||||
import MoveTopDown from "./PlayerStates/MoveTopDown";
|
import MoveTopDown from "./PlayerStates/MoveTopDown";
|
||||||
import Idle from "./PlayerStates/Platformer/Idle";
|
import Idle from "./PlayerStates/Platformer/Idle";
|
||||||
|
@ -29,8 +31,9 @@ export default class PlayerController extends StateMachineAI {
|
||||||
velocity: Vec2 = Vec2.ZERO;
|
velocity: Vec2 = Vec2.ZERO;
|
||||||
speed: number = 200;
|
speed: number = 200;
|
||||||
MIN_SPEED: number = 200;
|
MIN_SPEED: number = 200;
|
||||||
MAX_SPEED: number = 500;
|
MAX_SPEED: number = 300;
|
||||||
tilemap: OrthogonalTilemap;
|
tilemap: OrthogonalTilemap;
|
||||||
|
coin: Sprite;
|
||||||
|
|
||||||
initializeAI(owner: GameNode, options: Record<string, any>){
|
initializeAI(owner: GameNode, options: Record<string, any>){
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
|
@ -42,6 +45,8 @@ export default class PlayerController extends StateMachineAI {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.tilemap = this.owner.getScene().getTilemap(options.tilemap) as OrthogonalTilemap;
|
this.tilemap = this.owner.getScene().getTilemap(options.tilemap) as OrthogonalTilemap;
|
||||||
|
this.coin = this.owner.getScene().add.sprite("coin", "coinLayer");
|
||||||
|
this.coin.scale.set(2, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import Vec2 from "../../../../DataTypes/Vec2";
|
import Vec2 from "../../../../DataTypes/Vec2";
|
||||||
import GameEvent from "../../../../Events/GameEvent";
|
import GameEvent from "../../../../Events/GameEvent";
|
||||||
import AnimatedSprite from "../../../../Nodes/Sprites/AnimatedSprite";
|
import AnimatedSprite from "../../../../Nodes/Sprites/AnimatedSprite";
|
||||||
|
import { EaseFunctionType } from "../../../../Utils/EaseFunctions";
|
||||||
import MathUtils from "../../../../Utils/MathUtils";
|
import MathUtils from "../../../../Utils/MathUtils";
|
||||||
import { CustomGameEventType } from "../../../CustomGameEventType";
|
import { CustomGameEventType } from "../../../CustomGameEventType";
|
||||||
import Level1, { MarioEvents } from "../../../Mario/Level1";
|
import Level1, { MarioEvents } from "../../../Mario/Level1";
|
||||||
|
@ -28,12 +29,35 @@ export default class Jump extends PlayerState {
|
||||||
pos = this.parent.tilemap.getColRowAt(pos);
|
pos = this.parent.tilemap.getColRowAt(pos);
|
||||||
let tile = this.parent.tilemap.getTileAtRowCol(pos);
|
let tile = this.parent.tilemap.getTileAtRowCol(pos);
|
||||||
|
|
||||||
console.log("Hit tile: " + tile);
|
|
||||||
|
|
||||||
// If coin block, change to empty coin block
|
// If coin block, change to empty coin block
|
||||||
if(tile === 17){
|
if(tile === 17){
|
||||||
this.parent.tilemap.setTileAtRowCol(pos, 18);
|
this.parent.tilemap.setTileAtRowCol(pos, 18);
|
||||||
this.emitter.fireEvent(MarioEvents.PLAYER_HIT_COIN_BLOCK);
|
this.emitter.fireEvent(MarioEvents.PLAYER_HIT_COIN_BLOCK);
|
||||||
|
|
||||||
|
let tileSize = this.parent.tilemap.getTileSize();
|
||||||
|
this.parent.coin.position.copy(pos.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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default class PlayerController extends StateMachineAI {
|
||||||
velocity: Vec2 = Vec2.ZERO;
|
velocity: Vec2 = Vec2.ZERO;
|
||||||
speed: number = 400;
|
speed: number = 400;
|
||||||
MIN_SPEED: number = 400;
|
MIN_SPEED: number = 400;
|
||||||
MAX_SPEED: number = 1000;
|
MAX_SPEED: number = 400;
|
||||||
|
|
||||||
initializeAI(owner: GameNode, config: Record<string, any>): void {
|
initializeAI(owner: GameNode, config: Record<string, any>): void {
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
|
|
|
@ -7,7 +7,7 @@ export default class Walk extends OnGround {
|
||||||
owner: AnimatedSprite;
|
owner: AnimatedSprite;
|
||||||
|
|
||||||
onEnter(): void {
|
onEnter(): void {
|
||||||
this.parent.speed = this.parent.MAX_SPEED/2;
|
this.parent.speed = this.parent.MIN_SPEED;
|
||||||
this.owner.animation.play("WALK", true);
|
this.owner.animation.play("WALK", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user