--[[ ワイヤー処理のサンプル 十字キー ブロック黒を動かす △×□○ ブロック茶を動かす R1+十字キー ブロックを動かす L1 ワイヤーを張りなおす start ワイヤー情報表示切替 ワイヤー判定はブロック隅とだけ行います ブロックの各辺との判定は行います ブロックが移動して別のブロックを通過するときに ワイヤーがブロック内に埋もれてしまうときは 埋もれたかを判定してワイヤーを消去する必要があります ワイヤーが埋もれても良い場合はそのまま何もする必要ありません ブロックの種類によってワイヤーが貫通するなど適当に処理してください 線の折れ曲がる点を節点と呼ぶことにします 折れ曲がっていない線の両端も節点と呼ぶことにして 先端部の節点を1番、末端部を2番とします 途中で一箇所折れ曲がりが起こると、節点数は3になり 先端部から1番、2番、3番と番号を割り振ります ]] function Initialize() SetWorldSize(2048, 1024) SetViewSize(480, 272) SetViewPos(0, 0) SetDrawSize(480, 272) SetDrawPos(0, 0) -- 描画システムの初期化 GraphicInitialize( 1, -- SCREEN_MODE_REALSIZE (0) -- PCとPSPの区別をつけず、座標とサイズをそのまま適用 -- SCREEN_MODE_FIT_PSP (1) -- PSPを基準にしてPCでは座標系を倍のサイズとして処理をする -- SCREEN_MODE_FIT_PC (2) -- PCを基準にしてPSPでは座標系を半分のサイズとして処理をする 0, -- テクスチャデータの扱いかた -- TEXTURE_MODE_REALSIZE (0) -- テクスチャをPSPでもそのまま読み込む -- TEXTURE_MODE_SHRINK (1) -- テクスチャをPSPでは半分のサイズにして読み込む 11, -- 64サイズのテクスチャ使用枚数 0, -- 128サイズのテクスチャ使用枚数 3, -- 256サイズのテクスチャ使用枚数 0, -- 512サイズのテクスチャ使用枚数 0, -- 1024サイズのテクスチャ使用枚数 1, -- フォントの使用種類数 0) -- アニメデータの使用数 font = LoadFontSprite("test") -- ブロック表示に使用するテクスチャ texBox1 = LoadGraphic("block/normal/box.bmp") texBlock45 = LoadGraphic("block/normal/45.bmp") texBlock3060 = LoadGraphic("block/normal/3060.bmp") -- オブジェクトを初期化 ObjectDataInitialize(0, 128, 128, 0) -- 描画先  DRAW_TO_WORLD = 0 DRAW_TO_VIEW = 1 DRAW_TO_SCREEN = 2 -- ボタンの状態 BUTTON_STATUS_NO = (-1) -- 押していない BUTTON_STATUS_PUSH = (0) -- 押した瞬間 BUTTON_STATUS_HOLD = (1) -- 押している BUTTON_STATUS_PULL = (2) -- 離した瞬間 -- ボタン番号 BUTTON_NUMBER_NONE =0 BUTTON_NUMBER_L1 =1 BUTTON_NUMBER_L2 =2 BUTTON_NUMBER_R1 =3 BUTTON_NUMBER_R2 =4 BUTTON_NUMBER_SELECT =5 BUTTON_NUMBER_START =6 BUTTON_NUMBER_TRIANGLE =7 BUTTON_NUMBER_SQUARE =8 BUTTON_NUMBER_CROSS =9 BUTTON_NUMBER_CIRCLE =10 BUTTON_NUMBER_UP =11 BUTTON_NUMBER_DOWN =12 BUTTON_NUMBER_RIGHT =13 BUTTON_NUMBER_LEFT =14 BUTTON_NUMBER_MAX =15 -- 三角ブロックの形状 TRIANGLE_TYPE_RIGHT_UP = (3) TRIANGLE_TYPE_RIGHT_DOWN = (0) TRIANGLE_TYPE_LEFT_UP = (2) TRIANGLE_TYPE_LEFT_DOWN = (1) InitializeObject() -- ワイヤー情報を表示するか否か -- 1:表示 0:非表示 LureInfoDraw = 1 return end --[[ オブジェクトの情報を初期化する ]] function InitializeObject() -- obj1は黒ブロック、obj2は茶ブロックをあらわす obj1 = {} obj2 = {} obj1.x, obj1.y = 864, 580 obj2.x, obj2.y = 900, 580 -- ワイヤーを張る -- WireInitialize(x1, y1, x2, y2) -- 引数 -- x1, y1 -- ワイヤー先端座標 -- x2, y2 -- ワイヤー末端座標 -- -- ブロックの中央からワイヤーを伸ばしている -- ワイヤーはゲーム中に一本だけ使うことができる WireInitialize(obj1.x + 8, obj1.y + 8, obj2.x + 8, obj2.y + 8) -- ブロックの配置 SetBlocks() return end --[[ ブロックの設置 ]] function SetBlocks() -- 設置されているすべてのブロックを消去する DeleteAllBlock() -- 四角ブロック PutBox(848, 144, 128, 128) PutBox(1984, 240, 128, 32) PutBox(624, 448, 128, 32) PutBox(1040, 448, 128, 32) PutBox(384, 560, 128, 128) PutBox(512, 656, 128, 32) PutBox(640, 656, 128, 32) PutBox(768, 656, 128, 32) PutBox(896, 656, 128, 32) PutBox(1024, 656, 128, 32) PutBox(1152, 656, 128, 32) PutBox(1280, 560, 128, 128) -- 動かせるブロックを配置 -- あとで使用するのでブロック番号を記録しておく MovableBox = PutBox(864,496,64, 32) -- 下へ BoxDown = PutBox(1040,288,64,32) -- 上へ BoxUp = PutBox(656,736,64,32) -- 左へ BoxLeft = PutBox(1312,592,64,32) -- 右へ BoxRight = PutBox(432,592,64,32) -- ブロック移動に使用するカウンタ Count = 0 return end --[[ 四角ブロックの設置 ]] function PutBox(x, y, sizeX, sizeY) no = SetBox(x, y, x + sizeX - 1, y + sizeY - 1, texBox1, 128, 0, -1, -1, 0, 0); return no end --[[ 三角ブロックの設置 ]] function PutTriangle(x, y, sizeX, sizeY, type, angle) -- 斜面の角度を調べる if (sizeX > sizeY) then angleType = 30 angle = 30 elseif (sizeX < sizeY) then angleType = 60 angle = 60 else angleType = 45 angle = 45 end -- テクスチャの切り出し位置とサイズを計算する if (angleType == 45) then tex = texBlock45 if (type == TRIANGLE_TYPE_LEFT_UP) then texX = 0 texY = 128 - sizeY end if (type == TRIANGLE_TYPE_RIGHT_UP) then texX = 128 texY = 0 end if (type == TRIANGLE_TYPE_LEFT_DOWN) then texX = 0 texY = 128 end if (type == TRIANGLE_TYPE_RIGHT_DOWN) then texX = 128 texY = 256 - sizeY end end if (angleType == 30) then tex = texBlock3060 if (type == TRIANGLE_TYPE_LEFT_UP) then texX = 0 texY = 192 - sizeY angle = 0 -- 水平と同じ扱いにする end if (type == TRIANGLE_TYPE_RIGHT_UP) then texX = 128 texY = 128 angle = 0 -- 水平と同じ扱いにする end if (type == TRIANGLE_TYPE_LEFT_DOWN) then texX = 0 texY = 192 end if (type == TRIANGLE_TYPE_RIGHT_DOWN) then texX = 128 texY = 256 - sizeY end end if (angleType == 60) then tex = texBlock3060 if (type == TRIANGLE_TYPE_LEFT_UP) then texX = 0 texY = 128 - sizeY end if (type == TRIANGLE_TYPE_RIGHT_UP) then texX = 64 texY = 0 end if (type == TRIANGLE_TYPE_LEFT_DOWN) then texX = 128 texY = 0 end if (type == TRIANGLE_TYPE_RIGHT_DOWN) then texX = 192 texY = 128 - sizeY end end no = SetTriangle(x, y, x + sizeX - 1, y + sizeY - 1, type, angle, tex, texX, texY, -1, -1, 0, 0); return no end --[[ 毎フレームこの関数がシステムから呼び出される ]] function MainLoop() PadRefresh() PadUpdate(0) Input = {GetPadStatus()} -- キャラクター移動処理 PlayerMove() -- ブロックの移動処理 BlockMove() -- view位置調整 CalcViewPoint(obj1.x, obj1.y, 16, 16) WireDraw() -- ワイヤー描画 DrawBlock(10, 12) -- ブロック描画 -- ワイヤー両端のブロックを描画 DrawTexture(texBox1, obj1.x, obj1.y, 16, 16, 0, 0, 16, 16, 15, DRAW_WORLD) DrawTexture(texBox1, obj2.x, obj2.y, 16, 16, 128, 0, 16, 16, 15, DRAW_WORLD) -- ワイヤー情報の表示非表示を切り替える if (Input[BUTTON_NUMBER_L1] == BUTTON_STATUS_PUSH) then LureInfoDraw = 1 - LureInfoDraw end return end --[[ ブロックの操作 ]] function PlayerMove() length = 2 -- 黒の移動 -- Rを押しているときは黒を操作させない if (Input[BUTTON_NUMBER_R1] == BUTTON_STATUS_NO) then if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then obj1.y = obj1.y - length end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then obj1.y = obj1.y + length end if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then obj1.x = obj1.x - length end if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then obj1.x = obj1.x + length end -- ブロックが移動したのでワイヤー端も移動させる -- ワイヤーの先端部を移動させる -- WireMoveFirst(x, y) -- 引数 -- x, y -- 移動先の座標 -- WireMoveFirst(obj1.x + 8, obj1.y + 8) end -- 茶の移動 if (Input[BUTTON_NUMBER_TRIANGLE] == BUTTON_STATUS_HOLD) then obj2.y = obj2.y - length end if (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_HOLD) then obj2.y = obj2.y + length end if (Input[BUTTON_NUMBER_SQUARE] == BUTTON_STATUS_HOLD) then obj2.x = obj2.x - length end if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_HOLD) then obj2.x = obj2.x + length end -- ワイヤーの末端部を移動させる -- WireMoveLast(x, y) -- 引数 -- x, y -- 移動先の座標 -- WireMoveLast(obj2.x + 8, obj2.y + 8) -- L1が押されたらワイヤーを張りなおす if (Input[BUTTON_NUMBER_L1] == BUTTON_STATUS_PUSH) then -- ワイヤー消去 -- WireDeleteAll() -- WireDeleteAll() -- このサンプルではすぐにワイヤーを張りなおす WireInitialize(obj1.x + 8, obj1.y + 8, obj2.x + 8, obj2.y + 8) end return end --[[ ブロックの移動処理 ]] function BlockMove() -- キー操作で動かすブロック -- △ボタンを押しているときはブロックを動かす if (Input[BUTTON_NUMBER_R1] == BUTTON_STATUS_HOLD) then if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then -- ブロックを動かす -- MoveBox(id, x, y) -- 引数 -- id -- 対象となる四角ブロックの番号 -- x, y -- 移動させる距離、Real座標系なので1ドットは100で表される -- MoveBox(MovableBox, -200, 0) end if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then MoveBox(MovableBox, 200, 0) end if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then MoveBox(MovableBox, 0, -200) end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then MoveBox(MovableBox, 0, 200) end end -- ブロック自ら動く処理 -- カウンタを進めて Count = Count + 1 -- カウンタが一定値を超えたときにブロックを初期配置に戻す if (Count > 400) then -- 初期配置に戻す Count = 0 -- カウンタをリセット -- ブロックの消滅処理 BoxDeleteFunction(BoxUp) BoxDeleteFunction(BoxDown) BoxDeleteFunction(BoxRight) BoxDeleteFunction(BoxLeft) -- ブロックの位置を変更 -- SetBoxPosition(id, x, y) -- 引数 -- id -- 対象となる四角ブロックの番号 -- x, y -- 移動先の座標 -- SetBoxPosition(BoxDown, 1040, 288) SetBoxPosition(BoxUp, 656, 736) SetBoxPosition(BoxLeft, 1312, 592) SetBoxPosition(BoxRight, 432, 592) else -- ブロックを動かす MoveBox(BoxDown, 0, 100) MoveBox(BoxUp, 0, -100) MoveBox(BoxLeft, -100, 0) MoveBox(BoxRight, 100, 0) end return end --[[ ルアーとワイヤーの描画 ]] function WireDraw() -- ワイヤーの節点数を求める -- -- number = WireGetMaxNumber() -- 戻り値 -- number -- 節点数 -- max = WireGetMaxNumber() -- ワイヤーを描画する for i=1, max-1, 1 do -- 節点と節点の間がワイヤーなので、ワイヤーの線は節点数-1になる -- 節点の座標を求める -- -- x, y = WireGetPosition(no) -- 引数 -- no -- 対象節点の番号 -- 戻り値 -- x, y -- 節点の座標 -- startX, startY = WireGetPosition(i) -- 描画開始座標 endX, endY = WireGetPosition(i+1) -- 描画終了座標 -- 直線を描画する -- DrawLine(startX, startY, endX, endY, r, g, b, z, draw_to) -- 引数 -- startX, startY -- 描画開始座標 -- endX, endY -- 描画終了座標 -- r, g, b -- カラー値(赤、緑、青)0-255の範囲で指定する -- z -- Z値 -- draw_to -- 使用座標系 -- DrawLine(startX, startY, endX, endY, 255, 255, 255, 0, DRAW_TO_WORLD) end -- サンプルでは使ってないワイヤー関連関数の説明 -- 対象節点の角度を調べる -- angle = WireGetAngle(no) -- 引数 -- no -- 対象となる節点 -- 戻り値 -- angle -- 対象節点から次の節点を見たときの角度 -- 対象節点間の距離を調べる -- length = WireGetLength(no) -- 引数 -- no -- 対象節点 -- 戻り値 -- length -- 対象節点と次の節点間の距離 -- 対象節点がブロック隅へ巻きついている回転方向を調べる -- rotation = WireGetRotation(no) -- 引数 -- no -- 対象節点 -- 戻り値 -- 対象節点から次の節点を見たときのワイヤーまきつき方向 -- 1 正回転(時計回り) -- 0 逆回転(反時計回り) -- 対象節点における情報をいろいろ得る -- angle, length, no, no_old, posX, posY, posOldX, posOldY, rotation = WireGetCornerStatus(no) -- 引数 -- no -- 対象節点 -- 戻り値 -- angle -- 角度 -- length -- 距離 -- no -- 引っかかっているブロック隅の番号 -- no_old -- 前フレームで引っかかっていたブロック隅の番号 -- posX, posY -- 現座標 -- posOldX, posOldY -- 前フレームでの座標 -- rotation -- まきつき方向 printY = 0 printSubY = 20 i = 1 if (LureInfoDraw == 1) then DrawFsTextLeft(font, 0, printY + (i-1) * printSubY, 0, "ang", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 100, printY + (i-1) * printSubY, 0, "len", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 150, printY + (i-1) * printSubY, 0, "no", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 200, printY + (i-1) * printSubY, 0, "old", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 250, printY + (i-1) * printSubY, 0, "X", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 310, printY + (i-1) * printSubY, 0, "Y", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 370, printY + (i-1) * printSubY, 0, "oldX", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 430, printY + (i-1) * printSubY, 0, "oldY", 0, DRAW_TO_SCREEN) for i=1, max-1, 1 do startX, startY = WireGetPosition(i) endX, endY = WireGetPosition(i+1) if (WireGetRotation(i)==1) then DrawFsTextLeft(font, startX, startY, 0, "T", 0, DRAW_TO_WORLD) else DrawFsTextLeft(font, startX, startY, 0, "F", 0, DRAW_TO_WORLD) end angle, length, no, no_old, posX, posY, posOldX, posOldY, rotation = WireGetCornerStatus(i) -- posX, posY = WireGetPosition(i) DrawFsTextLeft(font, 0, printY + (i) * printSubY, 0, angle, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 100, printY + (i) * printSubY, 0, length, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 150, printY + (i) * printSubY, 0, no, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 200, printY + (i) * printSubY, 0, no_old, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 250, printY + (i) * printSubY, 0, posX, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 310, printY + (i) * printSubY, 0, posY, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 370, printY + (i) * printSubY, 0, posOldX, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 430, printY + (i) * printSubY, 0, posOldY, 0, DRAW_TO_SCREEN) end angle, length, no, no_old, posX, posY, posOldX, posOldY, rotation = WireGetCornerStatus(max) -- posX, posY = WireGetPosition(max) DrawFsTextLeft(font, 0, printY + (max) * printSubY, 0, angle, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 100, printY + (max) * printSubY, 0, length, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 150, printY + (max) * printSubY, 0, no, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 200, printY + (max) * printSubY, 0, no_old, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 250, printY + (max) * printSubY, 0, posX, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 310, printY + (max) * printSubY, 0, posY, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 370, printY + (max) * printSubY, 0, posOldX, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 430, printY + (max) * printSubY, 0, posOldY, 0, DRAW_TO_SCREEN) end return end --[[ ブロックが消えたときの処理をまとめたもの ]] function BoxDeleteFunction(id) -- 対象ブロックにひっかかっているワイヤーの処理はエンジン側で処理をするので -- スクリプト側では特にすることがない return end -- ************** -- -- ここから下がコールバック関数の処理 -- -- ************** -- オブジェクトを使用するときはここから下の関数が必要になります -- オブジェクトが移動したときにブロックへ衝突したり -- ブロックが移動してオブジェクトに衝突したりなどのイベント時に呼び出される関数群です -- -- ブロックが動いてしがみつき中のオブジェクトにぶつかったとき呼ばれる -- ブロックは移動後の状態 -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- -- 戻り値 -- true/falseを返すが、今のところ特に意味はない -- function MovingBlockHitToClimbingObject(id, box, tri, slope, top, moveX, moveY) return true end -- -- しがみつき中のブロックが動いてオブジェクトも移動するときに呼ばれる -- ブロックは移動後の状態 -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- -- 戻り値 -- true/falseを返すが、今のところ特に意味はない -- function ClimbingObjectMovedByBlock(id, box, tri, slope, top, moveX, moveY) return true end -- -- 立っているブロックが動いたのでオブジェクトも移動するときに呼ばれる -- ブロックは移動後の状態 -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- function StandingObjectMovedByBlock(id, box, tri, slope, top, moveX, moveY) return true end -- -- ブロックが動いてオブジェクトにぶつかったときに呼ばれる -- しがみつき中にぶつかったときは別関数が呼ばれる -- ブロックの移動後に呼び出される -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- function MovingBlockHitToObject(id, box, tri, slope, top, moveX, moveY) return true end --[[ オブジェクト移動後にブロックへぶつかっているときに呼び出される ここでX,Yそれぞれの成分を0にしないと速度が保存されてブロックから離れた瞬間飛び出す 壁にぶつかって跳ね返るときは正負を逆にすれば良い 他には着地ブロックを見てあれやこれや 引数 id 対象となるオブジェクトID box, tri, slope, top ぶつかったブロックのID ただし、最初に衝突判定されたブロックIDのみ返すので 複数個に衝突したかどうか、引数だけではわからない ]] function MovedObjectHitToBlockForX(id, box, tri, slope, top) -- エンジンに処理を任せるときはtrueを返す return true end function MovedObjectHitToBlockForY(id, box, tri, slope, top) -- エンジンに処理を任せるときはtrueを返す return true end -- 空中からスロープへ移るとき -- 引数 -- id -- 対象となるオブジェクトID -- box, tri, slope, top -- ぶつかったブロックのID -- ただし、最初に衝突判定されたブロックIDのみ返すので -- 複数個に衝突したかどうか、引数だけではわからない -- velX, velY -- オブジェクトの速度 -- floor -- 床方向の速度成分。x方向をプラス方向とする -- reactiojn -- 床垂直(法線)の速度成分。法線方向をプラスとする -- -- floorとreactionは仮想角度を使って計算された結果が与えられる -- 見た目の角度による計算結果ではない -- function MovingObjectMoveToSlope(id, slope, velX, velY, floor, reaction) return true end -- 移動終了後、床から浮き上がる方向へ速度があるとき -- 引数 -- id -- 対象となるオブジェクトID -- box, tri, slope, top -- ぶつかったブロックのID -- ただし、最初に衝突判定されたブロックIDのみ返すので -- 複数個に衝突したかどうか、引数だけではわからない -- floor -- 床方向の速度成分。x方向をプラス方向とする -- reactiojn -- 床垂直(法線)の速度成分。法線方向をプラスとする -- function MovedObjectVectorForAir(id, box, tri, slope, top, floor, reaction) -- 一定以上の浮力がかかったらブロックから離れる処理などを書く return true end -- 別ブロックへ移ったときに呼び出される -- 法線ベクトル量も渡すので呼び出し側で床から浮き上がる処理とか行える -- 特に処理が必要なければtrueを返してライブラリに処理をさせる -- 引数 -- id -- 対象となるオブジェクトID -- box, tri, slope, top -- ぶつかったブロックのID -- ただし、最初に衝突判定されたブロックIDのみ返すので -- 複数個に衝突したかどうか、引数だけではわからない -- floor -- 床方向の速度成分。x方向をプラス方向とする -- reactiojn -- 床垂直(法線)の速度成分。法線方向をプラスとする function MovingObjectChangeStandingPlace(id, box, tri, slope, top, floor, reaction) return true end -- 空中に居たオブジェクトが着地するか判定するとき呼び出される -- 普通はライブラリに任せるておけばよい -- 引数 -- id -- 対象となるオブジェクトID function MovingObjectCheckStandOn(id) return true end -- オブジェクトが空中へ移動したときに呼び出される -- 例えば、水平面や斜面を移動したときに接するブロックが無い時は空中へ移動する -- 引数 -- id -- 対象となるオブジェクトID function MovingObjectMoveToAir(id) -- ここには落下処理の開始などを書けばよさそう? return true end