モジュール型変数(#mod〜)なしでモジュール変数(相当機能)を扱う方法の提案
2013/7/28(Sun) 13:04:07|NO.55943
モジュール内変数を、モジュール型変数が持っているモジュール変数として扱う方法です。
例えば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
ツノン 2013/7/28(Sun) 14:49:58|NO.55945
それが基本的なモジュールの使い方なので、その様に使っていただいて構わないと思います。