1
0

Implement BG callback

This commit is contained in:
otya128
2016-12-31 13:50:44 +09:00
parent 4eb6a1fc98
commit e4deae3b69
4 changed files with 36 additions and 2 deletions

View File

@@ -2735,11 +2735,22 @@ class CallBG : Code
{
override void execute(VM vm)
{
vm.petitcomputer.callidx++;
if (!vm.petitcomputer.callback)
{
vm.petitcomputer.callidx++;
return;
}
vm.petitcomputer.callidx++;
if (!vm.petitcomputer.isValidLayer(vm.petitcomputer.callidx))
{
vm.petitcomputer.callback = false;
return;
}
auto callback = vm.petitcomputer.getBG(vm.petitcomputer.callidx).callback;
vm.pc--;
if (!callback.isCallable)
{
return;
}
callback(vm);
}
}

View File

@@ -249,4 +249,6 @@ class BG
}
}
}
import otya.smilebasic.vm;
Callback callback;
}

View File

@@ -2223,6 +2223,17 @@ class BuiltinFunction
}
BGLOAD(p, layer, 0, 0, p.getBG(layer).width, p.getBG(layer).height, ary, 0);
}
static void BGFUNC(PetitComputer p, int layer, wstring func)
{
if (!p.isValidLayer(layer))
{
throw new OutOfRange("BGFUNC", 1);
}
auto callback = p.vm.createCallback(func);
if (callback.type == CallbackType.none)
throw new IllegalFunctionCall("BGUNC"/*, 2*/);
p.getBG(layer).callback = callback;
}
static void EFCON()
{
}

View File

@@ -526,6 +526,16 @@ class PetitComputer
SDL_SetWindowSize(window, cast(int)(currentDisplay.windowSize.width * scaleX), cast(int)(currentDisplay.windowSize.height * scaleY));
}
bool isValidLayer(int layer)
{
if (layer < 0)
return false;
if(displaynum)
{
return layer < bg.length - bgmax;
}
return layer < bgmax;
}
BG getBG(int layer)
{
if(displaynum)