| @@ -1,15 +1,16 @@ | |||
| import assets from "./assets.js"; | |||
| import Rect from "./Rect.js"; | |||
| import Vec2 from "./Vec2.js"; | |||
| import Texture from "./Texture.js"; | |||
| function findBounds(arr, bounds) { | |||
| arr.forEach(e => { | |||
| let right = (e.x + 1) * assets.tiles.tileWidth; | |||
| let bottom = (e.y + 1) * assets.tiles.tileHeight; | |||
| if (bounds.size.x < right) | |||
| if (right > bounds.size.x) | |||
| bounds.size.x = right; | |||
| if (bounds.size.y < bottom) | |||
| if (bottom > bounds.size.y) | |||
| bounds.size.y = bottom; | |||
| }); | |||
| } | |||
| @@ -86,12 +87,6 @@ function findGeometry(bounds, arr, geometry) { | |||
| } | |||
| } | |||
| function drawToCanvas(ctx, arr) { | |||
| arr.forEach(e => { | |||
| assets.tiles.drawTile(ctx, e.tile, e.x, e.y); | |||
| }); | |||
| } | |||
| function flattened(arr, newArr = []) { | |||
| arr.forEach(e => { | |||
| if (e instanceof Array) | |||
| @@ -104,6 +99,8 @@ function flattened(arr, newArr = []) { | |||
| export default class Structure { | |||
| constructor(attrs, nestedArr) { | |||
| this.texture = new Texture(nestedArr); | |||
| this.attrs = { | |||
| collides: false, | |||
| } | |||
| @@ -114,28 +111,20 @@ export default class Structure { | |||
| this.nestedArr = nestedArr; | |||
| this.bounds = new Rect(); | |||
| this.geometry = []; | |||
| this.can = document.createElement("canvas"); | |||
| } | |||
| init() { | |||
| var arr = flattened(this.nestedArr); | |||
| findBounds(arr, this.bounds); | |||
| this.can.width = this.bounds.size.x; | |||
| this.can.height = this.bounds.size.y; | |||
| if (this.attrs.collides) { | |||
| findGeometry(this.bounds, arr, this.geometry); | |||
| } | |||
| let ctx = this.can.getContext("2d"); | |||
| assets.tiles.whenReady(() => drawToCanvas(ctx, arr)); | |||
| } | |||
| draw(ctx) { | |||
| ctx.drawImage( | |||
| this.can, this.bounds.pos.pixelX, this.bounds.pos.pixelY, | |||
| this.bounds.size.x, this.bounds.size.y); | |||
| this.texture.draw(ctx, this.bounds.pos.pixelX, this.bounds.pos.pixelY); | |||
| } | |||
| setAttr(attr) { | |||
| @@ -0,0 +1,53 @@ | |||
| import Rect from "./Rect.js"; | |||
| import assets from "./assets.js"; | |||
| export default class Texture { | |||
| constructor(nestedArr) { | |||
| this.nestedArr = nestedArr; | |||
| this.can = document.createElement("canvas"); | |||
| this.ctx = this.can.getContext("2d"); | |||
| this.width = 0; | |||
| this.height = 0; | |||
| assets.tiles.whenReady(() => this.init()); | |||
| } | |||
| findWidthHeight(arr) { | |||
| arr.forEach(e => { | |||
| if (e instanceof Array) { | |||
| this.findWidthHeight(e); | |||
| } else { | |||
| let right = (e.x + 1) * assets.tiles.tileWidth; | |||
| let bottom = (e.y + 1) * assets.tiles.tileHeight; | |||
| if (right > this.width) | |||
| this.width = right; | |||
| if (bottom > this.height) | |||
| this.height = bottom; | |||
| } | |||
| }); | |||
| } | |||
| fillCanvas(arr) { | |||
| arr.forEach(e => { | |||
| if (e instanceof Array) { | |||
| this.fillCanvas(e); | |||
| } else { | |||
| assets.tiles.drawTile(this.ctx, e.tile, e.x, e.y); | |||
| } | |||
| }); | |||
| } | |||
| init() { | |||
| this.findWidthHeight(this.nestedArr); | |||
| this.can.width = this.width; | |||
| this.can.height = this.height; | |||
| this.fillCanvas(this.nestedArr); | |||
| } | |||
| draw(ctx, x, y) { | |||
| ctx.drawImage(this.can, x, y, this.width, this.height); | |||
| } | |||
| } | |||
| Texture.fromLine = function(l, m, r, lr) { | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| import SpriteSheet from "./SpriteSheet.js"; | |||
| export default { | |||
| tiles: new SpriteSheet("assets/tiles.png", 32, 32, 2) | |||
| tiles: new SpriteSheet("assets/tiles.png", 32, 32, 1) | |||
| .defineTile("ground", 0, 0) | |||
| .defineTile("grass", 1, 0) | |||
| .defineTile("grass-l", 2, 0) | |||
| @@ -10,7 +10,7 @@ let level = new Level(canvas); | |||
| level.spawnEntity(new Player(level), 10, 1); | |||
| level.spawnEntity(new Platform(level), 16, 4); | |||
| level.spawnStructure(structures.floor(4), 4, 4); | |||
| level.spawnStructure(structures.floor(8), 4, 4); | |||
| level.start(); | |||
| @@ -1,17 +1,8 @@ | |||
| import Structure from "./Structure.js"; | |||
| import tiles from "./tiles.js"; | |||
| export default { | |||
| floor: (width) => { | |||
| let attrs = [ "collides" ]; | |||
| if (width <= 1) { | |||
| return new Structure(attrs, [ { x: 0, y: 0, tile: "grass-lr" }]); | |||
| } else { | |||
| return new Structure(attrs, [ | |||
| { x: 0, y: 0, tile: "grass-l", }, | |||
| Array.from({ length: width - 2 }, (_, i) => | |||
| ({ x: i + 1, y: 0, tile: "grass" })), | |||
| { x: width - 1, y: 0, tile: "grass-r" }, | |||
| ]); | |||
| } | |||
| }, | |||
| } | |||
| floor: width => new Structure( | |||
| [ "collides" ], | |||
| tiles.fromLine(width, "grass")), | |||
| }; | |||
| @@ -0,0 +1,14 @@ | |||
| export default { | |||
| fromLine: function(width, tile) { | |||
| if (width <= 1) { | |||
| return [ { x: 0, y: 0, tile: tile+"-lr" }]; | |||
| } else { | |||
| return [ | |||
| { x: 0, y: 0, tile: tile+"-l", }, | |||
| Array.from({ length: width - 2 }, (_, i) => | |||
| ({ x: i + 1, y: 0, tile: tile })), | |||
| { x: width - 1, y: 0, tile: tile+"-r" }, | |||
| ]; | |||
| } | |||
| }, | |||
| } | |||
| @@ -49,7 +49,8 @@ export default class TPhysics extends Trait { | |||
| } | |||
| } | |||
| this.relVelocity.y += this.gravity * dt; | |||
| if (!this.onGround) | |||
| this.relVelocity.y += this.gravity * dt; | |||
| // If we just started riding something, adjust relative velocity | |||
| if (!this.prevRelativeTo && this.relativeTo) { | |||