Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict";
- /**
- * The Last Pastry
- * @author TheMuffinCoder (a.k.a Sebastian)
- */
- module PastryCore {
- export class Engine {
- static log(message: string): void {
- console.log("PASTRY ENGINE: " + message);
- }
- static calculateAngleSimple(pointOne: Position, pointTwo: Position): number {
- var deltaX: number = pointTwo.x - pointOne.x;
- var deltaY: number = pointTwo.y - pointOne.y;
- return (Math.atan2(deltaY, deltaX) * 180 / Math.PI);
- }
- static calculateAngle(pointOne: Position, pointTwoX: number, pointTwoY: number): number {
- var deltaX: number = pointTwoX - pointOne.x;
- var deltaY: number = pointTwoY - pointOne.y;
- return (Math.atan2(deltaY, deltaX) * 180 / Math.PI);
- }
- }
- export class Dimension {
- constructor(public width: number = 0, public height: number = 0) { }
- setDimensions(width: number, height: number): void {
- this.width = width;
- this.height = height;
- }
- }
- export class Position {
- constructor(public x: number = 0, public y: number = 0) { }
- updateY(delta: number): void {
- this.y += delta;
- }
- updateX(delta: number): void {
- this.x += delta;
- }
- setX(x: number): void {
- this.x = x;
- }
- setY(y: number): void {
- this.y = y;
- }
- }
- export class Bounds {
- public min: Position = new Position();
- public max: Position = new Position();
- public center: Position = new Position();
- public tileLocation: Position = new Position();
- public update(): void {
- this.center.x = this.min.x + 8;
- }
- }
- export enum GameStates { INGAME, MAIN, PAUSED, LOADING}
- export class GameManager {
- constructor(public currentState: GameStates = GameStates.INGAME) {
- }
- }
- export class TimeManager {
- static DELAY_SHORT: number = 25;
- static DELAY_MEDIUM: number = 50;
- static DELAY_LONG: number = 100;
- static lapse: number = 0.0;
- static fps: number = 0.0;
- private start: number = 0.0;
- private before: number = 0.0;
- public fps: number = 0.0;
- constructor() {
- window.requestAnimationFrame = (
- window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame || function (callback, element) {
- window.setTimeout(PASTRY.loop, 60);
- }
- );
- this.before = Date.now();
- }
- update(): void {
- this.start = Date.now();
- TimeManager.lapse = (this.start - this.before) / 1000;
- this.before = this.start;
- TimeManager.fps = (1 / TimeManager.lapse) | 0;
- }
- }
- export class EventSet {
- available: boolean = false;
- moveLeft: boolean = false;
- moveRight: boolean = false;
- moveUp: boolean = false;
- moveDown: boolean = false;
- action: boolean = false;
- actionDirection: number = 0;
- deactivateAllMovement(): void {
- this.moveLeft = this.moveDown = this.moveRight = this.moveUp = false;
- }
- deactivateAll(): void {
- this.moveLeft = this.moveDown = this.moveRight = this.moveUp = this.action = false;
- }
- }
- export enum KEYBOARD {
- ENTER = 13,
- SHIFT = 16,
- CTRL = 17,
- ESAPE = 27,
- SPACE = 32,
- LEFT = 37,
- UP = 38,
- RIGHT = 39,
- DOWN = 40,
- A = 65,
- D = 68,
- E = 69,
- Q = 81,
- R = 82,
- S = 83,
- T = 84,
- W = 87,
- Y = 89,
- }
- export enum GAMEPAD_XBOX {
- BUTTON_A = 0,
- BUTTON_B = 1,
- BUTTON_X = 2,
- BUTTON_Y = 3,
- BUTTON_LEFT_TRIGGER = 4,
- BUTTON_RIGHT_TRIGGER = 5,
- BUTTON_LEFT_BUMPER = 6,
- BUTTON_RIGHT_BUMPER = 7,
- BUTTON_VIEW = 8,
- BUTTON_MENU = 9,
- BUTTON_LEFT_STICK_PRESS = 10,
- BUTTON_RIGHT_STICK_PRESS = 11,
- BUTTON_DPAD_UP = 12,
- BUTTON_DPAD_DOWN = 13,
- BUTTON_DPAD_LEFT = 14,
- BUTTON_DPAD_RIGHT = 15,
- STICK_LEFT_HORIZONTAL = 0,
- STICK_LEFT_VERTICAL = 1,
- STICK_RIGHT_HORIZONTAL = 2,
- STICK_RIGHT_VERTICAL = 3,
- }
- export class InputManager {
- static keyBoardEvents: EventSet = new EventSet();
- static touchEvents: EventSet = new EventSet();
- static touchCenter: Position = new Position();
- static touchBounds: Position = new Position();
- static touchIcon: any;
- private GAMEPAD: any;
- GAMEPAD_ONE_INDEX: number = 0;
- GAMEPAD_TWO_INDEX: number = 1;
- GAMEPAD_THREE_INDEX: number = 2;
- GAMEPAD_FOUR_INDEX: number = 3;
- GamepadSupported: boolean = false;
- static GAMEPADS: Array<EventSet> = [new EventSet(), new EventSet(), new EventSet(), new EventSet()];
- updateEvents(): void {
- }
- readKeyboard(e): void {
- }
- readKeyboardButtonPressed(e): void {
- switch (e.keyCode) {
- case KEYBOARD.W:
- case KEYBOARD.UP:
- InputManager.keyBoardEvents.moveUp = true;
- break;
- case KEYBOARD.S:
- case KEYBOARD.DOWN:
- InputManager.keyBoardEvents.moveDown = true;
- break;
- case KEYBOARD.A:
- case KEYBOARD.LEFT:
- InputManager.keyBoardEvents.moveLeft = true;
- break;
- case KEYBOARD.D:
- case KEYBOARD.RIGHT:
- InputManager.keyBoardEvents.moveRight = true;
- break;
- case KEYBOARD.SPACE:
- case KEYBOARD.ENTER:
- InputManager.keyBoardEvents.action = true;
- break;
- default:
- console.log(e.keyCode);
- };
- }
- readKeyboardButtonLifted(e): void {
- switch (e.keyCode) {
- case KEYBOARD.W:
- case KEYBOARD.UP:
- InputManager.keyBoardEvents.moveUp = false;
- break;
- case KEYBOARD.S:
- case KEYBOARD.DOWN:
- InputManager.keyBoardEvents.moveDown = false;
- break;
- case KEYBOARD.A:
- case KEYBOARD.LEFT:
- InputManager.keyBoardEvents.moveLeft = false;
- break;
- case KEYBOARD.D:
- case KEYBOARD.RIGHT:
- InputManager.keyBoardEvents.moveRight = false;
- break;
- case KEYBOARD.SPACE:
- case KEYBOARD.ENTER:
- InputManager.keyBoardEvents.action = false;
- break;
- default:
- console.log(e.keyCode);
- }
- }
- static checkTouchEvent(touchAngle: number): void {
- if (touchAngle < 0) {//Top
- if (touchAngle < -157.5) {//Only left
- InputManager.touchEvents.moveLeft = true;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = false;
- } else if (touchAngle < -112.5) {//Left Up
- InputManager.touchEvents.moveLeft = true;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = true;
- } else if (touchAngle < -67.5) {//Up only
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = true;
- } else if (touchAngle < -22.5) {//Right up
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = true;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = true;
- } else {//Right
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = true;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = false;
- }
- } else if (touchAngle > 0) {//Bottom
- if (touchAngle > 157.5) {//Only left
- InputManager.touchEvents.moveLeft = true;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = false;
- } else if (touchAngle > 112.5) {//Left Down
- InputManager.touchEvents.moveLeft = true;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = true;
- InputManager.touchEvents.moveUp = false;
- } else if (touchAngle > 67.5) {//Down only
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = false;
- InputManager.touchEvents.moveDown = true;
- InputManager.touchEvents.moveUp = false;
- } else if (touchAngle > 22.5) {//Right Down
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = true;
- InputManager.touchEvents.moveDown = true;
- InputManager.touchEvents.moveUp = false;
- } else {//Right
- InputManager.touchEvents.moveLeft = false;
- InputManager.touchEvents.moveRight = true;
- InputManager.touchEvents.moveDown = false;
- InputManager.touchEvents.moveUp = false;
- }
- }
- }
- readTouchStart(e): void {
- e.preventDefault();
- if (e.targetTouches[0].pageX < 20 && e.targetTouches[0].pageY < 20) {
- ScreenManager.toggleFullScreen();
- }
- if (e.targetTouches[0].pageX <= InputManager.touchBounds.x && e.targetTouches[0].pageY >= InputManager.touchBounds.y) {
- InputManager.checkTouchEvent(Engine.calculateAngle(InputManager.touchCenter, e.targetTouches[0].pageX, e.targetTouches[0].pageY) | 0);
- } else {
- InputManager.touchEvents.deactivateAllMovement();
- }
- }
- readTouchMove(e): void {
- e.preventDefault();
- if (e.targetTouches[0].pageX <= InputManager.touchBounds.x && e.targetTouches[0].pageY >= InputManager.touchBounds.y) {
- InputManager.checkTouchEvent(Engine.calculateAngle(InputManager.touchCenter, e.targetTouches[0].pageX, e.targetTouches[0].pageY) | 0);
- } else {
- InputManager.touchEvents.deactivateAllMovement();
- }
- }
- readTouchEnd(e): void {
- e.preventDefault();
- InputManager.touchEvents.deactivateAllMovement();
- }
- updateTouchCenter(): void{
- }
- onResize(): void {
- if(InputManager.touchEvents.available) {
- if(window.innerWidth > window.innerHeight) {//Landscape
- InputManager.touchBounds.x = window.innerWidth/3;
- InputManager.touchBounds.y = window.innerHeight - InputManager.touchBounds.x;
- InputManager.touchCenter.x = InputManager.touchBounds.x / 2;
- InputManager.touchCenter.y = InputManager.touchBounds.y + InputManager.touchCenter.x;
- InputManager.touchIcon.style.top = InputManager.touchBounds.y + "px";
- InputManager.touchIcon.style.width = InputManager.touchBounds.x + "px";
- InputManager.touchIcon.style.height = "auto";
- } else {//Portrait
- InputManager.touchBounds.y = window.innerHeight - window.innerHeight/3;
- InputManager.touchBounds.x = window.innerHeight - InputManager.touchBounds.y;
- InputManager.touchCenter.x = InputManager.touchBounds.x / 2;
- InputManager.touchCenter.y = InputManager.touchBounds.y + (window.innerHeight / 6);
- InputManager.touchIcon.style.top = InputManager.touchBounds.y + "px";
- InputManager.touchIcon.style.width = InputManager.touchBounds.x + "px";
- InputManager.touchIcon.style.height = "auto";
- }
- }
- }
- readTouchScreen(e): void {
- }
- readMousePointer(e): void {
- }
- readAccelerometer(e): void {
- /*
- * Documentation : http://www.w3.org/TR/orientation-event/
- * X represents
- * the tile forward or backwards
- * negative values means more to the left (-8 is suffic)
- * positive values means more to the right (+8 is suffic)
- * Y represents
- * the tilt left to right
- * increase values means more forward
- * how the screen is laying
- * upwards will have value of >9
- * downwards will have value of <9
- */
- /*
- PASTRY.logPrint(
- " x : " + event.accelerationIncludingGravity.x +
- "<br/> y : " + event.accelerationIncludingGravity.y +
- "<br/> z : " + event.accelerationIncludingGravity.z
- );
- */
- }
- updateGamePad (): void {
- this.updateGamePadPlayer(this.GAMEPAD_ONE_INDEX);
- this.updateGamePadPlayer(this.GAMEPAD_TWO_INDEX);
- this.updateGamePadPlayer(this.GAMEPAD_THREE_INDEX);
- this.updateGamePadPlayer(this.GAMEPAD_FOUR_INDEX);
- }
- updateGamePadPlayer(GAMEPAD_PLAYER_INDEX): void {
- this.GAMEPAD = navigator.getGamepads()[GAMEPAD_PLAYER_INDEX];
- if (this.GAMEPAD) {
- var gamePadEventSet:EventSet = InputManager.GAMEPADS[GAMEPAD_PLAYER_INDEX];
- for (var i = 0; i < this.GAMEPAD.buttons.length; i++) {
- switch (i) {
- case GAMEPAD_XBOX.BUTTON_A:
- gamePadEventSet.action = this.GAMEPAD.buttons[i].pressed;
- break;
- };
- };
- for (var i = 0; i < this.GAMEPAD.axes.length; i++) {
- switch (i) {
- case GAMEPAD_XBOX.STICK_LEFT_HORIZONTAL:
- gamePadEventSet.moveLeft = this.GAMEPAD.axes[i] < -0.3;
- gamePadEventSet.moveRight = this.GAMEPAD.axes[i] > 0.3;
- break;
- case GAMEPAD_XBOX.STICK_LEFT_VERTICAL:
- gamePadEventSet.moveDown = this.GAMEPAD.axes[i] > 0.3;
- gamePadEventSet.moveUp = this.GAMEPAD.axes[i] < -0.3;
- break;
- }
- }
- }
- }
- update(): void {
- if (this.GamepadSupported) {
- this.updateGamePad();
- }
- }
- addListeners(): void {
- window.addEventListener("touchstart", this.readTouchStart, false);
- window.addEventListener("touchmove", this.readTouchStart, false);
- window.addEventListener("touchend", this.readTouchEnd, false);
- window.addEventListener("keydown", this.readKeyboardButtonPressed, false);
- window.addEventListener("keyup", this.readKeyboardButtonLifted, false);
- }
- checkGamePadSupport(): void {
- this.GamepadSupported = "getGamepads" in navigator;
- }
- setupTouchEvents(): void {
- InputManager.touchIcon = document.getElementById("controller");
- InputManager.touchEvents.available = "ontouchend" in document;
- if (InputManager.touchEvents.available) {
- InputManager.touchIcon.style.display = "inline";
- }
- }
- init(): void {
- this.checkGamePadSupport();
- this.addListeners();
- this.setupTouchEvents();
- this.onResize();
- }
- }
- export class SpriteManager {
- static textureLength: number = 16;
- static centerOffset: number = SpriteManager.textureLength / -2;
- static indexCounter: number = 0;
- static getIndexPos(): number {
- var pos = SpriteManager.indexCounter * SpriteManager.textureLength;
- SpriteManager.indexCounter++;
- return pos;
- }
- }
- export enum SpriteIndexs {
- none = -1,
- muffinFrontIdle = SpriteManager.getIndexPos(),
- muffinFrontBlink1 = SpriteManager.getIndexPos(),
- muffinFrontBlink2 = SpriteManager.getIndexPos(),
- muffinLeftIdle = SpriteManager.getIndexPos(),
- muffinLeftBlink1 = SpriteManager.getIndexPos(),
- muffinLeftBlink2 = SpriteManager.getIndexPos(),
- muffinRightIdle = SpriteManager.getIndexPos(),
- muffinRightBlink1 = SpriteManager.getIndexPos(),
- muffinRightBlink2 = SpriteManager.getIndexPos(),
- muffinBackIdle = SpriteManager.getIndexPos(),
- toasterPastryVanilla = SpriteManager.getIndexPos(),
- toasterPastryChocolate = SpriteManager.getIndexPos(),
- toaster = SpriteManager.getIndexPos(),
- tileDirtLight = SpriteManager.getIndexPos(),
- tileDirtDark = SpriteManager.getIndexPos(),
- tileGrass = SpriteManager.getIndexPos(),
- tileChest = SpriteManager.getIndexPos(),
- }
- export class CharacterAnimation {
- constructor( public idleLeft: SpriteIndexs, public idleRight: SpriteIndexs, public idleFront: SpriteIndexs, public idleBack: SpriteIndexs) {
- }
- }
- export enum CharacterType {
- muffin = 0,
- toaster,
- }
- export class AnimationManager {
- static spriteSets: Array<CharacterAnimation> = [
- /*muffin */ new CharacterAnimation(SpriteIndexs.muffinLeftIdle, SpriteIndexs.muffinRightIdle, SpriteIndexs.muffinFrontIdle, SpriteIndexs.muffinBackIdle),
- /*toaster*/
- ];
- }
- export class StatsType {
- static normal: Array<number> = [100, 100, 100, 100, 55];
- static tank: Array<number> = [300, 80, 200, 100, 100];
- static melee: Array<number> = [90, 300, 100, 100, 100];
- }
- export class Stats {
- health: number;
- attack: number;
- armor: number;
- money: number;
- movementSpeed: number;
- constructor(params: Array<number>) {
- this.health = params[0];
- this.attack = params[1];
- this.armor = params[2];
- this.money = params[3];
- this.movementSpeed = params[4];
- }
- }
- export class Events {
- activate: boolean = false;
- previous: boolean = false;
- repeated: boolean = false;
- toggleActivation(condition: boolean): void {
- this.previous = this.activate;
- this.activate = condition;
- this.repeated = this.previous === this.activate;
- }
- turnActivated(): void {
- this.previous = this.activate;
- this.activate = true;
- this.repeated = this.previous === this.activate;
- }
- deActivate(): void {
- this.previous = this.activate;
- this.activate = false;
- this.repeated = this.previous === this.activate;
- }
- activateRepeated(): void {
- this.repeated = true;
- }
- deActivateRepeated(): void {
- this.repeated = false;
- }
- }
- export class Player {
- stats: Stats;
- animation: CharacterAnimation;
- currentAnimationFrame: SpriteIndexs;
- bounds: Bounds = new Bounds();
- velocity: Position = new Position();
- eventMoveLeft = new Events();
- eventMoveRight = new Events();
- eventMoveUp = new Events();
- eventMoveDown = new Events();
- eventAction = new Events();
- private tileRegion: Bounds = new Bounds();
- constructor(public name: string, x: number, y: number, public spriteIdentity, public statsType: Array<number>, public animationID: CharacterType) {
- this.bounds.min = new Position(x, y);
- this.bounds.max = new Position(x + SpriteManager.textureLength, y + SpriteManager.textureLength);
- this.stats = new Stats(statsType);
- this.animation = AnimationManager.spriteSets[animationID];
- this.currentAnimationFrame = this.animation.idleFront;
- }
- private setX(x): void {
- this.bounds.min.setX(x);
- this.updateMaxX();
- }
- private setY(y): void {
- this.bounds.min.setY(y);
- this.updateMaxY();
- }
- private updateMaxY(): void {
- this.bounds.max.setY(this.bounds.min.y + SpriteManager.textureLength);
- }
- private updateMaxX(): void {
- this.bounds.max.setX(this.bounds.min.x + SpriteManager.textureLength);
- }
- private setAnimation(frame: SpriteIndexs): void {
- this.currentAnimationFrame = frame;
- }
- private updateX(): void {
- this.bounds.min.updateX(TimeManager.lapse * this.velocity.x);
- this.updateMaxX();
- }
- private updateY(): void {
- this.bounds.min.updateY(TimeManager.lapse * this.velocity.y);
- this.updateMaxY();
- }
- private updateVelocityX(direction: number): void {
- this.velocity.setX(direction * this.stats.movementSpeed);
- this.updateX();
- }
- private updateVelocityY(direction: number): void {
- this.velocity.setY(direction * this.stats.movementSpeed);
- this.updateY();
- }
- private updateCollisionRegion(): void {
- this.tileRegion.min.x = ((this.bounds.min.x / SpriteManager.textureLength) | 0) - 1;
- this.tileRegion.min.y = ((this.bounds.min.y / SpriteManager.textureLength) | 0) - 1;
- this.tileRegion.max.x = ((this.bounds.max.x / SpriteManager.textureLength) | 0)+ 1;
- this.tileRegion.max.y = ((this.bounds.max.y / SpriteManager.textureLength) | 0) + 1;
- }
- private checkAABBcollision(tileX: number, tileY: number): boolean {
- return (
- (this.bounds.min.x < tileX + SpriteManager.textureLength) &&
- (this.bounds.min.y < tileY + SpriteManager.textureLength) &&
- (this.bounds.max.x > tileX) &&
- (this.bounds.max.y > tileY)
- );
- }
- updatePosition(world: World): void {
- if (this.eventMoveLeft.activate !== this.eventMoveRight.activate) {
- if (this.eventMoveLeft.activate) {
- this.updateVelocityX(-1);
- this.setAnimation(this.animation.idleLeft)
- } else if (this.eventMoveRight.activate) {
- this.updateVelocityX(1);
- this.setAnimation(this.animation.idleRight)
- }
- this.updateCollisionRegion();
- for (var x: number = this.tileRegion.min.x; x < this.tileRegion.max.x; x++) {
- for (var y: number = this.tileRegion.min.y; y < this.tileRegion.max.y; y++) {
- if (world.validPos(x, y) && world.solidPos(x, y, WorldLayer.backGround)){
- var tileCoordX: number = x * SpriteManager.textureLength;
- var tileCoordY: number = y * SpriteManager.textureLength;
- if(this.checkAABBcollision(tileCoordX, tileCoordY)) {
- if(this.velocity.x > 0) {
- this.setX(tileCoordX - SpriteManager.textureLength);
- } else {
- this.setX(tileCoordX + SpriteManager.textureLength);
- }
- }
- }
- }
- }
- } else {
- this.updateVelocityX(0);
- this.setX(this.bounds.min.x | 0);
- }
- if (this.eventMoveUp.activate !== this.eventMoveDown.activate) {
- if (this.eventMoveUp.activate) {
- this.updateVelocityY(-1);
- this.setAnimation(this.animation.idleBack)
- } else if (this.eventMoveDown.activate) {
- this.updateVelocityY(1);
- this.setAnimation(this.animation.idleFront)
- }
- this.updateCollisionRegion();
- for (var x: number = this.tileRegion.min.x; x < this.tileRegion.max.x; x++) {
- for (var y: number = this.tileRegion.min.y; y < this.tileRegion.max.y; y++) {
- if (world.validPos(x, y) && world.solidPos(x, y, WorldLayer.backGround)) {
- var tileCoordX: number = x * SpriteManager.textureLength;
- var tileCoordY: number = y * SpriteManager.textureLength;
- if (this.checkAABBcollision(tileCoordX, tileCoordY)) {
- if (this.velocity.y > 0) {
- this.setY(tileCoordY - SpriteManager.textureLength);
- } else {
- this.setY(tileCoordY + SpriteManager.textureLength);
- }
- }
- }
- }
- }
- } else {
- this.updateVelocityY(0);
- this.setY(this.bounds.min.y | 0);
- }
- if (this.bounds.min.x < 0) {
- this.updateVelocityX(0);
- this.setX(0);
- }
- if (this.bounds.min.y < 0) {
- this.updateVelocityY(0);
- this.setY(0);
- }
- }
- }
- export enum PlayerIndex {
- one = 0,
- two = 1,
- three = 2,
- four = 5,
- }
- export class EntityManager {
- playerOne: Player = new Player("FluffyMuffin", 10, 10, null, StatsType.normal, CharacterType.muffin);
- playerTwo: Player;
- playerThree: Player;
- playerFour: Player;
- private world: World;
- private updatePlayer(currentPlayer: Player, index: PlayerIndex): void {
- switch (index) {
- case PlayerIndex.one:
- currentPlayer.eventMoveLeft.toggleActivation(
- InputManager.keyBoardEvents.moveLeft || InputManager.GAMEPADS[index].moveLeft || InputManager.touchEvents.moveLeft);
- currentPlayer.eventMoveRight.toggleActivation(
- InputManager.keyBoardEvents.moveRight || InputManager.GAMEPADS[index].moveRight || InputManager.touchEvents.moveRight);
- currentPlayer.eventMoveUp.toggleActivation(
- InputManager.keyBoardEvents.moveUp || InputManager.GAMEPADS[index].moveUp || InputManager.touchEvents.moveUp);
- currentPlayer.eventMoveDown.toggleActivation(
- InputManager.keyBoardEvents.moveDown || InputManager.GAMEPADS[index].moveDown || InputManager.touchEvents.moveDown);
- currentPlayer.eventAction.toggleActivation(
- InputManager.keyBoardEvents.action || InputManager.GAMEPADS[index].action || InputManager.touchEvents.action);
- break;
- default:
- currentPlayer.eventMoveLeft.toggleActivation(InputManager.GAMEPADS[index].moveLeft);
- currentPlayer.eventMoveRight.toggleActivation(InputManager.GAMEPADS[index].moveRight);
- currentPlayer.eventMoveUp.toggleActivation(InputManager.GAMEPADS[index].moveUp);
- currentPlayer.eventMoveDown.toggleActivation(InputManager.GAMEPADS[index].moveDown);
- currentPlayer.eventAction.toggleActivation(InputManager.GAMEPADS[index].action);
- }
- currentPlayer.updatePosition(this.world);
- }
- private updatePlayerEntities(): void {
- this.updatePlayer(this.playerOne, PlayerIndex.one);
- }
- update(world: World): void {
- this.world = world;
- this.updatePlayerEntities();
- }
- }
- export class TextureManager {
- private fileImageData: any;
- private fileImageDimensions: Dimension = new Dimension();
- private fileImageScaledDimensions: Dimension = new Dimension();
- public textureLength: number = SpriteManager.textureLength;
- public textureScale: number = 1;
- public spriteSheetCanvas: any;
- private spriteSheetContext: any;
- constructor(public filePath: string = "resources/sprites/spritesheet.png") {
- }
- setupCanvas(): void {
- this.spriteSheetCanvas = document.createElement('canvas');
- this.spriteSheetContext = this.spriteSheetCanvas.getContext('2d');
- }
- resizeCanvas(width: number, height: number): void {
- this.spriteSheetCanvas.width = width;
- this.spriteSheetCanvas.height = height;
- }
- generateUnScaledImgData(fileImage): void {
- this.fileImageDimensions.setDimensions(fileImage.width, fileImage.height);
- this.resizeCanvas(this.fileImageDimensions.width, this.fileImageDimensions.height);
- this.spriteSheetContext.drawImage(fileImage, 0, 0);
- this.fileImageData = this.spriteSheetContext.getImageData(0, 0, this.fileImageDimensions.width, this.fileImageDimensions.height).data;
- }
- setScale(scaleMutiplier: number): void {
- this.textureScale = (scaleMutiplier | 0);
- this.textureLength = this.textureScale * SpriteManager.textureLength;
- }
- upScaleSpriteSheet(scaleMutiplier: number): void {
- /// <summary>
- /// Scales the sprite sheet every time
- /// </summary>
- /// <param name="scaleMutiplier"></param>
- this.setScale(scaleMutiplier);
- this.fileImageScaledDimensions.setDimensions(this.fileImageDimensions.width * this.textureScale, this.fileImageDimensions.height * this.textureScale)
- this.resizeCanvas(this.fileImageScaledDimensions.width, this.fileImageScaledDimensions.height);
- var canvasUpscalePixels = this.spriteSheetContext.getImageData(0, 0, this.fileImageScaledDimensions.width, this.fileImageScaledDimensions.height);
- var iscale = 1.0 / this.textureScale;
- var indexScaled = 0;
- // (T << shifter == T * spriteSheet.width * 4)
- var shifter = (Math.log(this.fileImageDimensions.width) * 1.442695040888964 + 2) | 0;
- var y = 0;
- while (y < this.fileImageScaledDimensions.height) {
- var a = (y * iscale) << shifter;
- for (var c = this.textureScale; c--;) {
- for (var x = 0; x < this.fileImageScaledDimensions.width;) {
- var index = ((x * iscale) << 2) + a;
- var R = this.fileImageData[index++];
- var G = this.fileImageData[index++];
- var B = this.fileImageData[index++];
- var A = this.fileImageData[index];
- for (var z = this.textureScale; z--;) {
- canvasUpscalePixels.data[indexScaled++] = R;
- canvasUpscalePixels.data[indexScaled++] = G;
- canvasUpscalePixels.data[indexScaled++] = B;
- canvasUpscalePixels.data[indexScaled++] = A;
- }
- x += this.textureScale;
- }
- y++;
- }
- }
- this.spriteSheetContext.putImageData(canvasUpscalePixels, 0, 0);
- }
- load(): void {
- var fileImage = new Image();
- fileImage.src = this.filePath;
- fileImage.onload = () => {
- this.generateUnScaledImgData(fileImage);
- PASTRY.resourcesLoaded();
- }
- }
- init(): void {
- this.setupCanvas();
- this.load();
- }
- }
- export enum WorldLayer {
- backGround = 0,
- foreGround = 1,
- }
- export class World {
- public map: Array<SpriteIndexs>[][] = [];
- public dimensions: Dimension;
- constructor(width: number, height: number) {
- this.dimensions = new Dimension(width, height);
- for (var x = 0; x < width; x++) {
- this.map[x] = [];
- for (var y = 0; y < height; y++) {
- this.map[x][y] = [];
- }
- }
- }
- public setPos(x: number, y: number, z: WorldLayer, type: SpriteIndexs) {
- if (x >= 0 && x < this.dimensions.width && y >= 0 && y < this.dimensions.height) {
- this.map[x][y][z] = type;
- }
- }
- public solidPos(x: number, y: number, z: WorldLayer): boolean {
- switch(this.map[x][y][z]) {
- case SpriteIndexs.tileDirtLight:
- case SpriteIndexs.tileDirtDark:
- return true;
- break;
- default:
- return false;
- }
- }
- public emptyPos(x: number, y: number, z: WorldLayer): boolean {
- return this.map[x][y][z] === SpriteIndexs.none;
- }
- public validPos(x: number, y: number): boolean {
- return x >= 0 && x < this.dimensions.width && y >= 0 && y < this.dimensions.height;
- }
- public getPos(x: number, y: number, z: WorldLayer): SpriteIndexs {
- return this.map[x][y][z];
- }
- }
- export class WorldGenerator {
- private seed: number;
- private max: number = Math.pow(2, 32);
- private birthLimit: number = 4;
- private deathLimit: number = 3;
- private stepCount: number = 4;
- private initalChance: number = 0.45;
- public setSeed(seed: number = Math.round(Math.random() * this.max)): void {
- this.seed = seed;
- }
- public getSeed(): number {
- return this.seed;
- }
- public random(): number {
- this.seed += (this.seed * this.seed) | 5;
- return (this.seed >>> 32) / this.max;
- }
- public randomRanged(min: number, max: number): number {
- return ((this.random() * (max - min + 1))|0) + min;
- }
- private initalizeWorld(world: World) {
- world.map = [];
- for (var x: number = 0; x < world.dimensions.width; x++) {
- world.map[x] = [];
- for (var y: number = 0; y < world.dimensions.height; y++) {
- world.map[x][y] = [SpriteIndexs.none, SpriteIndexs.none];
- }
- }
- }
- private generateSimple(world: World) {
- for (var x = 0; x < world.dimensions.width; x++) {
- for (var y = 0; y < world.dimensions.height; y++) {
- world.setPos(x, y, WorldLayer.backGround, SpriteIndexs.tileGrass);
- }
- }
- }
- private generateCaveSystem(world: World): void {
- var map: boolean[][] = [];
- map = this.sampleMapSetup(map, world.dimensions);
- for (var i: number = 0; i < this.stepCount; i++) {
- map = this.sampleMapCycle(map);
- }
- this.placeTreasure(map, world);
- this.applySampleMap(map, world);
- }
- private placeTreasure(map: boolean[][], world: World) {
- var rarity: number = 5;
- for (var x: number = 0; x < world.dimensions.width; x++) {
- for (var y: number = 0; y < world.dimensions.height; y++) {
- if (!map[x][y]) {
- var count: number = this.countSurroundingSolids(map, x, y);
- if(count >= rarity) {
- world.setPos(x, y, WorldLayer.foreGround, SpriteIndexs.tileChest);
- }
- }
- }
- }
- }
- private applySampleMap(map: boolean[][], world: World): void {
- //Place map
- for (var x: number = 0; x < world.dimensions.width; x++) {
- for (var y: number = 0; y < world.dimensions.height; y++) {
- if (map[x][y]) {
- world.setPos(x, y, WorldLayer.backGround, SpriteIndexs.tileDirtLight);
- } else {
- world.setPos(x, y, WorldLayer.backGround, SpriteIndexs.tileGrass);
- }
- }
- }
- }
- private countSurroundingSolids(map: boolean[][], x: number, y: number): number {
- var count: number = 0;
- for (var ix: number = -1; ix < 2; ix++) {
- for (var iy: number = -1; iy < 2; iy++) {
- var tileX: number = x + ix;
- var tileY: number = y + iy;
- if (!(ix == 0 && iy == 0)) {
- if (tileX < 0 || tileY < 0 || tileX >= map.length || tileY >= map[0].length) {
- count++;
- } else if (map[tileX][tileY]) {
- count++;
- }
- }
- }
- }
- return count;
- }
- private sampleMapCycle(map: boolean[][]): boolean[][] {
- var newMap: boolean[][] = [];
- for (var x: number = 0, w: number = map.length, h: number = map[0].length; x < w; x++) {
- newMap[x] = [];
- for (var y:number = 0; y < h; y++) {
- var count: number = this.countSurroundingSolids(map, x, y);
- newMap[x][y] = (map[x][y]) ? !(count < this.deathLimit) : (count > this.birthLimit);
- }
- }
- return newMap;
- }
- private sampleMapSetup(map: boolean[][], dimensions: Dimension): boolean[][]{
- for (var x = 0; x < dimensions.width; x++) {
- map[x] = [];
- for (var y = 0; y < dimensions.height; y++) {
- map[x][y] = this.random() < this.initalChance;
- }
- }
- return map;
- }
- public generateWorld(seed: number, width: number, height: number): World {
- var world: World = new World(width, height);
- this.setSeed(seed);
- this.initalizeWorld(world);
- this.generateCaveSystem(world);
- return world;
- }
- }
- export class WorldManager {
- public currentWorld: World;
- private generator: WorldGenerator = new WorldGenerator();
- public setWorld(seed: number, width: number, height: number): void {
- this.currentWorld = this.generator.generateWorld(seed, width, height);
- }
- }
- export class ScreenManager {
- windowDimensions: PastryCore.Dimension = new PastryCore.Dimension(window.innerWidth, window.innerHeight);
- static defaultDimension: PastryCore.Dimension = new PastryCore.Dimension(240, 160);
- currentDimension: PastryCore.Dimension = new PastryCore.Dimension(240, 160);
- scale: number = 1;
- fullscreen: boolean = false;
- fullScreenCapable: boolean = false;
- constructor() {
- }
- static toggleFullScreen(): void {
- if ((document.fullScreenElement && document.fullScreenElement !== null) || document.mozFullScreen || document.webkitIsFullScreen) {
- if (document.exitFullscreen) {
- document.exitFullscreen();
- } else if (document.msExitFullscreen) {
- document.msExitFullscreen();
- } else if (document.mozCancelFullScreen) {
- document.mozCancelFullScreen();
- } else if (document.webkitExitFullscreen) {
- document.webkitExitFullscreen();
- }
- } else {
- if (document.documentElement.requestFullscreen) {
- document.documentElement.requestFullscreen();
- } else if (document.documentElement.msRequestFullscreen) {
- document.documentElement.msRequestFullscreen();
- } else if (document.documentElement.mozRequestFullScreen) {
- document.documentElement.mozRequestFullScreen();
- } else if (document.documentElement.webkitRequestFullscreen) {
- document.documentElement.webkitRequestFullscreen();
- }
- }
- }
- updateWindowDimensions(): void {
- this.windowDimensions.setDimensions(window.innerWidth, window.innerHeight);
- }
- updateDimensions(): void {
- this.currentDimension.setDimensions(ScreenManager.defaultDimension.width * this.scale, ScreenManager.defaultDimension.height * this.scale);
- }
- updateScale(): boolean {
- var displayScaleX: number = (this.windowDimensions.width / ScreenManager.defaultDimension.width) | 0;
- var displayScaleY: number = (this.windowDimensions.height / ScreenManager.defaultDimension.height) | 0;
- var before: number = this.scale;
- this.scale = (displayScaleX <= displayScaleY) ? displayScaleX : displayScaleY;
- if (this.scale < 1) {
- this.scale = 1;
- }
- console.log(this.scale);
- return before !== this.scale;
- }
- }
- export class Camera {
- public tileIndex: Position = new Position();
- public tilePos: Position = new Position();
- public worldOffset: Position = new Position();
- public screenTileCapacity: Dimension = new Dimension();
- public spriteCentered: Position = new Position();
- public focusEntity: boolean = true;
- constructor() {
- this.screenTileCapacity.width = ((ScreenManager.defaultDimension.width / SpriteManager.textureLength) | 0) + 2;//11
- this.screenTileCapacity.height = ((ScreenManager.defaultDimension.height / SpriteManager.textureLength) | 0) + 2;//16
- this.spriteCentered.x = ((ScreenManager.defaultDimension.width/2)|0) - (SpriteManager.textureLength / 2);
- this.spriteCentered.y = ((ScreenManager.defaultDimension.height/2)|0) - (SpriteManager.textureLength / 2);
- }
- update(entityFocus: Position): void {
- this.worldOffset.x = entityFocus.x - this.spriteCentered.x;
- this.worldOffset.y = entityFocus.y - this.spriteCentered.y;
- this.tileIndex.x = ((this.worldOffset.x / SpriteManager.textureLength) | 0) - 1;
- this.tileIndex.y = ((this.worldOffset.y / SpriteManager.textureLength) | 0) - 1;
- this.tilePos.x = this.tileIndex.x * SpriteManager.textureLength - this.worldOffset.x;
- this.tilePos.y = this.tileIndex.y * SpriteManager.textureLength - this.worldOffset.y;
- }
- }
- export class Renderer {
- private textureManager: TextureManager = new TextureManager();
- private screenManager: ScreenManager = new ScreenManager();
- private camera: Camera = new Camera();
- private canvas: any;
- private context: any;
- private bufferCanvas: any;
- private bufferContext: any;
- private canvasId: string = "appCanvas";
- private updateCanvasDimensions(): void {
- this.canvas.width = this.bufferCanvas.width = this.screenManager.currentDimension.width;
- this.canvas.height = this.bufferCanvas.height = this.screenManager.currentDimension.height;
- document.getElementById(this.canvasId).setAttribute('width', this.canvas.width);
- document.getElementById(this.canvasId).setAttribute('height', this.canvas.height);
- }
- private centerCanvas(): void {
- this.canvas.style.left = (((this.screenManager.windowDimensions.width - this.screenManager.currentDimension.width) / 2) | 0) + "px";
- this.canvas.style.top = (((this.screenManager.windowDimensions.height - this.screenManager.currentDimension.height) / 2) | 0) + "px";
- }
- resize():void {
- this.screenManager.updateWindowDimensions();
- if (this.screenManager.updateScale()) {
- this.textureManager.upScaleSpriteSheet(this.screenManager.scale);
- }
- this.screenManager.updateDimensions();
- this.updateCanvasDimensions();
- this.centerCanvas();
- }
- private addListeners(): void {
- }
- private initalizeBufferedContext (): void {
- this.bufferContext.font = '10pt Calibri';
- this.bufferContext.textAlign = 'center';
- this.bufferContext.fillStyle = 'white';
- }
- private createCanvas (id): any {
- var canvas = document.getElementById(this.canvasId);
- if (canvas === null) {
- canvas = document.createElement('canvas');
- canvas.id = this.canvasId;
- canvas.className = "canvasCrispRendering";
- document.body.appendChild(this.canvas);
- };
- return canvas;
- }
- private setupCanvas(): void {
- this.canvas = this.createCanvas(this.canvasId);
- this.context = this.canvas.getContext("2d");
- this.bufferCanvas = document.createElement('canvas');
- this.bufferContext = this.bufferCanvas.getContext('2d');
- this.initalizeBufferedContext();
- }
- init(): void {
- this.addListeners();
- this.setupCanvas();
- this.textureManager.init();
- }
- refreshBuffer(): void {
- this.bufferContext.clearRect(0, 0, this.bufferCanvas.width, this.bufferCanvas.height);
- }
- render(): void {
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
- this.context.drawImage(this.bufferCanvas, 0, 0);
- }
- drawInGame(entityManager: EntityManager, world: World): void {
- this.camera.update(entityManager.playerOne.bounds.min);
- this.drawTileMap(world);
- this.drawPlayerEntity(entityManager.playerOne, true);
- this.drawHUD();
- this.drawMiniMap(5, 100, world);
- //this.drawText("MinPos: " + entityManager.playerOne.bounds.min.x + " : " + entityManager.playerOne.bounds.min.y, 10, 20, false);
- //this.drawText("MaxPos: " + entityManager.playerOne.bounds.max.x + " : " + entityManager.playerOne.bounds.max.y, 10, 30, false);
- }
- drawMiniMap(px: number, py: number, world: World): void {
- var counterX: number = 0;
- var counterY: number = 0;
- var scale: number = 1;
- for (var x: number = this.camera.tileIndex.x - 5, counterX = 0, xEnd: number = 10 + x + this.camera.screenTileCapacity.width, yEnd: number = 5 + this.camera.tileIndex.y + this.camera.screenTileCapacity.height; x < xEnd; x++, counterX++) {
- for (var y: number = this.camera.tileIndex.y - 5, counterY = 0; y < yEnd; y++, counterY++) {
- if (world.validPos(x, y)) {
- switch (world.getPos(x, y, WorldLayer.backGround)) {
- case SpriteIndexs.tileDirtLight:
- this.bufferContext.fillRect(px + counterX * scale, py + counterY * scale, scale, scale);
- break;
- }
- }
- }
- }
- }
- drawHUD(): void {
- this.drawText("FPS: " + TimeManager.fps, 10, 10, false);
- }
- private drawTileMap(world: World): void {
- for (var x:number = this.camera.tileIndex.x, xCounter: number = 0, xEnd: number = x + this.camera.screenTileCapacity.width; x < xEnd; x++, xCounter++) {
- for (var y: number = this.camera.tileIndex.y, yCounter: number = 0, yEnd: number = y + this.camera.screenTileCapacity.height; y < yEnd; y++, yCounter++) {
- if (world.validPos(x, y)) {
- this.drawSprite(world.getPos(x, y, PastryCore.WorldLayer.backGround), this.camera.tilePos.x + xCounter * PastryCore.SpriteManager.textureLength, this.camera.tilePos.y + yCounter * PastryCore.SpriteManager.textureLength);
- if(world.getPos(x, y, PastryCore.WorldLayer.foreGround) !== SpriteIndexs.none) {
- this.drawSprite(world.getPos(x, y, PastryCore.WorldLayer.foreGround), this.camera.tilePos.x + xCounter * PastryCore.SpriteManager.textureLength, this.camera.tilePos.y + yCounter * PastryCore.SpriteManager.textureLength);
- }
- }
- }
- }
- }
- private drawPlayerEntity(currentPlayer: Player, screenCentered: boolean) {
- if (screenCentered) {
- this.drawText(currentPlayer.name, this.camera.spriteCentered.x + 8, this.camera.spriteCentered.y - 9, true);
- this.drawSprite(currentPlayer.currentAnimationFrame, this.camera.spriteCentered.x, this.camera.spriteCentered.y);
- } else {
- this.drawText(currentPlayer.name, currentPlayer.bounds.min.x + 8, currentPlayer.bounds.min.y - 9, true);
- this.drawSprite(currentPlayer.currentAnimationFrame, currentPlayer.bounds.min.x, currentPlayer.bounds.min.y);
- }
- }
- private drawSprite(spriteIdentifier: SpriteIndexs, x: number, y: number): void {
- this.bufferContext.drawImage(
- this.textureManager.spriteSheetCanvas,
- spriteIdentifier * this.textureManager.textureScale, 0,
- this.textureManager.textureLength, this.textureManager.textureLength,
- x * this.textureManager.textureScale,
- y * this.textureManager.textureScale,
- this.textureManager.textureLength, this.textureManager.textureLength
- );
- }
- private drawText(text: string, x: number, y: number, centered: boolean): void {
- this.bufferContext.font = (4 * this.textureManager.textureScale) + 'pt Calibri';
- if (centered) {
- this.bufferContext.textAlign = 'center';
- } else {
- this.bufferContext.textAlign = 'left';
- }
- this.bufferContext.fillStyle = 'white';
- this.bufferContext.fillText(text, x * this.textureManager.textureScale, y * this.textureManager.textureScale);
- }
- }
- }
- interface PastryFrameWork {
- VERSION: number;
- engine: PastryCore.Engine;
- timeManager: PastryCore.TimeManager;
- inputManager: PastryCore.InputManager;
- gameManager: PastryCore.GameManager;
- entityManager: PastryCore.EntityManager;
- renderer: PastryCore.Renderer;
- worldManager: PastryCore.WorldManager;
- main(): void;
- loop(): void;
- resourcesLoaded(): void;
- }
- var PASTRY: PastryFrameWork = {
- VERSION: 1,
- engine: new PastryCore.Engine(),
- timeManager: new PastryCore.TimeManager(),
- inputManager: new PastryCore.InputManager(),
- gameManager: new PastryCore.GameManager(),
- renderer: new PastryCore.Renderer(),
- entityManager: new PastryCore.EntityManager(),
- worldManager: new PastryCore.WorldManager(),
- main: function (): void {
- PASTRY.renderer.init();
- },
- resourcesLoaded: function (): void {
- PastryCore.Engine.log("Resources loaded!");
- PASTRY.inputManager.init();
- window.onresize = () => {
- PASTRY.inputManager.onResize();
- PASTRY.renderer.resize();
- };
- PASTRY.renderer.resize();
- PASTRY.worldManager.setWorld(245 ,1000, 1000);
- PASTRY.loop();
- },
- loop: function (): void {
- PASTRY.timeManager.update();
- PASTRY.inputManager.update();
- PASTRY.renderer.refreshBuffer();
- switch(PASTRY.gameManager.currentState) {
- case PastryCore.GameStates.INGAME:
- PASTRY.entityManager.update(PASTRY.worldManager.currentWorld);
- PASTRY.renderer.drawInGame(PASTRY.entityManager, PASTRY.worldManager.currentWorld);
- break;
- case PastryCore.GameStates.LOADING:
- break;
- case PastryCore.GameStates.MAIN:
- break;
- case PastryCore.GameStates.PAUSED:
- break;
- }
- PASTRY.renderer.render();
- requestAnimationFrame(PASTRY.loop);
- }
- };
- PASTRY.main();
Advertisement
Add Comment
Please, Sign In to add comment