自分でバイナリデータを動かす装置を作ってみたいという発想に至りここ1週間ほどスクリプトを作っていました。
言語はC#だけどC++でも動かせるようにそのうち改造する予定
とりあえずはスクリプトからDXライブラリの機能をコントロールできるようにしてみる
仮にこういうスクリプトを書いてみる
int x_1;
int y_1;
int cnt_1;
int x_2;
int y_2;
int cnt_2;
int x_3;
int y_3;
int cnt_3;
void OnStart(){
FPrint( "start" );
x_1 = -300; y_1 = 150.35; cnt_1 = 0;
x_2 = -300; y_2 = 200.40; cnt_2 = 0;
x_3 = -300; y_3 = 250.55; cnt_3 = 0;
}
void OnUpdate(){
x_1 = -300 + ( 100.0 / 10.0 ) * cnt_1;
x_2 = -300 + ( 150.0 / 5.0 ) * cnt_2;
x_3 = -300 + ( 130.0 / 10.0 ) * cnt_3;
cnt_1++;
cnt_2++;
cnt_3++;
if( cnt_1 >= 15 ){
cnt_1 = 15;
}
if( cnt_2 >= 5 ){
cnt_2 = 5;
}
if( cnt_3 >= 10 ){
cnt_3 = 10;
}
}
void OnDraw(){
DrawString( 0 , 0 , GetColor( 255 , 255 , 255 ) , "cnt = {0},{1},{2}" , cnt_1 , cnt_2 , cnt_3 );
DrawString( x_1 , y_1 , GetColor( 128 , 128 , 0 ) , "テキスト1" );
DrawString( x_2 , y_2 , GetColor( 0 , 128 , 255 ) , "テキスト2" );
DrawString( x_3 , y_3 , GetColor( 255 , 128 , 128 ) , "テキスト3" );
}
OnUpdateとOnDrawは更新処理後にループ中にコールされる
関数スコープ内の変数はローカル扱いになりスコープ外宣言はどこからでも使えるグローバル扱い
今回はDXライブラリのDrawStringとGetColorをスクリプト側から呼び出すようにしてみた。
ソース側の処理としてはこんな感じ
private static FUNCTION OnStart;
private static FUNCTION OnUpdate;
private static FUNCTION OnDraw;
static void loadScript(){
using( System.IO.StreamReader sr = new System.IO.StreamReader( "test.txt" ) ){
string txt = sr.ReadToEnd();
SSLexer lexer = new SSLexer( txt );
lexer.exec();
SSParser parser = new SSParser( lexer );
parser.exec();
OnStart = parser.ProgramObject.GetCompponent( "OnStart" );
OnUpdate = parser.ProgramObject.GetCompponent( "OnUpdate" );
OnDraw = parser.ProgramObject.GetCompponent( "OnDraw" );
}
}
static void Main( string[] args ) {
DX.ChangeWindowMode( DX.TRUE );
DX.DxLib_Init();
DX.SetDrawScreen( DX.DX_SCREEN_BACK );
int state = -1;
int stateNext = 0;
bool isFirst = false;
loadScript();
while( DX.ProcessMessage() == 0 ){
DX.ClsDrawScreen();
update_input();
isFirst = false;
if( state != stateNext ){
state = stateNext;
isFirst = true;
}
switch( state ){
case 0 :
if( isFirst ){
OnStart.execute();
stateNext = 1;
}
break;
case 1 :
if( keyinputtime[DX.KEY_INPUT_ESCAPE] == 1 ){
stateNext = 2;
}
OnUpdate.execute();
OnDraw.execute();
break;
case 2 :
if( isFirst ){
loadScript();
stateNext = 0;
}
break;
}
DX.ScreenFlip();
}
DX.DxLib_End();
スクリプト側の動きがまだ動きが微妙なのでもう少しテストしなくては・・・
文法チェックなども完璧ではないためまだまだ作りが粗いのが今後の課題
配列・構造体も定義できたらいいなぁ
作ってて実感したけどデータ型宣言はいらないかもしれない