Added variable argument count to callNode

This commit is contained in:
2022-11-07 05:22:42 +00:00
parent 526efff00c
commit aec5fcab55
6 changed files with 73 additions and 51 deletions

View File

@@ -1,11 +0,0 @@
fn onInit(node: opaque) {
print "child.toy:onInit() called";
}
fn onStep(node: opaque) {
print "child.toy:onStep()";
}
fn onFree(node: opaque) {
print "child.toy:onFree() called";
}

View File

@@ -28,6 +28,35 @@ fn onInit(node: opaque) {
parent = node.getNodeParent(); parent = node.getNodeParent();
} }
fn onStep(node: opaque) {
x += xspeed;
y += yspeed;
}
fn onFree(node: opaque) {
print "render.toy:onFree() called";
node.freeTexture();
}
fn onDraw(node: opaque) {
// print "render.toy:onDraw() called";
var px = parent.callNode("getX");
var py = parent.callNode("getY");
if (px == null) {
px = 0;
}
if (py == null) {
py = 0;
}
node.drawNode(x + px, y + py, 100, 100);
}
//event functions
fn onKeyDown(node: opaque, event: string) { fn onKeyDown(node: opaque, event: string) {
if (event == "character_up") { if (event == "character_up") {
yspeed -= SPEED; yspeed -= SPEED;
@@ -70,32 +99,4 @@ fn onKeyUp(node: opaque, event: string) {
xspeed = 0; xspeed = 0;
return; return;
} }
} }
fn onStep(node: opaque) {
x += xspeed;
y += yspeed;
}
fn onFree(node: opaque) {
print "render.toy:onFree() called";
node.freeTexture();
}
fn onDraw(node: opaque) {
// print "render.toy:onDraw() called";
var px = parent.callNode("getX");
var py = parent.callNode("getY");
if (px == null) {
px = 0;
}
if (py == null) {
py = 0;
}
node.drawNode(x + px, y + py, 100, 100);
}

View File

@@ -23,6 +23,7 @@ mapInputEventToKeyUp("character_left", "left"); //event, keysym
mapInputEventToKeyUp("character_down", "down"); //event, keysym mapInputEventToKeyUp("character_down", "down"); //event, keysym
mapInputEventToKeyUp("character_right", "right"); //event, keysym mapInputEventToKeyUp("character_right", "right"); //event, keysym
//this function must always be called, or the engine won't run //this function must always be called, or the engine won't run
initWindow("Airport Game", 800, 600, false); initWindow("Airport Game", 800, 600, false);

View File

@@ -2,22 +2,22 @@
import engine; import engine;
import node; import node;
//util to generate and init a child node of a 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(); child.initNode();
} }
//root node can load the whole scene, and essentially act as the scene object //NOTE: root node can load the whole scene, and essentially act as the scene object
fn onInit(node: opaque) { fn onInit(node: opaque) {
print "root.toy:onInit() called"; print "root.toy:onInit() called";
//make a child //make a child
// node.makeChild("assets/scripts/child.toy"); node.makeChild("assets/scripts/entity.toy");
// node.makeChild("assets/scripts/child.toy");
node.makeChild("assets/scripts/render.toy");
node.getNodeChild(0).makeChild("assets/scripts/render.toy"); //give the child a child
node.getNodeChild(0).makeChild("assets/scripts/entity.toy");
} }
fn onStep(node: opaque) { fn onStep(node: opaque) {

View File

@@ -114,14 +114,15 @@ Literal callEngineNodeLiteral(EngineNode* node, Interpreter* interpreter, Litera
initLiteralArray(&arguments); initLiteralArray(&arguments);
initLiteralArray(&returns); initLiteralArray(&returns);
pushLiteralArray(&arguments, n); //feed the arguments in backwards!
if (args) { if (args) {
for (int i = 0; i < args->count; i++) { for (int i = args->count -1; i >= 0; i--) {
pushLiteralArray(&arguments, args->literals[i]); pushLiteralArray(&arguments, args->literals[i]);
} }
} }
pushLiteralArray(&arguments, n);
callLiteralFn(interpreter, fn, &arguments, &returns); callLiteralFn(interpreter, fn, &arguments, &returns);
ret = popLiteralArray(&returns); ret = popLiteralArray(&returns);

View File

@@ -534,11 +534,40 @@ static int nativeGetNodeTag(Interpreter* interpreter, LiteralArray* arguments) {
static int nativeCallNode(Interpreter* interpreter, LiteralArray* arguments) { static int nativeCallNode(Interpreter* interpreter, LiteralArray* arguments) {
//checks //checks
if (arguments->count != 2) { if (arguments->count < 2) {
interpreter->errorOutput("Incorrect number of arguments passed to callEngineNode\n"); interpreter->errorOutput("Too few arguments passed to callEngineNode\n");
return -1; return -1;
} }
LiteralArray extraArgs;
initLiteralArray(&extraArgs);
LiteralArray flippedExtraArgs;
initLiteralArray(&flippedExtraArgs);
//extract the extra arg values
while (arguments->count > 2) {
Literal tmp = popLiteralArray(arguments);
Literal idn = tmp; //there's almost certainly a better way of doing all of this stuff
if (IS_IDENTIFIER(tmp) && parseIdentifierToValue(interpreter, &tmp)) {
freeLiteral(idn);
}
pushLiteralArray(&flippedExtraArgs, tmp);
freeLiteral(tmp);
}
//correct the order
while (flippedExtraArgs.count) {
Literal tmp = popLiteralArray(&flippedExtraArgs);
pushLiteralArray(&extraArgs, tmp);
freeLiteral(tmp);
}
freeLiteralArray(&flippedExtraArgs);
//back on track
Literal fnName = popLiteralArray(arguments); Literal fnName = popLiteralArray(arguments);
Literal nodeLiteral = popLiteralArray(arguments); Literal nodeLiteral = popLiteralArray(arguments);
@@ -563,11 +592,12 @@ static int nativeCallNode(Interpreter* interpreter, LiteralArray* arguments) {
Literal fnNameIdentifier = TO_IDENTIFIER_LITERAL(copyString(strptr, strlen(strptr)), strlen(strptr)); Literal fnNameIdentifier = TO_IDENTIFIER_LITERAL(copyString(strptr, strlen(strptr)), strlen(strptr));
//call the function //call the function
Literal result = callEngineNodeLiteral(AS_OPAQUE(nodeLiteral), interpreter, fnNameIdentifier, NULL); Literal result = callEngineNodeLiteral(AS_OPAQUE(nodeLiteral), interpreter, fnNameIdentifier, &extraArgs);
pushLiteralArray(&interpreter->stack, result); pushLiteralArray(&interpreter->stack, result);
//cleanup //cleanup
freeLiteralArray(&extraArgs);
freeLiteral(nodeLiteral); freeLiteral(nodeLiteral);
freeLiteral(fnName); freeLiteral(fnName);
freeLiteral(result); freeLiteral(result);