例えばControlObjに必要な全ての配列変数を渡すのでなくて、ControlObjを2重にして外部からは少しのパラメータを渡すだけで、
2重目のControlObjがモジュール内の内部変数(配列変数)を渡してくれるようにしているなら(=モジュール型変数(#mod〜)を用いる場合の部分的な方法)、
モジュール型変数(#mod〜)を用いなくても良いし、モジュール型変数(#mod〜)を用いるより改変や管理や利用しやすいと思いますけど、どうでしょうか?
(foreachとかデストラクタとかはないですけど。)
// #module Mod1 // ここからは初期化や受け渡しの機能 //モジュール内変数を初期化する #deffunc InitGridConf int pObjNum, int pChipSize // ObjNum = pObjNum : ChipSize = pChipSize //物体 dim Exst, ObjNum dim PosX, ObjNum : dim PosY, ObjNum dim Speed, ObjNum ; dim Houkou, ObjNum dim MoveMode, ObjNum : dim MoveCnt, ObjNum return //モジュール内変数を初期化する #deffunc SetMapSize int pMapSizeX, int pMapSizeY MapSizeX = pMapSizeX : MapSizeY = pMapSizeY return // #deffunc SetObjPrm int ObjNo, int pPosX, int pPosY, int pSpeed // Exst( ObjNo ) = 1 PosX( ObjNo ) = pPosX : PosY( ObjNo ) = pPosY Speed( ObjNo ) = pSpeed return // #deffunc SetObjSpeed int ObjNo, int pSpeed // if MoveCnt( ObjNo ) = 0 : Speed( ObjNo ) = pSpeed return // #deffunc GetObjPrm int ObjNo, var pExst, var pPosX, var pPosY, var pSpeed // pExst = Exst( ObjNo ) pPosX = PosX( ObjNo ) : pPosY = PosY( ObjNo ) pSpeed = Speed( ObjNo ) return // ここからは本体の機能 //格子単位の移動 #deffunc ControlObj int ObjNo, int pHoukou // mControlObj ObjNo, PosX( ObjNo ), PosY( ObjNo ), pHoukou, Speed( ObjNo ), MoveMode( ObjNo ), MoveCnt( ObjNo ) : _Stat = stat mref _Stat2, 64 : _Stat2 = _Stat return //格子単位の移動(=本体) この新規命令は外部から利用しない。ControlObjから利用する。 必要なモジュール内変数 CnfMap( ConfHantei()内で ) MapSizeX.Y ChipSize #deffunc mControlObj int ObjNo, var pPosX, var pPosY, int pHoukou, int pSpeed, var pMoveMode, var pMoveCnt // if Exst( ObjNo ) = 0 : return //制御 //移動 // if pMoveCnt = 0 : if pHoukou ! 0 : pMoveMode = pHoukou : pMoveCnt = ChipSize / pSpeed //格子間を移動する直前である場合 if pMoveCnt = ( ChipSize / pSpeed ) { } //格子間を移動中である場合 if pMoveCnt > 0 { if pMoveMode = 1 : pPosX -= pSpeed if pMoveMode = 4 : pPosX += pSpeed if pMoveMode = 2 : pPosY -= pSpeed if pMoveMode = 8 : pPosY += pSpeed pPosX = limit( pPosX, 0, MapSizeX - ChipSize ) : pPosY = limit( pPosY, 0, MapSizeY - ChipSize ) pMoveCnt -- } // if pMoveCnt = 0 : pMoveMode = 0 //デバグ用に内部変数を返す mref _Stat, 64 : _Stat = pMoveCnt return #global // --------------------------------------------------------------------------------------------------------------------- #if 1 //初期化 ObjNum = 8 : ChipSize = 64 //画面 ScrSzX = 8 * ChipSize : ScrSzY = 7 * ChipSize screen 0, ScrSzX, ScrSzY, 0, ( ginfo_dispx - ScrSzX ) / 2, ( ginfo_dispy - ScrSzY ) / 2 //初期化 // :: InitGridConf ObjNum, ChipSize dim Houkou, ObjNum dim Dbg, ObjNum // :: SetMapSize ScrSzX, ScrSzY //配置 PlayerNo = 5 :: SetObjPrm PlayerNo, 3 * ChipSize, 2 * ChipSize, 4 SetObjPrm 3, 7 * ChipSize, 1 * ChipSize, 4 SetObjPrm 6, 4 * ChipSize, 6 * ChipSize, 4 SetObjPrm 7, 5 * ChipSize, 3 * ChipSize, 4 *main // mTime2 = gettime(7) : mTimeSa = mTime2 - mTime1 : if mTimeSa < 0 : mTimeSa += 1000 if mTimeSa = 0 : mTimeSa = 1 await 1000 / 60 mTime1 = gettime(7) // stick Key, 15 + 64 // if Key & 128 : end //走る場合 :: if Key & 64 : SetObjSpeed PlayerNo, 8 : else : SetObjSpeed PlayerNo, 4 //移動 repeat ObjNum // ObjNo = cnt //方向 // if ObjNo = PlayerNo { Houkou( ObjNo ) = 0 if Key & 1 : Houkou( ObjNo ) = 1 if Key & 4 : Houkou( ObjNo ) = 4 if Key & 2 : Houkou( ObjNo ) = 2 if Key & 8 : Houkou( ObjNo ) = 8 } // if ObjNo ! PlayerNo : if rnd( 100 ) <= 5 : Houkou( ObjNo ) = ( 1 << rnd( 5 ) ) \ 16 //Houkouは0,1,2,4,8のどれかになる //移動 :: ControlObj ObjNo, Houkou( ObjNo ) : Dbg( ObjNo ) = stat //本当はそのstatは衝突した結果を返すことなどに用いる loop //描画 // redraw 0 color 255, 255, 255 : boxf : color //ChipSizeの大きさの格子 repeat ScrSzX / ChipSize _CntX = cnt repeat ScrSzY / ChipSize _CntY = cnt line ChipSize * _CntX + ChipSize, ChipSize * _CntY, ChipSize * _CntX, ChipSize * _CntY : line ChipSize * _CntX + ChipSize, ChipSize * _CntY + ChipSize line ChipSize * _CntX, ChipSize * _CntY + ChipSize : line ChipSize * _CntX, ChipSize * _CntY loop loop //物体 repeat ObjNum // ObjNo = cnt // :: GetObjPrm ObjNo, Exst, PosX, PosY, Speed if Exst = 0 : continue // color : boxf PosX, PosY, PosX + ChipSize, PosY + ChipSize color 255, 255, 255 : pos PosX, PosY : mes "No = " + ObjNo + "\n" + PosX + " " + PosY + "\n" + Speed + " " + Dbg( ObjNo ) loop //await以外の動作速度 color : pos 0, 0 : mes "" + mTimeSa + "ms (fps = " + 1000 / mTimeSa + ")" // redraw 1 // goto *main #endif