Added onLoad() lifecycle function

This commit is contained in:
2023-03-03 00:50:45 +11:00
parent 00587e91b2
commit 4965cd492d
11 changed files with 90 additions and 64 deletions

View File

@@ -23,13 +23,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="assets\scripts\children_test.toy" /> <None Include="assets\scripts\children_test.toy" />
<None Include="assets\scripts\empty.toy" />
<None Include="assets\scripts\entity.toy" /> <None Include="assets\scripts\entity.toy" />
<None Include="assets\scripts\frames_test.toy" /> <None Include="assets\scripts\frames_test.toy" />
<None Include="assets\scripts\init.toy" /> <None Include="assets\scripts\init.toy" />
<None Include="assets\scripts\scene.toy" /> <None Include="assets\scripts\scene.toy" />
<None Include="assets\scripts\tilemap\layer-background.toy" /> <None Include="assets\scripts\tilemap\layer-background.toy" />
<None Include="assets\scripts\tilemap\layer-walls.toy" /> <None Include="assets\scripts\tilemap\layer-walls.toy" />
<None Include="assets\scripts\tilemap\tile.toy" />
<None Include="assets\scripts\tilemap\tilemap.toy" /> <None Include="assets\scripts\tilemap\tilemap.toy" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">

View File

@@ -1,24 +1,22 @@
import node; import node;
//util to generate and init a child node of a given parent //looks like a polyfill
fn makeChild(parent: opaque, fname: string) { fn loadChild(parent: opaque, fname: string) {
var child: opaque = loadNode(fname); var child: opaque = loadNode(fname);
parent.pushNode(child); parent.pushNode(child);
child.initNode();
return child; return child;
} }
fn onInit(node: opaque) { fn onLoad(node: opaque) {
for (var i = 0; i < 20; i++) { for (var i = 0; i < 20; i++) {
node.makeChild("scripts:/tilemap/tile.toy"); node.loadChild("scripts:/empty.toy");
} }
node.freeChildNode(10); node.freeChildNode(10);
var n = node.getChildNode(10); var n = node.getChildNode(10);
for (var i = 0; i < 20; i++) { for (var i = 0; i < 20; i++) {
//this would originally prune tombstones... node.loadChild("scripts:/empty.toy");
node.makeChild("scripts:/tilemap/tile.toy");
} }
print node.getChildNodeCount(); print node.getChildNodeCount();

1
assets/scripts/empty.toy Normal file
View File

@@ -0,0 +1 @@
//this file is a polyfill

View File

@@ -1,17 +1,20 @@
//the overarching scene //the overarching scene
import node; import node;
//debugging tools
var stepCounter: int = 0;
var stepTracker: [int] = [0, 0, 0];
//util to generate and init a child node of a given parent //util to generate and init a child node of a given parent
fn makeChild(parent: opaque, fname: string) { fn makeChild(parent: opaque, fname: string) {
var child: opaque = loadNode(fname); var child: opaque = loadNode(fname);
parent.pushNode(child); parent.pushNode(child);
child.initNode();
return child; return child;
} }
//lifecycle functions
fn onInit(node: opaque) { fn onLoad(node: opaque) {
//load the tile map node //load the tile map node
var tilemapNode = node.makeChild("scripts:/tilemap/tilemap.toy"); var tilemapNode = node.makeChild("scripts:/tilemap/tilemap.toy");
@@ -22,6 +25,22 @@ fn onInit(node: opaque) {
//tilemapNode.callNodeFn("loadLayer", "layer-maze.toy"); //tilemapNode.callNodeFn("loadLayer", "layer-maze.toy");
} }
//debugging code
fn onStep(node: opaque) {
stepCounter++;
}
fn onDraw(node: opaque) {
//round off - too many skips means it's crappy anyway
if (stepCounter > stepTracker.length() - 1) {
stepCounter = stepTracker.length() - 1;
}
//This logic is just a debugging tool
stepTracker[stepCounter] = stepTracker[stepCounter] + 1;
print stepTracker;
stepCounter = 0;
}
//global accessors //global accessors
fn getTileWidth(node: opaque): int { return 64; } fn getTileWidth(node: opaque): int { return 64; }

View File

@@ -4,24 +4,25 @@ import engine;
import node; import node;
//util to generate and init a child node of a given parent //TODO: replace with an empty node function (polyfill)
fn makeChildSprite(parent: opaque, spriteName: string) { fn loadChildEmpty(parent: opaque) {
var child: opaque = loadNode("scripts:/tilemap/tile.toy"); var child: opaque = loadNode("scripts:/empty.toy");
parent.pushNode(child); parent.pushNode(child);
child.initNode();
child.loadTexture("sprites:/" + spriteName);
return child; return child;
} }
fn onInit(node: opaque) { fn onLoad(node: opaque) {
//load the child node, with the tiling back image //load the child node, with the tiling back image
node.makeChildSprite("tile-background.png"); node.loadChildEmpty();
}
fn onInit(node: opaque) {
node.getChildNode(0).loadTexture("sprites:/tile-background.png");
} }
//drawing util
fn drawLayer(node: opaque, camX, camY, camW, camH, depth) { fn drawLayer(node: opaque, camX, camY, camW, camH, depth) {
//get the constants from root //get the constants from root
var root: opaque = getRootNode(); var root: opaque = getRootNode();

View File

@@ -4,24 +4,25 @@ import engine;
import node; import node;
//util to generate and init a child node of a given parent //TODO: replace with an empty node function (polyfill)
fn makeChildSprite(parent: opaque, spriteName: string) { fn loadChildEmpty(parent: opaque) {
var child: opaque = loadNode("scripts:/tilemap/tile.toy"); var child: opaque = loadNode("scripts:/empty.toy");
parent.pushNode(child); parent.pushNode(child);
child.initNode();
child.loadTexture("sprites:/" + spriteName);
return child; return child;
} }
fn onInit(node: opaque) { fn onLoad(node: opaque) {
//load the child node, with the tiling back image //load the child node, with the tiling back image
node.makeChildSprite("tile-wall.png"); node.loadChildEmpty();
}
fn onInit(node: opaque) {
node.getChildNode(0).loadTexture("sprites:/tile-wall.png");
} }
//drawing util
fn drawLayer(node: opaque, camX, camY, camW, camH, depth) { fn drawLayer(node: opaque, camX, camY, camW, camH, depth) {
//get the constants from root //get the constants from root
var root: opaque = getRootNode(); var root: opaque = getRootNode();

View File

@@ -1,2 +0,0 @@
//EMPTY

View File

@@ -6,44 +6,25 @@ import node;
var camX: float = 0; var camX: float = 0;
var camY: float = 0; var camY: float = 0;
var stepCounter: int = 0; //util to generate a child node of a given parent
var stepTracker: [int] = [0, 0, 0, 0, 0, 0]; fn loadChild(parent: opaque, fname: string) {
//util to generate and init a child node of a given parent
fn makeChild(parent: opaque, fname: string) {
var child: opaque = loadNode(fname); var child: opaque = loadNode(fname);
parent.pushNode(child); parent.pushNode(child);
child.initNode();
return child; return child;
} }
fn loadLayer(node: opaque, layerName: string) { fn loadLayer(node: opaque, layerName: string) {
//load the given layer as a child //load the given layer as a child
var layerNode = node.makeChild("scripts:/tilemap/" + layerName); var layerNode = node.loadChild("scripts:/tilemap/" + layerName);
} }
//lifecycle functions
fn onStep(node: opaque) { fn onStep(node: opaque) {
stepCounter++;
camX--; camX--;
camY--; camY--;
} }
fn onDraw(node: opaque) { fn onDraw(node: opaque) {
var tmp = stepCounter;
print stepCounter;
stepCounter = 0;
if (tmp > 5) {
tmp = 5;
}
print typeof (stepTracker[tmp] + 1);
//TODO: index[]++
stepTracker[tmp] = stepTracker[tmp] + 1;
print stepTracker;
var screenWidth: int const = getRootNode().callNodeFn("getScreenWidth"); var screenWidth: int const = getRootNode().callNodeFn("getScreenWidth");
var screenHeight: int const = getRootNode().callNodeFn("getScreenHeight"); var screenHeight: int const = getRootNode().callNodeFn("getScreenHeight");

View File

@@ -63,12 +63,17 @@ void Box_initEngine() {
Toy_injectNativeHook(&engine.interpreter, "node", Box_hookNode); Toy_injectNativeHook(&engine.interpreter, "node", Box_hookNode);
Toy_injectNativeHook(&engine.interpreter, "input", Box_hookInput); Toy_injectNativeHook(&engine.interpreter, "input", Box_hookInput);
//run the init
size_t size = 0; size_t size = 0;
const unsigned char* source = Toy_readFile("./assets/scripts/init.toy", &size); const unsigned char* source = Toy_readFile("./assets/scripts/init.toy", &size);
const unsigned char* tb = Toy_compileString((const char*)source, &size); const unsigned char* tb = Toy_compileString((const char*)source, &size);
free((void*)source); free((void*)source);
Toy_runInterpreter(&engine.interpreter, tb, size); Toy_runInterpreter(&engine.interpreter, tb, size);
//init the node-tree
Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onInit", NULL);
} }
void Box_freeEngine() { void Box_freeEngine() {

View File

@@ -25,7 +25,7 @@ static int nativeInitWindow(Toy_Interpreter* interpreter, Toy_LiteralArray* argu
} }
if (arguments->count != 4) { if (arguments->count != 4) {
fatalError("Incorrect number of arguments passed to initEngine\n"); fatalError("Incorrect number of arguments passed to initWindow\n");
} }
//extract the arguments //extract the arguments
@@ -34,9 +34,29 @@ static int nativeInitWindow(Toy_Interpreter* interpreter, Toy_LiteralArray* argu
Toy_Literal screenWidth = Toy_popLiteralArray(arguments); Toy_Literal screenWidth = Toy_popLiteralArray(arguments);
Toy_Literal caption = Toy_popLiteralArray(arguments); Toy_Literal caption = Toy_popLiteralArray(arguments);
Toy_Literal captionIdn = caption;
if (TOY_IS_IDENTIFIER(caption) && Toy_parseIdentifierToValue(interpreter, &caption)) {
Toy_freeLiteral(captionIdn);
}
Toy_Literal screenWidthIdn = screenWidth;
if (TOY_IS_IDENTIFIER(screenWidth) && Toy_parseIdentifierToValue(interpreter, &screenWidth)) {
Toy_freeLiteral(screenWidthIdn);
}
Toy_Literal screenHeightIdn = screenHeight;
if (TOY_IS_IDENTIFIER(screenHeight) && Toy_parseIdentifierToValue(interpreter, &screenHeight)) {
Toy_freeLiteral(screenHeightIdn);
}
Toy_Literal fscreenIdn = fscreen;
if (TOY_IS_IDENTIFIER(fscreen) && Toy_parseIdentifierToValue(interpreter, &fscreen)) {
Toy_freeLiteral(fscreenIdn);
}
//check argument types //check argument types
if (!TOY_IS_STRING(caption) || !TOY_IS_INTEGER(screenWidth) || !TOY_IS_INTEGER(screenHeight) || !TOY_IS_BOOLEAN(fscreen)) { if (!TOY_IS_STRING(caption) || !TOY_IS_INTEGER(screenWidth) || !TOY_IS_INTEGER(screenHeight) || !TOY_IS_BOOLEAN(fscreen)) {
fatalError("Incorrect argument type passed to initEngine\n"); fatalError("Incorrect argument type passed to initWindow\n");
} }
//init the window //init the window
@@ -133,7 +153,7 @@ static int nativeLoadRootNode(Toy_Interpreter* interpreter, Toy_LiteralArray* ar
//init the inner interpreter manually //init the inner interpreter manually
Toy_initLiteralArray(&inner.literalCache); Toy_initLiteralArray(&inner.literalCache);
inner.scope = Toy_pushScope(NULL); inner.scope = Toy_pushScope(interpreter->scope);
inner.bytecode = tb; inner.bytecode = tb;
inner.length = size; inner.length = size;
inner.count = 0; inner.count = 0;
@@ -148,16 +168,15 @@ static int nativeLoadRootNode(Toy_Interpreter* interpreter, Toy_LiteralArray* ar
Box_initEngineNode(rootNode, &inner, tb, size); Box_initEngineNode(rootNode, &inner, tb, size);
//init the new node (and ONLY this node) //immediately call onLoad() after running the script - for loading other nodes
Box_callEngineNode(rootNode, &engine.interpreter, "onInit", NULL); Box_callEngineNode(rootNode, &engine.interpreter, "onLoad", NULL);
//NOW it's non-null //NOW it's non-null
engine.rootNode = rootNode; engine.rootNode = rootNode;
//cleanup //cleanup
while(inner.scope) { Toy_popScope(inner.scope);
inner.scope = Toy_popScope(inner.scope); inner.scope = NULL;
}
Toy_freeLiteralArray(&inner.stack); Toy_freeLiteralArray(&inner.stack);
Toy_freeLiteralArray(&inner.literalCache); Toy_freeLiteralArray(&inner.literalCache);

View File

@@ -50,14 +50,14 @@ static int nativeLoadNode(Toy_Interpreter* interpreter, Toy_LiteralArray* argume
Box_EngineNode* node = TOY_ALLOCATE(Box_EngineNode, 1); Box_EngineNode* node = TOY_ALLOCATE(Box_EngineNode, 1);
//BUGFIX: make an inner-interpreter //BUGFIX: make an -interpreter
Toy_Interpreter inner; Toy_Interpreter inner;
//init the inner interpreter manually //init the inner interpreter manually
Toy_initLiteralArray(&inner.literalCache); Toy_initLiteralArray(&inner.literalCache);
Toy_initLiteralArray(&inner.stack); Toy_initLiteralArray(&inner.stack);
inner.hooks = interpreter->hooks; inner.hooks = interpreter->hooks;
inner.scope = Toy_pushScope(NULL); inner.scope = Toy_pushScope(interpreter->scope);
inner.bytecode = tb; inner.bytecode = tb;
inner.length = size; inner.length = size;
inner.count = 0; inner.count = 0;
@@ -70,6 +70,9 @@ static int nativeLoadNode(Toy_Interpreter* interpreter, Toy_LiteralArray* argume
Box_initEngineNode(node, &inner, tb, size); Box_initEngineNode(node, &inner, tb, size);
//immediately call onLoad() after running the script - for loading other nodes
Box_callEngineNode(node, &engine.interpreter, "onLoad", NULL);
// return the node // return the node
Toy_Literal nodeLiteral = TOY_TO_OPAQUE_LITERAL(node, node->tag); Toy_Literal nodeLiteral = TOY_TO_OPAQUE_LITERAL(node, node->tag);
Toy_pushLiteralArray(&interpreter->stack, nodeLiteral); Toy_pushLiteralArray(&interpreter->stack, nodeLiteral);