Where there's a will there's a way
This commit is contained in:
2
Box
2
Box
Submodule Box updated: dcbb2d12f2...8b543dcb82
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
28
assets/scripts/tilemap/renderer-child.toy
Normal file
28
assets/scripts/tilemap/renderer-child.toy
Normal 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)
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user