diff --git a/package.json b/package.json index 0bc06c3..ab6eea8 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,9 @@ "name": "tilegame", "version": "0.0.0", "description": "Tile game", - "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "serve": "node .", + "serve": "node serve.js", "build": "webpack -p", "watch": "webpack -w --mode=development" }, @@ -24,5 +23,8 @@ "standard": "^12.0.1", "webpack": "^4.41.5", "webpack-command": "^0.4.2" + }, + "optionalDependencies": { + "express": "^4.17.1" } } diff --git a/serve.js b/serve.js new file mode 100755 index 0000000..baa0317 --- /dev/null +++ b/serve.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node +const express = require('express') +const path = require('path') +const app = express() + +app.use('/assets', express.static(path.join(__dirname, 'assets'))) +app.use('/', express.static(path.join(__dirname, 'dist'))) + +app.listen(3000, function () { + console.log('server listening on 0.0.0.0:3000') +}) diff --git a/src/entity.js b/src/entity.js index 0ddfb44..5a0261b 100644 --- a/src/entity.js +++ b/src/entity.js @@ -129,7 +129,6 @@ class ItemEntity extends PhysicsEntity { this.istr = this.name + ' ' + (this.count + ent.count) this._life = 0 ent.dead = true - continue } } diff --git a/src/heightmap.js b/src/heightmap.js index 460d7d3..ef15169 100644 --- a/src/heightmap.js +++ b/src/heightmap.js @@ -49,11 +49,9 @@ class HeightMap { // octaves - Number of noise layers // period - Distance above which we start to see similarities. The higher, the longer "hills" will be on a terrain. // lacunarity - Controls period change across octaves. 2 is usually a good value to address all detail levels. - constructor (offsetX, offsetY, size, seed, amplitude = 30, persistence = 0.5, octaves = 5, period = 80, lacunarity = 2) { - this.ix = offsetX + constructor (offsetY, seed, amplitude = 30, persistence = 0.5, octaves = 5, period = 80, lacunarity = 2) { this.iy = offsetY this.seed = seed - this.size = size this.noise = new PerlinNoise(seedrandom(seed)) @@ -65,7 +63,7 @@ class HeightMap { } getNoise (zx) { - let x = ((this.size * this.ix) + zx) / this.period + let x = zx / this.period let amp = 1.0 let max = 1.0 diff --git a/src/index.js b/src/index.js index ea1b352..ab904f2 100644 --- a/src/index.js +++ b/src/index.js @@ -16,9 +16,9 @@ let frameCount = 0 let fps = 0 let vp = new Viewport(0, 0) -let p = new Player(800, 1200, 32, 64) +let p = new Player(1000, 1000, 32, 64) -let height = new HeightMap(0, 32, 16, 0) +let height = new HeightMap(32, 0) const chunkSize = 32 const tileSize = 16 @@ -74,7 +74,7 @@ function start () { world.chunks = [] }) Debug.addCheckbox(Debug, 'drawGrid', function (argument) { - world.chunks = [] + world.redraw() }) playing = true gameLoop() diff --git a/src/player.js b/src/player.js index c0bf012..8a034f2 100644 --- a/src/player.js +++ b/src/player.js @@ -8,9 +8,9 @@ class Player extends PhysicsEntity { constructor (x, y, w, h) { super(x, y, w, h) - this.speed = 8 - this.gravity = 1 - this.jumpPower = 20 + this.speed = 4 + this.gravity = 0.5 + this.jumpPower = 10 this.inv = new Inventory(9) this.itemPickUpDistance = 40 diff --git a/src/tiles.js b/src/tiles.js index 136e4da..86c658a 100644 --- a/src/tiles.js +++ b/src/tiles.js @@ -152,7 +152,7 @@ class TileLayer { } } -class TilePhysicsLayer extends TileLayer { +class TileCollisionLayer extends TileLayer { constructor (size = 16, tileSize = 16) { super(null, 'col', size, tileSize) this.empty = false @@ -232,7 +232,7 @@ class Chunk { this.layers = [] let bgLayer = new TileLayer(tileMap, 'bg', this.size, this.tile) let fgLayer = new TileLayer(tileMap, 'fg', this.size, this.tile) - let clLayer = new TilePhysicsLayer(this.size, this.tile) + let clLayer = new TileCollisionLayer(this.size, this.tile) for (let i = 0; i < this.size * this.size; i++) { let tileCoords = fgLayer.toXY(i) let tileAbs = this.toAbs(tileCoords) @@ -402,6 +402,7 @@ class World { update (dt, vp) { this._active = [] let posPoint = vp.chunkIn(this.chunkSize * this.tileSize) + // Load chunks if necessary for (let x = posPoint.x - 3; x < posPoint.x + 4; x++) { for (let y = posPoint.y - 2; y < posPoint.y + 3; y++) { if (x < 0 || y < 0 || x >= this.width || y >= this.height) continue @@ -444,6 +445,7 @@ class World { } } + // Get a position in the world grid from an absolute position gridPosition (pos) { let a = this.chunkSize * this.tileSize let chunk = { x: Math.floor(pos.x / a), y: Math.floor(pos.y / a) } @@ -454,6 +456,14 @@ class World { return { chunk: this.getChunk(chunk.x, chunk.y), tile } } + // Forces all loaded chunks to re-draw themselves + redraw () { + for (let i in this.chunks) { + this.chunks[i].dirty = true + } + } + + // Draw all loaded in-view chunks and special layers draw (vp) { this._lastDrawCount = 0 this._lastUpdateCount = 0 @@ -474,6 +484,7 @@ class World { } } + // Terrain collision test collide (obj) { if (!this._active.length) return null for (let i in this._active) {