そこそこ使えるので最小にして書き留めておきたいと思いました
HSP言語用ですがC言語にも使えそうなので今度移植してみようかと思います
;タスクもどき 最小のプログラム
;定数設定
#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