added tilemaps and a resource loader
This commit is contained in:
parent
851fd050a7
commit
f0bb31f61e
33
src/DataTypes/Tilesets/TiledData.ts
Normal file
33
src/DataTypes/Tilesets/TiledData.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
export class TiledTilemapData {
|
||||||
|
height: number;
|
||||||
|
width: number;
|
||||||
|
orientation: string;
|
||||||
|
layers: TiledLayerData[];
|
||||||
|
tilesets: TiledTilesetData[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TiledTilesetData {
|
||||||
|
columns: number;
|
||||||
|
tilewidth: number;
|
||||||
|
tileheight: number;
|
||||||
|
tilecount: number;
|
||||||
|
firstgid: number;
|
||||||
|
imageheight: number;
|
||||||
|
imagewidth: number;
|
||||||
|
margin: number;
|
||||||
|
spacing: number;
|
||||||
|
name: string;
|
||||||
|
image: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TiledLayerData {
|
||||||
|
data: number[];
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
name: string;
|
||||||
|
opacity: number;
|
||||||
|
visible: boolean;
|
||||||
|
}
|
||||||
|
|
80
src/DataTypes/Tilesets/Tileset.ts
Normal file
80
src/DataTypes/Tilesets/Tileset.ts
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
import Vec2 from "../Vec2";
|
||||||
|
import { TiledTilesetData } from "./TiledData";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The data representation of a Tileset for the game engine. This represents one image,
|
||||||
|
* with a startIndex if required (as it is with Tiled using two images in one tilset).
|
||||||
|
*/
|
||||||
|
export default class Tileset {
|
||||||
|
protected imageUrl: string;
|
||||||
|
protected image: HTMLImageElement = null;
|
||||||
|
protected imageSize: Vec2;
|
||||||
|
protected startIndex: number;
|
||||||
|
protected endIndex: number;
|
||||||
|
protected tileSize: Vec2;
|
||||||
|
protected numRows: number;
|
||||||
|
protected numCols: number;
|
||||||
|
|
||||||
|
constructor(tilesetData: TiledTilesetData){
|
||||||
|
this.initFromTiledData(tilesetData);
|
||||||
|
}
|
||||||
|
|
||||||
|
initFromTiledData(tiledData: TiledTilesetData){
|
||||||
|
this.numRows = tiledData.tilecount/tiledData.columns;
|
||||||
|
this.numCols = tiledData.columns;
|
||||||
|
this.startIndex = tiledData.firstgid;
|
||||||
|
this.endIndex = this.startIndex + tiledData.tilecount - 1;
|
||||||
|
this.tileSize = new Vec2(tiledData.tilewidth, tiledData.tilewidth);
|
||||||
|
this.imageUrl = tiledData.image;
|
||||||
|
this.imageSize = new Vec2(tiledData.imagewidth, tiledData.imageheight);
|
||||||
|
}
|
||||||
|
|
||||||
|
getImageUrl(): string {
|
||||||
|
return this.imageUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
getImage(): HTMLImageElement {
|
||||||
|
return this.image;
|
||||||
|
}
|
||||||
|
|
||||||
|
setImage(image: HTMLImageElement){
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
getStartIndex(): number {
|
||||||
|
return this.startIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
getTileSize(): Vec2 {
|
||||||
|
return this.tileSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
getNumRows(): number {
|
||||||
|
return this.numRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
getNumCols(): number {
|
||||||
|
return this.numCols;
|
||||||
|
}
|
||||||
|
|
||||||
|
isReady(): boolean {
|
||||||
|
return this.image !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasTile(tileIndex: number): boolean {
|
||||||
|
return tileIndex >= this.startIndex && tileIndex <= this.endIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTile(ctx: CanvasRenderingContext2D, tileIndex: number, dataIndex: number, worldSize: Vec2, origin: Vec2): void {
|
||||||
|
let index = tileIndex - this.startIndex;
|
||||||
|
let row = Math.floor(index / this.numCols);
|
||||||
|
let col = index % this.numCols;
|
||||||
|
let width = this.tileSize.x;
|
||||||
|
let height = this.tileSize.y;
|
||||||
|
let left = col * width;
|
||||||
|
let top = row * height;
|
||||||
|
let x = (dataIndex % worldSize.x) * width * 4;
|
||||||
|
let y = Math.floor(dataIndex / worldSize.x) * height * 4;
|
||||||
|
ctx.drawImage(this.image, left, top, width, height, x - origin.x, y - origin.y, width * 4, height * 4);
|
||||||
|
}
|
||||||
|
}
|
37
src/GameState/Factories/TilemapFactory.ts
Normal file
37
src/GameState/Factories/TilemapFactory.ts
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import Scene from "../Scene";
|
||||||
|
import Viewport from "../../SceneGraph/Viewport";
|
||||||
|
import Tilemap from "../../Nodes/Tilemap"
|
||||||
|
import ResourceManager from "../../ResourceManager/ResourceManager";
|
||||||
|
import { TiledTilemapData } from "../../DataTypes/Tilesets/TiledData";
|
||||||
|
import StringUtils from "../../Utils/StringUtils";
|
||||||
|
|
||||||
|
export default class TilemapFactory {
|
||||||
|
private scene: Scene;
|
||||||
|
private viewport: Viewport;
|
||||||
|
private resourceManager: ResourceManager;
|
||||||
|
|
||||||
|
constructor(scene: Scene, viewport: Viewport){
|
||||||
|
this.scene = scene;
|
||||||
|
this.resourceManager = ResourceManager.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
add<T extends Tilemap>(constr: new (...a: any) => T, path: string, ...args: any): void {
|
||||||
|
this.resourceManager.loadTilemap(path, (tilemapData: TiledTilemapData) => {
|
||||||
|
// For each of the layers in the tilemap, create a tilemap
|
||||||
|
for(let layer of tilemapData.layers){
|
||||||
|
let tilemap = new constr(tilemapData, layer);
|
||||||
|
|
||||||
|
// Add to scene
|
||||||
|
this.scene.addTilemap(tilemap);
|
||||||
|
|
||||||
|
// Load images for the tilesets
|
||||||
|
tilemap.getTilesets().forEach(tileset => {
|
||||||
|
let imagePath = StringUtils.getPathFromFilePath(path) + tileset.getImageUrl();
|
||||||
|
this.resourceManager.loadImage(imagePath, (path: string, image: HTMLImageElement) => {
|
||||||
|
tileset.setImage(image);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,30 +3,36 @@ import Viewport from "../SceneGraph/Viewport";
|
||||||
import SceneGraph from "../SceneGraph/SceneGraph";
|
import SceneGraph from "../SceneGraph/SceneGraph";
|
||||||
import SceneGraphArray from "../SceneGraph/SceneGraphArray";
|
import SceneGraphArray from "../SceneGraph/SceneGraphArray";
|
||||||
import CanvasNode from "../Nodes/CanvasNode";
|
import CanvasNode from "../Nodes/CanvasNode";
|
||||||
import CavnasNodeFactory from "./Factories/CanvasNodeFactory";
|
|
||||||
import CanvasNodeFactory from "./Factories/CanvasNodeFactory";
|
import CanvasNodeFactory from "./Factories/CanvasNodeFactory";
|
||||||
import GameState from "./GameState";
|
import GameState from "./GameState";
|
||||||
|
import Tilemap from "../Nodes/Tilemap";
|
||||||
|
import TilemapFactory from "./Factories/TilemapFactory";
|
||||||
|
|
||||||
export default class Scene {
|
export default class Scene {
|
||||||
private gameState: GameState;
|
private gameState: GameState;
|
||||||
private viewport: Viewport
|
private viewport: Viewport
|
||||||
private parallax: Vec2;
|
private parallax: Vec2;
|
||||||
sceneGraph: SceneGraph;
|
sceneGraph: SceneGraph;
|
||||||
|
private tilemaps: Array<Tilemap>;
|
||||||
private paused: boolean;
|
private paused: boolean;
|
||||||
private hidden: boolean;
|
private hidden: boolean;
|
||||||
|
|
||||||
// Factories
|
// Factories
|
||||||
public canvas: CavnasNodeFactory;
|
public canvasNode: CanvasNodeFactory;
|
||||||
|
public tilemap: TilemapFactory;
|
||||||
|
|
||||||
constructor(viewport: Viewport, gameState: GameState){
|
constructor(viewport: Viewport, gameState: GameState){
|
||||||
this.gameState = gameState;
|
this.gameState = gameState;
|
||||||
this.viewport = viewport;
|
this.viewport = viewport;
|
||||||
this.parallax = new Vec2(1, 1);
|
this.parallax = new Vec2(1, 1);
|
||||||
this.sceneGraph = new SceneGraphArray(this.viewport, this);
|
this.sceneGraph = new SceneGraphArray(this.viewport, this);
|
||||||
|
this.tilemaps = new Array<Tilemap>();
|
||||||
this.paused = false;
|
this.paused = false;
|
||||||
this.hidden = false;
|
this.hidden = false;
|
||||||
|
|
||||||
this.canvas = new CanvasNodeFactory(this, this.viewport);
|
// Factories
|
||||||
|
this.canvasNode = new CanvasNodeFactory(this, this.viewport);
|
||||||
|
this.tilemap = new TilemapFactory(this, this.viewport);
|
||||||
}
|
}
|
||||||
|
|
||||||
setPaused(pauseValue: boolean): void {
|
setPaused(pauseValue: boolean): void {
|
||||||
|
@ -71,6 +77,10 @@ export default class Scene {
|
||||||
this.sceneGraph.addNode(children);
|
this.sceneGraph.addNode(children);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addTilemap(tilemap: Tilemap): void {
|
||||||
|
this.tilemaps.push(tilemap);
|
||||||
|
}
|
||||||
|
|
||||||
update(deltaT: number): void {
|
update(deltaT: number): void {
|
||||||
if(!this.paused){
|
if(!this.paused){
|
||||||
this.viewport.update(deltaT);
|
this.viewport.update(deltaT);
|
||||||
|
@ -83,7 +93,17 @@ export default class Scene {
|
||||||
let visibleSet = this.sceneGraph.getVisibleSet();
|
let visibleSet = this.sceneGraph.getVisibleSet();
|
||||||
let viewportOrigin = this.viewport.getPosition();
|
let viewportOrigin = this.viewport.getPosition();
|
||||||
let origin = new Vec2(viewportOrigin.x*this.parallax.x, viewportOrigin.y*this.parallax.y);
|
let origin = new Vec2(viewportOrigin.x*this.parallax.x, viewportOrigin.y*this.parallax.y);
|
||||||
|
let size = this.viewport.getSize();
|
||||||
|
|
||||||
|
// Render visible set
|
||||||
visibleSet.forEach(node => node.render(ctx, origin));
|
visibleSet.forEach(node => node.render(ctx, origin));
|
||||||
|
|
||||||
|
// Render tilemaps
|
||||||
|
this.tilemaps.forEach(tilemap => {
|
||||||
|
if(tilemap.isReady()){
|
||||||
|
tilemap.render(ctx, origin, size);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -4,6 +4,7 @@ import InputHandler from "../Input/InputHandler";
|
||||||
import Recorder from "../Playback/Recorder";
|
import Recorder from "../Playback/Recorder";
|
||||||
import GameState from "../GameState/GameState";
|
import GameState from "../GameState/GameState";
|
||||||
import Debug from "../Debug/Debug";
|
import Debug from "../Debug/Debug";
|
||||||
|
import ResourceManager from "../ResourceManager/ResourceManager";
|
||||||
|
|
||||||
export default class GameLoop{
|
export default class GameLoop{
|
||||||
// The amount of time to spend on a physics step
|
// The amount of time to spend on a physics step
|
||||||
|
@ -36,6 +37,7 @@ export default class GameLoop{
|
||||||
private recorder: Recorder;
|
private recorder: Recorder;
|
||||||
private gameState: GameState;
|
private gameState: GameState;
|
||||||
private debug: Debug;
|
private debug: Debug;
|
||||||
|
private resourceManager: ResourceManager;
|
||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
this.maxFPS = 60;
|
this.maxFPS = 60;
|
||||||
|
@ -62,12 +64,15 @@ export default class GameLoop{
|
||||||
this.recorder = new Recorder();
|
this.recorder = new Recorder();
|
||||||
this.gameState = new GameState();
|
this.gameState = new GameState();
|
||||||
this.debug = Debug.getInstance();
|
this.debug = Debug.getInstance();
|
||||||
|
this.resourceManager = ResourceManager.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
private initializeCanvas(canvas: HTMLCanvasElement, width: number, height: number): CanvasRenderingContext2D {
|
private initializeCanvas(canvas: HTMLCanvasElement, width: number, height: number): CanvasRenderingContext2D {
|
||||||
canvas.width = width;
|
canvas.width = width;
|
||||||
canvas.height = height;
|
canvas.height = height;
|
||||||
return canvas.getContext("2d");
|
let ctx = canvas.getContext("2d");
|
||||||
|
ctx.imageSmoothingEnabled = false;
|
||||||
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
setMaxFPS(initMax: number): void {
|
setMaxFPS(initMax: number): void {
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import GameNode from "./GameNode";
|
import GameNode from "./GameNode";
|
||||||
import Vec2 from "../DataTypes/Vec2";
|
import Vec2 from "../DataTypes/Vec2";
|
||||||
import Viewport from "../SceneGraph/Viewport";
|
|
||||||
import Scene from "../GameState/Scene";
|
import Scene from "../GameState/Scene";
|
||||||
|
|
||||||
export default abstract class CanvasNode extends GameNode{
|
export default abstract class CanvasNode extends GameNode{
|
||||||
|
|
|
@ -10,7 +10,6 @@ export default class ColoredCircle extends CanvasNode{
|
||||||
super();
|
super();
|
||||||
this.position = new Vec2(RandUtils.randInt(0, 1000), RandUtils.randInt(0, 1000));
|
this.position = new Vec2(RandUtils.randInt(0, 1000), RandUtils.randInt(0, 1000));
|
||||||
this.color = RandUtils.randColor();
|
this.color = RandUtils.randColor();
|
||||||
console.log(this.color.toStringRGB());
|
|
||||||
this.size = new Vec2(50, 50);
|
this.size = new Vec2(50, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
42
src/Nodes/Tilemap.ts
Normal file
42
src/Nodes/Tilemap.ts
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
import Vec2 from "../DataTypes/Vec2";
|
||||||
|
import GameNode from "./GameNode";
|
||||||
|
import Tileset from "../DataTypes/Tilesets/Tileset";
|
||||||
|
import { TiledTilemapData, TiledLayerData } from "../DataTypes/Tilesets/TiledData"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents one layer of tiles
|
||||||
|
*/
|
||||||
|
export default abstract class Tilemap extends GameNode {
|
||||||
|
protected data: number[];
|
||||||
|
protected tilesets: Tileset[];
|
||||||
|
protected worldSize: Vec2;
|
||||||
|
|
||||||
|
constructor(tilemapData: TiledTilemapData, layerData: TiledLayerData){
|
||||||
|
super();
|
||||||
|
this.tilesets = new Array<Tileset>();
|
||||||
|
this.worldSize = new Vec2(0, 0);
|
||||||
|
this.init(tilemapData, layerData);
|
||||||
|
}
|
||||||
|
|
||||||
|
getTilesets(): Tileset[] {
|
||||||
|
return this.tilesets;
|
||||||
|
}
|
||||||
|
|
||||||
|
isReady(): boolean {
|
||||||
|
if(this.tilesets.length !== 0){
|
||||||
|
for(let tileset of this.tilesets){
|
||||||
|
if(!tileset.isReady()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the tileset using the data loaded from file
|
||||||
|
*/
|
||||||
|
abstract init(tilemapData: TiledTilemapData, layerData: TiledLayerData): void;
|
||||||
|
|
||||||
|
abstract render(ctx: CanvasRenderingContext2D, origin: Vec2, viewportSize: Vec2): void;
|
||||||
|
}
|
27
src/Nodes/Tilemaps/OrthogonalTilemap.ts
Normal file
27
src/Nodes/Tilemaps/OrthogonalTilemap.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import Tilemap from "../Tilemap";
|
||||||
|
import Vec2 from "../../DataTypes/Vec2";
|
||||||
|
import { TiledTilemapData, TiledLayerData } from "../../DataTypes/Tilesets/TiledData";
|
||||||
|
import Tileset from "../../DataTypes/Tilesets/Tileset";
|
||||||
|
|
||||||
|
|
||||||
|
export default class OrthogonalTilemap extends Tilemap {
|
||||||
|
init(tilemapData: TiledTilemapData, layer: TiledLayerData): void {
|
||||||
|
this.worldSize.set(tilemapData.width, tilemapData.height);
|
||||||
|
this.data = layer.data;
|
||||||
|
tilemapData.tilesets.forEach(tilesetData => this.tilesets.push(new Tileset(tilesetData)));
|
||||||
|
}
|
||||||
|
|
||||||
|
update(deltaT: number): void {}
|
||||||
|
|
||||||
|
render(ctx: CanvasRenderingContext2D, origin: Vec2, viewportSize: Vec2) {
|
||||||
|
for(let i = 0; i < this.data.length; i++){
|
||||||
|
let tileIndex = this.data[i];
|
||||||
|
|
||||||
|
for(let tileset of this.tilesets){
|
||||||
|
if(tileset.hasTile(tileIndex)){
|
||||||
|
tileset.renderTile(ctx, tileIndex, i, this.worldSize, origin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
43
src/ResourceManager/ResourceManager.ts
Normal file
43
src/ResourceManager/ResourceManager.ts
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
export default class ResourceManager {
|
||||||
|
private static instance: ResourceManager;
|
||||||
|
|
||||||
|
private constructor(){};
|
||||||
|
|
||||||
|
static getInstance(): ResourceManager {
|
||||||
|
if(!this.instance){
|
||||||
|
this.instance = new ResourceManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public loadTilemap(pathToTilemapJSON: string, callback: Function): void {
|
||||||
|
this.loadTextFile(pathToTilemapJSON, (fileText: string) => {
|
||||||
|
let tilemapObject = JSON.parse(fileText);
|
||||||
|
callback(tilemapObject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private loadTextFile(textFilePath: string, callback: Function): void {
|
||||||
|
let xobj: XMLHttpRequest = new XMLHttpRequest();
|
||||||
|
xobj.overrideMimeType("application/json");
|
||||||
|
xobj.open('GET', textFilePath, true);
|
||||||
|
xobj.onreadystatechange = function () {
|
||||||
|
if ((xobj.readyState == 4) && (xobj.status == 200)) {
|
||||||
|
callback(xobj.responseText);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xobj.send(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: When you switch to WebGL, make sure to make this private and make a "loadTexture" function
|
||||||
|
public loadImage(path: string, callback: Function): void {
|
||||||
|
var image = new Image();
|
||||||
|
|
||||||
|
image.onload = function () {
|
||||||
|
callback(path, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
image.src = path;
|
||||||
|
}
|
||||||
|
}
|
8
src/Utils/StringUtils.ts
Normal file
8
src/Utils/StringUtils.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
export default class StringUtils {
|
||||||
|
static getPathFromFilePath(filePath: string): string {
|
||||||
|
let splitPath = filePath.split("/");
|
||||||
|
splitPath.pop();
|
||||||
|
splitPath.push("");
|
||||||
|
return splitPath.join("/");
|
||||||
|
}
|
||||||
|
}
|
28
src/main.ts
28
src/main.ts
|
@ -6,6 +6,7 @@ import ColoredCircle from "./Nodes/ColoredCircle";
|
||||||
import Color from "./Utils/Color";
|
import Color from "./Utils/Color";
|
||||||
import Button from "./Nodes/UIElements/Button";
|
import Button from "./Nodes/UIElements/Button";
|
||||||
import {} from "./index";
|
import {} from "./index";
|
||||||
|
import OrthogonalTilemap from "./Nodes/Tilemaps/OrthogonalTilemap";
|
||||||
|
|
||||||
function main(){
|
function main(){
|
||||||
// Create the game object
|
// Create the game object
|
||||||
|
@ -23,28 +24,28 @@ function main(){
|
||||||
pauseMenu.setParallax(0, 0);
|
pauseMenu.setParallax(0, 0);
|
||||||
|
|
||||||
// Initialize GameObjects
|
// Initialize GameObjects
|
||||||
let player = mainScene.canvas.add(Player);
|
let player = mainScene.canvasNode.add(Player);
|
||||||
mainScene.getViewport().follow(player);
|
mainScene.getViewport().follow(player);
|
||||||
|
|
||||||
let recordButton = uiLayer.canvas.add(Button);
|
let recordButton = uiLayer.canvasNode.add(Button);
|
||||||
recordButton.setSize(100, 50);
|
recordButton.setSize(100, 50);
|
||||||
recordButton.setText("Record");
|
recordButton.setText("Record");
|
||||||
recordButton.setPosition(400, 30);
|
recordButton.setPosition(400, 30);
|
||||||
recordButton.onClickEventId = "record_button_press";
|
recordButton.onClickEventId = "record_button_press";
|
||||||
|
|
||||||
let stopButton = uiLayer.canvas.add(Button);
|
let stopButton = uiLayer.canvasNode.add(Button);
|
||||||
stopButton.setSize(100, 50);
|
stopButton.setSize(100, 50);
|
||||||
stopButton.setText("Stop");
|
stopButton.setText("Stop");
|
||||||
stopButton.setPosition(550, 30);
|
stopButton.setPosition(550, 30);
|
||||||
stopButton.onClickEventId = "stop_button_press";
|
stopButton.onClickEventId = "stop_button_press";
|
||||||
|
|
||||||
let playButton = uiLayer.canvas.add(Button);
|
let playButton = uiLayer.canvasNode.add(Button);
|
||||||
playButton.setSize(100, 50);
|
playButton.setSize(100, 50);
|
||||||
playButton.setText("Play");
|
playButton.setText("Play");
|
||||||
playButton.setPosition(700, 30);
|
playButton.setPosition(700, 30);
|
||||||
playButton.onClickEventId = "play_button_press";
|
playButton.onClickEventId = "play_button_press";
|
||||||
|
|
||||||
let cycleFramerateButton = uiLayer.canvas.add(Button);
|
let cycleFramerateButton = uiLayer.canvasNode.add(Button);
|
||||||
cycleFramerateButton.setSize(150, 50);
|
cycleFramerateButton.setSize(150, 50);
|
||||||
cycleFramerateButton.setText("Cycle FPS");
|
cycleFramerateButton.setText("Cycle FPS");
|
||||||
cycleFramerateButton.setPosition(5, 400);
|
cycleFramerateButton.setPosition(5, 400);
|
||||||
|
@ -55,7 +56,7 @@ function main(){
|
||||||
i = (i + 1) % 3;
|
i = (i + 1) % 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
let pauseButton = uiLayer.canvas.add(Button);
|
let pauseButton = uiLayer.canvasNode.add(Button);
|
||||||
pauseButton.setSize(100, 50);
|
pauseButton.setSize(100, 50);
|
||||||
pauseButton.setText("Pause");
|
pauseButton.setText("Pause");
|
||||||
pauseButton.setPosition(700, 400);
|
pauseButton.setPosition(700, 400);
|
||||||
|
@ -64,12 +65,12 @@ function main(){
|
||||||
pauseMenu.enable();
|
pauseMenu.enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
let modalBackground = pauseMenu.canvas.add(UIElement);
|
let modalBackground = pauseMenu.canvasNode.add(UIElement);
|
||||||
modalBackground.setSize(400, 200);
|
modalBackground.setSize(400, 200);
|
||||||
modalBackground.setBackgroundColor(new Color(0, 0, 0, 0.4));
|
modalBackground.setBackgroundColor(new Color(0, 0, 0, 0.4));
|
||||||
modalBackground.setPosition(200, 100);
|
modalBackground.setPosition(200, 100);
|
||||||
|
|
||||||
let resumeButton = pauseMenu.canvas.add(Button);
|
let resumeButton = pauseMenu.canvasNode.add(Button);
|
||||||
resumeButton.setSize(100, 50);
|
resumeButton.setSize(100, 50);
|
||||||
resumeButton.setText("Resume");
|
resumeButton.setText("Resume");
|
||||||
resumeButton.setPosition(400, 200);
|
resumeButton.setPosition(400, 200);
|
||||||
|
@ -79,18 +80,13 @@ function main(){
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let i = 0; i < 10; i++){
|
for(let i = 0; i < 10; i++){
|
||||||
mainScene.canvas.add(ColoredCircle);
|
mainScene.canvasNode.add(ColoredCircle);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let i = 0; i < 20; i++){
|
backgroundScene.tilemap.add(OrthogonalTilemap, "assets/tilemaps/MultiLayer.json");
|
||||||
let cc = backgroundScene.canvas.add(ColoredCircle);
|
|
||||||
cc.setSize(30, 30);
|
|
||||||
cc.setColor(cc.getColor().darken().darken())
|
|
||||||
cc.getColor().a = 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let i = 0; i < 30; i++){
|
for(let i = 0; i < 30; i++){
|
||||||
let cc = foregroundLayer.canvas.add(ColoredCircle);
|
let cc = foregroundLayer.canvasNode.add(ColoredCircle);
|
||||||
cc.setSize(80, 80);
|
cc.setSize(80, 80);
|
||||||
cc.setColor(cc.getColor().lighten().lighten())
|
cc.setColor(cc.getColor().lighten().lighten())
|
||||||
cc.getColor().a = 0.5;
|
cc.getColor().a = 0.5;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user