🎉 Celebrating 25 Years of GameDev.net! 🎉
Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!
Scripts and the game loop
I'm trying to understand how you would run a script (AngelScript) along side of a game loop. I may be reading too much but recently was reading in "Game Scripting Mastery" where you may want to have your script execute one line at a time (command-based scripting) for each frame. A frame would be a single pass through the game loop, obviously.
I guess I'm picturing AS to be more of a "one-shot" kind of deal. When you execute the script, the program pointer blocks in C++ at that location until the script has been fully run.
Can someone help me understand this?
Oh, and just thought of another question. Can one script "run" or call another script from script code itself? I've definitely seen this done in Lua.
Thanks.
Steve
Anyone? Beuler? :)
In my own continued research I can see that you can suspend and re-execute the script.
It's not apparent in the documentation where the execution starts up after it has been suspended. Does it start at the last place it left off or does it reset and start at the beginning of the script?
I will do some more experimentation.
-Steve
In my own continued research I can see that you can suspend and re-execute the script.
It's not apparent in the documentation where the execution starts up after it has been suspended. Does it start at the last place it left off or does it reset and start at the beginning of the script?
I will do some more experimentation.
-Steve
Sorry for not responding earlier. I've been extremely busy. For the same reason my answer will be short.
You'll use a line callback function to suspend the script execution after each line, and then resume the execution the next frame by calling Execute() again. The script will resume where it left of, it doesn't restart from the beginning.
A script can call another script if your application registers a function to do this. The application function would then create a new context and execute the new script in that one.
Take a look at the sample applications in the /samples/ directory of the SDK. It will show you how to do all this.
Regards,
Andreas
You'll use a line callback function to suspend the script execution after each line, and then resume the execution the next frame by calling Execute() again. The script will resume where it left of, it doesn't restart from the beginning.
A script can call another script if your application registers a function to do this. The application function would then create a new context and execute the new script in that one.
Take a look at the sample applications in the /samples/ directory of the SDK. It will show you how to do all this.
Regards,
Andreas
Thanks Andreas!
Using LineCallBack callback function to do something like pContext->Suspend() and then somewhere in my game loop call pContext->Execute()? Ok, let's see if I did this right.
//----------------------
// Register the callback
//----------------------
pContext->SetLineCallback(asFUNCTION(MyPerFrameCallback), NULL, asCALL_CDECL);
//-----------------------------
// The script callback function
//-----------------------------
void MyPerFrameCallback(asIScriptContext *ctx /*, void* */)
{
// Suspend the script
// One line from the script has been processed.
ctx->Suspend();
}
...
//----------
// Game loop
//----------
void MainLoop()
{
// You know! :)
ProcessInput();
// Resume the script processing
pContext->Execute();
// Update the frame
FrameUpdate();
// Render
RenderFrame();
}
....
-Steve
[Edited by - smjones on January 31, 2007 2:07:47 PM]
Using LineCallBack callback function to do something like pContext->Suspend() and then somewhere in my game loop call pContext->Execute()? Ok, let's see if I did this right.
//----------------------
// Register the callback
//----------------------
pContext->SetLineCallback(asFUNCTION(MyPerFrameCallback), NULL, asCALL_CDECL);
//-----------------------------
// The script callback function
//-----------------------------
void MyPerFrameCallback(asIScriptContext *ctx /*, void* */)
{
// Suspend the script
// One line from the script has been processed.
ctx->Suspend();
}
...
//----------
// Game loop
//----------
void MainLoop()
{
// You know! :)
ProcessInput();
// Resume the script processing
pContext->Execute();
// Update the frame
FrameUpdate();
// Render
RenderFrame();
}
....
-Steve
[Edited by - smjones on January 31, 2007 2:07:47 PM]
That's correct.
You might want to check the return code from ctx->Execute() though. It should be asEXECUTION_SUSPENDED, otherwise the script has stopped for one or another reason.
You might want to check the return code from ctx->Execute() though. It should be asEXECUTION_SUSPENDED, otherwise the script has stopped for one or another reason.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement