diff --git a/hampsterengine b/hampsterengine index 5af7f5c6e3ce1d9ada43e76940ec97e4c64de4f9..18b1c8ff97a94e054ad822ea1570e6833acc0e1a 160000 --- a/hampsterengine +++ b/hampsterengine @@ -1 +1 @@ -Subproject commit 5af7f5c6e3ce1d9ada43e76940ec97e4c64de4f9 +Subproject commit 18b1c8ff97a94e054ad822ea1570e6833acc0e1a diff --git a/src/js/extras.js b/src/js/extras.js index 51f186c805311f86e920f7ad8b48358647f27523..dc884e97c2226610430c92a6ed2346c664f18f41 100644 --- a/src/js/extras.js +++ b/src/js/extras.js @@ -4,4 +4,8 @@ export function drawLineThroughPoint(x, y) { canvas.drawLine(); } -export const GRAVITY = 100; +export const clone = structuredClone; + +export const clonePlayer = player => { + return player; +} diff --git a/src/js/main.js b/src/js/main.js index 1e064f5edfd134725a4c8c684ee49615a699e11e..65c282bc3ff6c3d3acc02dc8fd01ce6ee85cd550 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -25,6 +25,9 @@ import Mouse from "../../hampsterengine/src/mouse"; // Music // There is none +// Parse query parameters +const query = new URLSearchParams(window.location.search); + // Init the engine and canvas const canvas = new Canvas('c'); const engine = new Engine(canvas); @@ -36,17 +39,15 @@ window.fR = fontRenderer // const mouse = new Mouse(engine); // window.mouse = mouse; -canvas.width = 256 * 2; -canvas.height = 240 * 2; -canvas.pixelRatio = 2; +const scale = (query.get('debug') ? 4 : 1); +canvas.width = 256 * scale; +canvas.height = 240 * scale; +canvas.pixelRatio = scale; canvas.ctx.setTransform(canvas.pixelRatio, 0, 0, canvas.pixelRatio, 0, 0); canvas.ctx.imageSmoothingEnabled = false; engine.running = false; // Game uses this as a pause state actually -// Parse query parameters -const query = new URLSearchParams(window.location.search); - engine.registerRoom(rm_mainMenu, 'mainMenu'); engine.registerRoom(rm_game, 'game'); @@ -62,6 +63,9 @@ engine.registerRoom(rm_DEBUG_text, 'debug_text'); // document.body.appendChild( stats.dom ); let physicsFrame=0; +window.physicsFrame = physicsFrame; + +let readyTime = 0; function main() { // Draw things. no user interaction or physics here. @@ -79,7 +83,9 @@ function main() { // stats.end(); if (query.get('debug')) { - + canvas.drawText(`physics ticks: ${physicsFrame} (~${(physicsFrame/60).toFixed(1)}sec)`, 0, 0,{textBaseline:'top'}) + canvas.drawText(`frames: ${engine.frames} (~${(engine.frames/(physicsFrame/60)).toFixed(1)}FPS <--flawed)`, 0, 8,{textBaseline:'top'}) + canvas.drawText(`run time: ${((performance.now()-readyTime)/1000).toFixed(1)}sec`, 0, 16, {textBaseline:'top'}) } // Ask to run at the next frame @@ -108,7 +114,7 @@ function physicsTick() { // Runs 60 times a second regardless of frame rate. physicsFrame++; - if (engine.running) engine.room.step(); + engine.room.step(); } console.debug(engine.rooms); @@ -127,6 +133,7 @@ function load() { engine.loadLoop(); setTimeout(load, 1000/60); } else { + readyTime = performance.now(); main(); setInterval(physicsTick, 1000/60); // Update physics 60 times a second } diff --git a/src/js/objects.js b/src/js/objects.js index 1298685e3e4bb684542a207822e28b030ee9b5ff..7876278c18593d93e775b4fb0c34fcccfbaed3ea 100644 --- a/src/js/objects.js +++ b/src/js/objects.js @@ -132,10 +132,15 @@ export class FontRenderer { this.font = font; this.h = 8; this.w = 6; + this.invert = 0; } draw(text, x, y) { text = text.toUpperCase(); + + const oldFilter = canvas.filter; + if (this.invert) canvas.filter = 'invert(1)'; + let split try{ split = text.split(""); @@ -165,6 +170,8 @@ export class FontRenderer { this.w, this.h, this.w * slice, 0, this.w, this.h); } + + canvas.filter = oldFilter; } drawLines(text, x, y) { diff --git a/src/js/objects/player.js b/src/js/objects/player.js index 51b0e263d93db4bf84ba340a44affbf3a0fedf47..15c44696a8f094e9aefc9296d72c0e2d2f243c11 100644 --- a/src/js/objects/player.js +++ b/src/js/objects/player.js @@ -1,8 +1,23 @@ import {Entity} from "../../../hampsterengine/src/things"; export default class Player extends Entity { + constructor(props) { + super(props); + } + draw() { canvas.setFillColor('red'); canvas.fillRect(this.x,this.y,10,16); } + + checkCollision(other) { + // Checks if colliding with another entity. Returns true if colliding. + + return ( + this.left < other.right && + this.right > other.left && + this.top < other.bottom && + this.bottom > other.top + ); + } } diff --git a/src/js/rooms/game.js b/src/js/rooms/game.js index dd5815b9c400d68ec7ecf447ae8b55cab9d864bc..85c4a12277318984137649de4ec97d6fce60404e 100644 --- a/src/js/rooms/game.js +++ b/src/js/rooms/game.js @@ -1,11 +1,13 @@ import {Entity, Room} from "../../../hampsterengine/src/things"; import Player from "../objects/player"; -import {GRAVITY} from "../extras"; +import {clone, clonePlayer} from "../extras"; export const rm_game = new Room(); -const GRAVITY_X = 0; -const GRAVITY_Y = 0.0003; +const GRAVITY_X = 0; // I don't think we're going to use X gravity but i'm going to keep in the source in case i do +const GRAVITY_Y = 150; // Per second +const entities = rm_game.entities; + rm_game.start = _=>{ engine.running = true; @@ -16,7 +18,18 @@ rm_game.stop = _=>{ } rm_game.step = _=>{ + const elapsed = 1 / 60; + + // Clone the player so we can put them back after the first check + const old_player = {...player}; + const entitiesWithoutThePlayer = [...entities].slice(entities.indexOf(player)); + + // Accelerate the player towards GRAVITY_Y + player.y += GRAVITY_Y * elapsed; + if (player.checkCollision(floor)) { + player.y = floor.top - player.height; + } } rm_game.drawGui = _ => { @@ -27,7 +40,16 @@ rm_game.drawGui = _ => { }); } -const player = new Player(); -// player.ay = 0.1; +let player = new Player(); player.x = 40; -rm_game.entities.push(player); +player.y = 40; +window.player = player; +entities.push(player); + +let floor = new Entity(); +floor.x = 0; +floor.y = 150; +floor.width = 256; +floor.height = 50; +floor.draw = _=> { canvas.setStrokeColor('black'); canvas.strokeRect(floor.x, floor.y, floor.width, floor.height) } +rm_game.entities.push(floor); diff --git a/src/js/rooms/mainMenu.js b/src/js/rooms/mainMenu.js index a76925b9fb00252354a7069a37f6efa49101d824..507c62d5e620ebc71da6b6765ce000dd214c411d 100644 --- a/src/js/rooms/mainMenu.js +++ b/src/js/rooms/mainMenu.js @@ -2,18 +2,27 @@ import {Room} from "../../../hampsterengine/src/things"; import {Logo, MainMenuButton} from "../objects"; export const rm_mainMenu = new Room(); -rm_mainMenu.bgColor = '#f0f0f0'; +rm_mainMenu.bgColor = '#050911'; -const logo = new Logo(); -logo.x = 30; -logo.y = 45; -logo.align = 2 -rm_mainMenu.entities.push(logo); +// const logo = new Logo(); +// logo.x = 30; +// logo.y = 45; +// logo.align = 2 +// rm_mainMenu.entities.push(logo); + +rm_mainMenu.flasher = !0; + +rm_mainMenu.step = _=>{ + if (physicsFrame % 30) rm_mainMenu.flasher = !rm_mainMenu.flasher; +} rm_mainMenu.drawGui = _ => { - canvas.setFillColor('#0f0f0f'); + // canvas.setFillColor('#ffffff'); + + fR.invert = 1; + fR.draw("Thirteen minutes to space", 30, 8*4); - fR.draw("Press [ENTER] to start.", 30, canvas.height-35); - fR.draw("[c] bye 2024", 30, canvas.height-16); - // fR.draw("Uses 3rd-party licenses. Press [L] to read.", 30, canvas.height-16, {}); + if(rm_mainMenu.flasher) fR.draw("Press [ENTER] to start.", 30, canvas.height-(8*8)); + fR.draw("created by bye", 30, canvas.height-(8*4)); + fR.invert = 0; } \ No newline at end of file