Where there's a will there's a way

This commit is contained in:
2023-07-03 20:00:01 +10:00
parent 98d0d605e7
commit 1287556e55
4 changed files with 58 additions and 21 deletions

2
Box

Submodule Box updated: dcbb2d12f2...8b543dcb82

View File

@@ -22,7 +22,7 @@ fn onInit(node: opaque) {
generateLevel(rng); generateLevel(rng);
//generate the child node to render the map //generate the child node to render the map
var child: opaque = node.loadChild("scripts:/tilemap/rendernode.toy"); var child: opaque = node.loadChild("scripts:/tilemap/renderer.toy");
child.callNodeFn("setTilemap", tilemap); child.callNodeFn("setTilemap", tilemap);
} }

View File

@@ -0,0 +1,28 @@
//use this dummy child to actually draw to the screen
import standard;
import node;
//lifecycle functions
fn onLoad(node: opaque) {
node.setNodeScaleX(CAMERA_SCALE_X);
node.setNodeScaleY(CAMERA_SCALE_Y);
}
fn onDraw(node: opaque) {
var posX: int const = node.getNodeWorldPositionX();
var posY: int const = node.getNodeWorldPositionY();
//draw everything at twice the original size
var scaleX: float const = node.getNodeWorldScaleX();
var scaleY: float const = node.getNodeWorldScaleY();
var width: int const = node.getNodeRectW();
var height: int const = node.getNodeRectH();
node.drawNode(
floor(posX * scaleX) + globalCameraX,
floor(posY * scaleY) + globalCameraY,
floor(width * scaleX),
floor(height * scaleY)
);
}

View File

@@ -1,3 +1,7 @@
import standard;
import engine;
import node;
//constants for generating maps //constants for generating maps
var ROOM_MIN_WIDTH: int const = 4; //minimum safe value 4 var ROOM_MIN_WIDTH: int const = 4; //minimum safe value 4
var ROOM_MIN_HEIGHT: int const = 4; var ROOM_MIN_HEIGHT: int const = 4;
@@ -13,29 +17,23 @@ var CELL_COUNT_Y: int const = 3;
var tilemap: [int] = null; var tilemap: [int] = null;
fn setTilemap(node: opaque, t: [int]) {
tilemap = t;
}
//lifecycle functions //lifecycle functions
fn onLoad(node: opaque) { fn onLoad(node: opaque) {
//load the atlas into this node
node.loadNodeTexture("sprites:/tileset.png"); node.loadNodeTexture("sprites:/tileset.png");
node.setNodeScaleX(CAMERA_SCALE_X);
node.setNodeScaleY(CAMERA_SCALE_Y);
} }
fn onDraw(node: opaque) { fn setTilemap(node: opaque, t: [int]) {
assert tilemap, "tilemap is null"; assert t, "provided tilemap is null (in setTilemap)";
var posX: int const = node.getNodeWorldPositionX(); tilemap = t;
var posY: int const = node.getNodeWorldPositionY();
//draw everything at twice the original size //create a child as a render target
var scaleX: float const = node.getNodeWorldScaleX(); var child = node.loadChild("scripts:/tilemap/renderer-child.toy");
var scaleY: float const = node.getNodeWorldScaleY(); child.createNodeTexture(CELL_WIDTH * CELL_COUNT_X * TILE_PIXEL_WIDTH, CELL_HEIGHT * CELL_COUNT_Y * TILE_PIXEL_HEIGHT);
setRenderTarget(child);
//draw the tilemap //draw the tilemap to the child
for (var j = 0; j < CELL_HEIGHT * CELL_COUNT_Y; j++) { for (var j = 0; j < CELL_HEIGHT * CELL_COUNT_Y; j++) {
for (var i = 0; i < CELL_WIDTH * CELL_COUNT_X; i++) { for (var i = 0; i < CELL_WIDTH * CELL_COUNT_X; i++) {
//don't render empty tiles //don't render empty tiles
@@ -52,11 +50,22 @@ fn onDraw(node: opaque) {
//draw to the screen //draw to the screen
node.drawNode( node.drawNode(
floor((i * TILE_PIXEL_WIDTH + posX) * scaleX) + globalCameraX, (i * TILE_PIXEL_WIDTH),
floor((j * TILE_PIXEL_HEIGHT + posY) * scaleY) + globalCameraY, (j * TILE_PIXEL_HEIGHT),
floor(TILE_PIXEL_WIDTH * scaleX), TILE_PIXEL_WIDTH,
floor(TILE_PIXEL_HEIGHT * scaleY) TILE_PIXEL_HEIGHT
); );
} }
} }
//reset the render target to the screen
setRenderTarget(null);
}
//polyfills
fn loadChild(parent: opaque, fname: string) {
//TODO: add this to the API proper
var child: opaque = loadNode(fname);
parent.pushNode(child);
return child;
} }