自作のHSP言語でのタスク処理

kinokawa
記事: 6
登録日時: 8年前

自作のHSP言語でのタスク処理

投稿記事 by kinokawa » 8年前

自前のタスクもどきプログラムですが
そこそこ使えるので最小にして書き留めておきたいと思いました
HSP言語用ですがC言語にも使えそうなので今度移植してみようかと思います

CODE:

;タスクもどき 最小のプログラム

;定数設定
#const	OBJ_TYPE		0
#const	OBJ_EVENT		1
#const	OBJ_COUNT		2
#const	OBJ_X			3
#const	OBJ_Y			4
#const	OBJ_LOOP		5

#const	EVENT_TYPE		0
#const	EVENT_COUNT		1

#const	FIX_OBJ			1
#const	FIX_POSMOVE		2
#const	FIX_NOP			3
#const	FIX_END			4
#const	FIX_LOOP		5

dim obj_tbl,6,100;	obj_tbl(オブジェクトテーブル
;	オブジェクトテーブル内容
;	0		1			2			3		4	5
;	タイプ	イベント	カウント	x		y	loop

dim	event_tbl,6,100;	event_tbl(イベントテーブル
;	イベントテーブル内容
;	0				1				2
;	イベント番号	待ちフレーム	以降がイベントによって違う

dim	event_tbl_no,100	;イベントラベル用

ldim lavel,20			;ラベルポインタ
lavel(FIX_OBJ		)=*lavel_OBJ
lavel(FIX_POSMOVE	)=*lavel_POSMOVE
lavel(FIX_NOP		)=*lavel_NOP
lavel(FIX_END		)=*lavel_END
lavel(FIX_LOOP		)=*lavel_LOOP

;イベント用のマクロ定義
#define EVENT_OBJ(%1,%2,%3,%4,%5)	event_tbl(0,event_adr) =  FIX_OBJ,%1,%2,%3,%4,%5	: event_adr++
#define EVENT_POSMOVE(%1,%2,%3)		event_tbl(0,event_adr) =  FIX_POSMOVE,%1,%2,%3		: event_adr++
#define EVENT_NOP(%1)				event_tbl(0,event_adr) =  FIX_NOP,%1				: event_adr++
#define EVENT_END(%1)				event_tbl(0,event_adr) =  FIX_END,%1				: event_adr++
#define EVENT_LOOP(%1,%2,%3)		event_tbl(0,event_adr) =  FIX_LOOP,%1,%2,%3		: event_adr++
#define EVENT_NO_SET(%1)			event_tbl_no(%1) =  event_adr
;-------------------------------------------------------------------------------
;	イベント設定 
EVENT_NO_SET 0		;イベント番号
EVENT_POSMOVE 1,2,2
EVENT_LOOP 0,64,1
EVENT_OBJ 0,0,0,0,1
EVENT_POSMOVE 1,2,0
EVENT_LOOP 0,64,1
EVENT_END 0
;-------------------------------------------------------------------------------
;	分裂用
EVENT_NO_SET 1	;イベント番号
EVENT_POSMOVE 1,0,2
EVENT_LOOP 0,64,1
EVENT_POSMOVE 1,2,0
EVENT_LOOP 0,64,1
EVENT_END 0

obj_tbl(0,0)=1

	repeat

*event_main
		repeat 100
			obj_num=cnt
			if (obj_tbl(OBJ_TYPE,obj_num) >= 1){	;obj_tbl(OBJ_TYPE 1以上でイベント実行
				repeat 
					event_num=obj_tbl(OBJ_EVENT,obj_num);obj_tbl(OBJ_EVENT	イベント番号読み込み
					obj_tbl(OBJ_COUNT,obj_num)++;オブジェクトのイベントカウンターを1増やす
					if (obj_tbl(OBJ_COUNT,obj_num) > event_tbl(EVENT_COUNT,event_num)){;obj_tbl(EVENT_COUNT以上だったら
						gosub lavel(event_tbl(EVENT_TYPE,event_num));イベントを実行する
						if obj_tbl(OBJ_TYPE,obj_num)=0 : break 	;オブジェクトが消去されていたら次のオブジェクトに進む
						obj_tbl(OBJ_EVENT,obj_num)++;次のイベント設定
						obj_tbl(OBJ_COUNT,obj_num)=0;イベントカウント初期化
					}
					else : break	;イベントカウントのみで次のオブジェクトに進む
				loop
			}
		loop

;描画
		redraw 0
		color 255,255,255
		boxf
		color 0,0,0
		repeat 100
			if (obj_tbl(OBJ_TYPE,cnt) >= 1){		;実行中を探す
				x=obj_tbl(OBJ_X,cnt)
				y=obj_tbl(OBJ_Y,cnt)
				boxf x,y,x+30,y+30
			}
		loop
		redraw 1
		await 17
	loop
;-------------------------------------------------------------------------------
;	以下イベント用プログラム
;-------------------------------------------------------------------------------
*lavel_OBJ				;EVENT_OBJ
	x=obj_tbl(OBJ_X,obj_num)
	y=obj_tbl(OBJ_Y,obj_num)
	repeat 100
		if obj_tbl(OBJ_TYPE,cnt)=0{					;空きを探す
			obj_tbl(OBJ_TYPE,cnt)=1					;状態セット 
			obj_tbl(OBJ_EVENT,cnt)=event_tbl_no(event_tbl(5,event_num));イベントセット
			obj_tbl(OBJ_COUNT,obj_num)=0					;イベントカウント初期化
			obj_tbl(OBJ_X,cnt)=x+event_tbl(3,event_num)	;X座標セット
			obj_tbl(OBJ_Y,cnt)=y+event_tbl(4,event_num)	;Y座標セット
			obj_tbl(OBJ_LOOP,cnt)=0	;loop用
			break
		}
	loop
return
;-------------------------------------------------------------------------------
*lavel_POSMOVE			;EVENT_POSMOVE
	obj_tbl(OBJ_X,obj_num)+=event_tbl(2,event_num)		;X座標加算
	obj_tbl(OBJ_Y,obj_num)+=event_tbl(3,event_num)		;Y座標加算
return
;-------------------------------------------------------------------------------
*lavel_NOP				;EVENT_NOP
return
;-------------------------------------------------------------------------------
*lavel_END				;EVENT_END
	obj_tbl(OBJ_TYPE,obj_num)=0				;状態クリア
return
;-------------------------------------------------------------------------------
*lavel_LOOP				;EVENT_LOOP
	obj_tbl(OBJ_LOOP,obj_num)++;LOOPカウンター加算
	if obj_tbl(OBJ_LOOP,obj_num) > event_tbl(2,event_num)  {;通常
		obj_tbl(OBJ_LOOP,obj_num)=0;LOOPカウンターリセット
	}else{
		obj_tbl(OBJ_EVENT,obj_num)-=event_tbl(3,event_num)+1;戻り
	}
return

最後に編集したユーザー kinokawa on 2017年7月21日(金) 22:23 [ 編集 4 回目 ]

kinokawa
記事: 6
登録日時: 8年前

RE: 自作のHSP言語でのタスク処理

投稿記事 by kinokawa » 8年前

なんとかc言語に移植できたものの
配列の一括代入ができなかったので#defineが大変なことに・・・

ブラウザでc言語を実行できるサイトがあったので
https://paiza.io/

テキストベースで実行してみました

CODE:

#include 
//定数設定
const  int OBJ_TYPE     =   0;
const  int OBJ_EVENT    =   1;
const  int OBJ_COUNT    =   2;
const  int OBJ_X        =   3;
const  int OBJ_Y        =   4;
const  int OBJ_LOOP     =   5;
const  int EVENT_TYPE   =   0;
const  int EVENT_COUNT  =   1;
const  int FIX_OBJ      =   0;
const  int FIX_POSMOVE  =   1;
const  int FIX_NOP      =   2;
const  int FIX_END      =   3;
const  int FIX_LOOP     =   4;
//変数設定
int	obj_tbl[6][100];
int	event_tbl[6][100];
int	event_tbl_no[100];
int obj_num=0;
int event_num=0;
int event_adr=0;
//マクロ設定
#define EVENT_OBJ(a,b,c,d,e)    event_tbl[0][event_adr]=FIX_OBJ;    event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_tbl[4][event_adr]=d;event_tbl[5][event_adr]=e;event_adr++;
#define EVENT_POSMOVE(a,b,c)    event_tbl[0][event_adr]=FIX_POSMOVE;event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_adr++;
#define EVENT_NOP(a)            event_tbl[0][event_adr]=FIX_NOP;    event_tbl[1][event_adr]=a;event_adr++;
#define EVENT_END(a)            event_tbl[0][event_adr]=FIX_END;    event_tbl[1][event_adr]=a;event_adr++;
#define EVENT_LOOP(a,b,c)       event_tbl[0][event_adr]=FIX_LOOP;   event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_adr++;
#define EVENT_NO_SET(a)         event_tbl_no[a]=event_adr;
//-------------------------------------------------------------------------------
//イベント関数設定
void lavel_OBJ(){
	int x=obj_tbl[OBJ_X][obj_num];
	int y=obj_tbl[OBJ_Y][obj_num];
	for(int i=0;i event_tbl[2][event_num]){//通常
		obj_tbl[OBJ_LOOP][obj_num]=0;//LOOPカウンターリセット
	}else{
		obj_tbl[OBJ_EVENT][obj_num]-=event_tbl[3][event_num]+1;//戻り
	}
}
//-------------------------------------------------------------------------------
//メイン
int main() {
//-------------------------------------------------------------------------------
///イベントマクロ設定
//   本線用
EVENT_NO_SET(0);    //イベント番号0
EVENT_POSMOVE(1,1,1);//1フレーム待ってからx+1、y+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_OBJ(0,0,0,0,1);//フレーム待ちなしでイベント番号1で分岐を発生させる
EVENT_POSMOVE(1,1,0);//1フレーム待ってからx+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_END(0);//オブジェクト消去
//-------------------------------------------------------------------------------
//   分岐用
EVENT_NO_SET(1);  //イベント番号1
EVENT_POSMOVE(1,0,1);//1フレーム待ってからy+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_POSMOVE(1,1,0);//1フレーム待ってからx+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_END(0);//オブジェクト消去
//-------------------------------------------------------------------------------
//   関数ポインタ設定
void (*po[])() = {lavel_OBJ,lavel_POSMOVE,lavel_NOP,lavel_END,lavel_LOOP};

obj_tbl[0][0]=1;//強制的に本線を発生させる
//-------------------------------------------------------------------------------
//   タスク処理
	
	for(int j=0;j 0){    //obj_tbl(OBJ_TYPE 1以上でイベント実行
				for(;;){
					event_num=obj_tbl[OBJ_EVENT][obj_num];//obj_tbl(OBJ_EVENT  イベント番号読み込み
					obj_tbl[OBJ_COUNT][obj_num]++;//オブジェクトのイベントカウンターを1増やす
					if (obj_tbl[OBJ_COUNT][obj_num] > event_tbl[EVENT_COUNT][event_num]){//obj_tbl(EVENT_COUNT以上だった
						(*po[event_tbl[EVENT_TYPE][event_num]])();//イベントを実行する
						if (obj_tbl[OBJ_TYPE][obj_num]==0){break;}//オブジェクトが消去されていたら次のオブジェクトに進む
						obj_tbl[OBJ_EVENT][obj_num]++;//次のイベント設定
						obj_tbl[OBJ_COUNT][obj_num]=0;//イベントカウント初期化
					}
					else {break;}//イベントカウントのみで次のオブジェクトに進む
				}
			}
		}
		printf("本線 表示中%d x %d y %d  ", obj_tbl[OBJ_TYPE][0], obj_tbl[OBJ_X][0], obj_tbl[OBJ_Y][0]);
		printf("分岐 表示中%d x %d y %d\n", obj_tbl[OBJ_TYPE][1], obj_tbl[OBJ_X][1], obj_tbl[OBJ_Y][1]);		
	}
	return 0;
}

CODE:

本線 表示中1 x 0 y 0  分岐 表示中0 x 0 y 0
本線 表示中1 x 1 y 1  分岐 表示中0 x 0 y 0
本線 表示中1 x 2 y 2  分岐 表示中0 x 0 y 0
本線 表示中1 x 3 y 3  分岐 表示中0 x 0 y 0
本線 表示中1 x 4 y 4  分岐 表示中0 x 0 y 0
本線 表示中1 x 5 y 5  分岐 表示中1 x 5 y 5
本線 表示中1 x 6 y 5  分岐 表示中1 x 5 y 6
本線 表示中1 x 7 y 5  分岐 表示中1 x 5 y 7
本線 表示中1 x 8 y 5  分岐 表示中1 x 5 y 8
本線 表示中1 x 9 y 5  分岐 表示中1 x 5 y 9
本線 表示中0 x 10 y 5  分岐 表示中1 x 5 y 10
本線 表示中0 x 10 y 5  分岐 表示中1 x 6 y 10
本線 表示中0 x 10 y 5  分岐 表示中1 x 7 y 10
本線 表示中0 x 10 y 5  分岐 表示中1 x 8 y 10
本線 表示中0 x 10 y 5  分岐 表示中1 x 9 y 10
本線 表示中0 x 10 y 5  分岐 表示中0 x 10 y 10
本線 表示中0 x 10 y 5  分岐 表示中0 x 10 y 10
本線 表示中0 x 10 y 5  分岐 表示中0 x 10 y 10
本線 表示中0 x 10 y 5  分岐 表示中0 x 10 y 10
本線 表示中0 x 10 y 5  分岐 表示中0 x 10 y 10

kinokawa
記事: 6
登録日時: 8年前

RE: 自作のHSP言語でのタスク処理

投稿記事 by kinokawa » 8年前

今、見直したら POSMOVEが5回 実行されてる・・
今日は疲れたのでまた今度考えよう^^;

kinokawa
記事: 6
登録日時: 8年前

RE: 自作のHSP言語でのタスク処理

投稿記事 by kinokawa » 8年前

loopが発動する前に一回posmoveを実行してるので
+1されるのか原因っぽい(^^;

>EVENT_OBJ(0,0,0,0,1)
EVENT_OBJはオブジェクトを出現させるイベントだけど
やっぱり引数が5個もあると後で見返したときに訳が分からなくなりそうなので
3個ぐらいがいいのかな
一個目は待ちフレーム固定なので実質2個として
キャラクタ番号と初期イベント番号ぐらいにして置くのが妥当なのかな

kinokawa
記事: 6
登録日時: 8年前

RE: 自作のHSP言語でのタスク処理

投稿記事 by kinokawa » 8年前

EVENT_OBJを3個にしただけ・・・
結果はいっしょなので省略

CODE:

#include 
//定数設定
const  int OBJ_TYPE     =   0;
const  int OBJ_EVENT    =   1;
const  int OBJ_COUNT    =   2;
const  int OBJ_X        =   3;
const  int OBJ_Y        =   4;
const  int OBJ_LOOP     =   5;
const  int EVENT_TYPE   =   0;
const  int EVENT_COUNT  =   1;
const  int FIX_OBJ      =   0;
const  int FIX_POSMOVE  =   1;
const  int FIX_NOP      =   2;
const  int FIX_END      =   3;
const  int FIX_LOOP     =   4;
//変数設定
int	obj_tbl[6][100];
int	event_tbl[6][100];
int	event_tbl_no[100];
int obj_num=0;
int event_num=0;
int event_adr=0;
//マクロ設定
#define EVENT_OBJ(a,b,c)	event_tbl[0][event_adr]=FIX_OBJ; event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_adr++;
#define EVENT_POSMOVE(a,b,c) event_tbl[0][event_adr]=FIX_POSMOVE;event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_adr++;
#define EVENT_NOP(a)		event_tbl[0][event_adr]=FIX_NOP; event_tbl[1][event_adr]=a;event_adr++;
#define EVENT_END(a)		event_tbl[0][event_adr]=FIX_END; event_tbl[1][event_adr]=a;event_adr++;
#define EVENT_LOOP(a,b,c)	event_tbl[0][event_adr]=FIX_LOOP;event_tbl[1][event_adr]=a;event_tbl[2][event_adr]=b;event_tbl[3][event_adr]=c;event_adr++;
#define EVENT_NO_SET(a)		event_tbl_no[a]=event_adr;
//-------------------------------------------------------------------------------
//イベント関数設定
void lavel_OBJ(){
	int x=obj_tbl[OBJ_X][obj_num];
	int y=obj_tbl[OBJ_Y][obj_num];
	for(int i=0;i event_tbl[2][event_num]){//通常
		obj_tbl[OBJ_LOOP][obj_num]=0;//LOOPカウンターリセット
	}else{
		obj_tbl[OBJ_EVENT][obj_num]-=event_tbl[3][event_num]+1;//戻り
	}
}
//-------------------------------------------------------------------------------
//メイン
int main() {
//-------------------------------------------------------------------------------
///イベントマクロ設定
//   本線用
EVENT_NO_SET(0);    //イベント番号0
EVENT_POSMOVE(1,1,1);//1フレーム待ってからx+1、y+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_OBJ(0,1,1);//フレーム待ちなしでタイプ1、イベント1でオブジェクトを発生させる
EVENT_POSMOVE(1,1,0);//1フレーム待ってからx+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_END(0);//オブジェクト消去
//-------------------------------------------------------------------------------
//   分岐用
EVENT_NO_SET(1);  //イベント番号1
EVENT_POSMOVE(1,0,1);//1フレーム待ってからy+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_POSMOVE(1,1,0);//1フレーム待ってからx+1
EVENT_LOOP(0,4,1);//フレーム待ちなしで4回戻る 結果POSMOVEを4回実行
EVENT_END(0);//オブジェクト消去
//-------------------------------------------------------------------------------
//   関数ポインタ設定
void (*po[])() = {lavel_OBJ,lavel_POSMOVE,lavel_NOP,lavel_END,lavel_LOOP};

obj_tbl[0][0]=1;//強制的に本線を発生させる
//-------------------------------------------------------------------------------
//   タスク処理
	
	for(int j=0;j 0){    //obj_tbl(OBJ_TYPE 1以上でイベント実行
				for(;;){
					event_num=obj_tbl[OBJ_EVENT][obj_num];//obj_tbl(OBJ_EVENT  イベント番号読み込み
					obj_tbl[OBJ_COUNT][obj_num]++;//オブジェクトのイベントカウンターを1増やす
					if (obj_tbl[OBJ_COUNT][obj_num] > event_tbl[EVENT_COUNT][event_num]){//obj_tbl(EVENT_COUNT以上だった
						(*po[event_tbl[EVENT_TYPE][event_num]])();//イベントを実行する
						if (obj_tbl[OBJ_TYPE][obj_num]==0){break;}//オブジェクトが消去されていたら次のオブジェクトに進む
						obj_tbl[OBJ_EVENT][obj_num]++;//次のイベント設定
						obj_tbl[OBJ_COUNT][obj_num]=0;//イベントカウント初期化
					}
					else {break;}//イベントカウントのみで次のオブジェクトに進む
				}
			}
		}
		printf("本線 表示中%d x %d y %d  ", obj_tbl[OBJ_TYPE][0], obj_tbl[OBJ_X][0], obj_tbl[OBJ_Y][0]);
		printf("分岐 表示中%d x %d y %d\n", obj_tbl[OBJ_TYPE][1], obj_tbl[OBJ_X][1], obj_tbl[OBJ_Y][1]);		
	}
	return 0;
}
最後に編集したユーザー kinokawa on 2017年7月24日(月) 21:31 [ 編集 2 回目 ]