スクリプトの開発

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

スクリプトの開発

投稿記事 by せんちゃ » 11年前

SWFファイルの解析をしている際にタグの構造をいろいろ調べていた結果
自分でバイナリデータを動かす装置を作ってみたいという発想に至りここ1週間ほどスクリプトを作っていました。
言語はC#だけどC++でも動かせるようにそのうち改造する予定

とりあえずはスクリプトからDXライブラリの機能をコントロールできるようにしてみる

仮にこういうスクリプトを書いてみる

CODE:

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" );
}
OnStartは更新処理初回時
OnUpdateとOnDrawは更新処理後にループ中にコールされる
関数スコープ内の変数はローカル扱いになりスコープ外宣言はどこからでも使えるグローバル扱い
今回はDXライブラリのDrawStringとGetColorをスクリプト側から呼び出すようにしてみた。

ソース側の処理としてはこんな感じ

CODE:

		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"   );
			}
		}

CODE:

		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();
制御構造はif,while,for,switchが使えて関数定義と呼び出しも可能
スクリプト側の動きがまだ動きが微妙なのでもう少しテストしなくては・・・
文法チェックなども完璧ではないためまだまだ作りが粗いのが今後の課題
配列・構造体も定義できたらいいなぁ
作ってて実感したけどデータ型宣言はいらないかもしれない

コメントはまだありません。