--[[ ブロックの移動とコールバック処理のサンプル ○ボタン キャラクターの速度を0にする □ボタン キャラクターを初期配置座標へ戻る ×ボタン ジャンプ △ボタン ボタンを押しながら十字キーを押すとブロックを移動させます ]] 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サイズのテクスチャ使用枚数 4, -- 256サイズのテクスチャ使用枚数 0, -- 512サイズのテクスチャ使用枚数 0, -- 1024サイズのテクスチャ使用枚数 1, -- フォントの使用種類数 1) -- アニメデータの使用数 alice = LoadGraphic("ladder.bmp") font = LoadFontSprite("test") -- ブロック表示に使用するテクスチャ texBox1 = LoadGraphic("block/normal/box.bmp") texBlock45 = LoadGraphic("block/normal/45.bmp") texBlock3060 = LoadGraphic("block/normal/3060.bmp") -- 描画先  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 -- アニメの設定 Anime = CreateAnimation("AnimeAliceWalkRight") time = 20 SetAnimationData(Anime, alice, 0, 128, 64, 64, -16, 0, time); SetAnimationData(Anime, alice, 64, 128, 64, 64, -16, 0, time); SetAnimationData(Anime, alice, 0, 128, 64, 64, -16, 0, time); SetAnimationData(Anime, alice, 128, 128, 64, 64, -16, 0, time); -- オブジェクトを初期化 ObjectDataInitialize(1, 128, 128, 0) -- オブジェクトの情報を初期化 InitializeObject() -- 三角ブロックの形状 TRIANGLE_TYPE_RIGHT_UP = (3) TRIANGLE_TYPE_RIGHT_DOWN = (0) TRIANGLE_TYPE_LEFT_UP = (2) TRIANGLE_TYPE_LEFT_DOWN = (1) -- ブロックの配置 SetBlocks() -- 重力加速度 Gravity = 50 return end --[[ オブジェクトの情報を初期化する ]] function InitializeObject() -- オブジェクト番号 obj = {} obj.no = 1 -- 番号は1から始まります obj.motion = Anime obj.pattern = 1 obj.count = 0 SetObjectSize(obj.no, 32, 63) SetObjectPosition(obj.no, 864, 580) SetObjectVelocityReal(obj.no, 0, 0) SetObjectStandOn(obj.no, 0, 0, 0, 0) -- 対象のオブジェクトを有効にする -- SetObjectSetting(no, status) -- 引数 -- no -- 対象となるオブジェクトの番号 -- status -- 1: 有効 -- 0: 無効 -- -- オブジェクトが有効になっていないと -- 移動判定やあたり判定の対象となりません -- 無効時でも -- オブジェクトが移動したときのブロックとの判定は行われるものの -- ブロックが移動してオブジェクトに衝突しても検知しません -- オブジェクト同士の衝突においても検査対象となりません -- SetObjectSetting(obj.no, 1) -- 未移動距離をクリア -- ObjectDataClearMoveLeft(no) -- 引数 -- no -- 対象となるオブジェクトの番号 -- -- オブジェクトの速度がrealで170だったとします -- このときにMoveCheckで移動させると、100+70=1ドットと残り0.7ドット -- つまり1ドット移動して、0.7ドットは未移動で残ります -- 次のフレームでは先ほどの残り70に速度の170を加えた240=2.4ドットが移動距離となり -- 2ドット移動して40が残って次のフレームで処理されます -- -- 死亡やステージクリアなど新しくステージを開始したり -- リプレイを再生するときなどに、この移動残りが問題になります -- 関係ないプレイの情報が引き継がれることになって変なことになります -- 適切なタイミングに数値を0にしてやる必要があるわけです ObjectDataClearMoveLeft(obj.no) 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()} -- キャラクター移動処理 AliceMove() -- ブロックの移動処理 BlockMove() -- 表示の中心となるキャラクターの座標を取得 x, y = GetObjectPosition(obj.no); sizeX, sizeY = GetObjectSize(obj.no) CalcViewPoint(x, y, sizeX, sizeY) -- 各種表示はCalcViewPointの後で行う DrawAnimation(obj.motion, obj.pattern, x, y, 0, DRAW_TO_WORLD) DrawBlock(10, 12) -- たっているブロックの番号を表示 box, tri, slope, top = GetObjectStandOn(obj.no) DrawFsTextLeft(font, 0, 0, 0, "box " .. box, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 0, 20, 0, "tri " .. tri, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 0, 40, 0, "slo " .. slope, 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, 0, 60, 0, "top " .. top, 0, DRAW_TO_SCREEN) -- 現在の座標と速度を表示 x, y = GetObjectPosition(obj.no) vx, vy = GetObjectVelocityReal(obj.no) DrawFsTextLeft(font, 0, 80, 0, "(" .. x .. "," .. y .. ") [" .. vx .. "," .. vy .. "]" , 0, DRAW_TO_SCREEN) return end --[[ キャラクターの操作 ]] function AliceMove() vx, vy = GetObjectVelocityReal(obj.no) -- ○ボタンが押されたら速度を0にする if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_HOLD) then vx = 0 vy = 0 end -- □ボタンが押されたら座標を初期配置へ戻す if (Input[BUTTON_NUMBER_SQUARE] == BUTTON_STATUS_PUSH) then SetObjectPosition(obj.no, 864, 580) end -- 重力加速 -- 落下速度が速すぎても扱いづらいので1000を上限に加速させる if (vy < 1000) then vy = vy + Gravity end -- キー入力で左右へ動かす power = 100 -- 加速度 limit = 300 -- 限界速度 if (Input[BUTTON_NUMBER_TRIANGLE] == BUTTON_STATUS_NO) then -- 左へ加速させる if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then if (vx > -limit) then vx = vx - power end end -- 右へ加速させる if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then if (vx < limit) then vx = vx + power end end -- 上へ if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then if (vy > -limit) then vy = vy - power end end -- 下へ if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then if (vy < limit) then vy = vy + power end end end -- ×ボタンが押されたらジャンプさせる if (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_PUSH) then -- ブロック上に立っていないときはジャンプできない box, tri, slope, top = GetObjectStandOn(obj.no) if (box ~= 0 or tri ~= 0 or slope ~= 0 or top ~= 0) then -- y方向の速度を設定すると同時に -- オブジェクトをブロック上から離れさせる vy = -1600 SetObjectStandOn(obj.no, 0, 0, 0, 0) end end -- 速度情報を更新 SetObjectVelocityReal(obj.no, vx, vy) -- 移動処理 MoveCheck(obj.no) -- パタパタアニメの処理 obj.motion, obj.pattern, obj.count, loop = CountAnimationPattern(obj.motion, obj.pattern, obj.count, -1, 1, 1) return end --[[ ブロックの移動処理 ]] function BlockMove() -- キー操作で動かすブロック -- △ボタンを押しているときはブロックを動かす if (Input[BUTTON_NUMBER_TRIANGLE] == 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 > 200) 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, 200) MoveBox(BoxUp, 0, -200) MoveBox(BoxLeft, -200, 0) MoveBox(BoxRight, 200, 0) end return end --[[ ブロックが消えたときの処理をまとめたもの ]] function BoxDeleteFunction(id) -- オブジェクトがブロックに乗っているかしらべる local box, tri, slope, top = GetObjectStandOn(obj.no) if (box == id) then -- 対象オブジェクトに乗っていたとき -- そのブロックは消えるのでそのブロックに立っているという情報を消す -- 別ブロックに乗っているか調べても良いが -- ここでは単に度のブロックにも乗っていないものとして簡単に処理 SetObjectStandOn(obj.no, 0, 0, 0, 0) -- DeleteBoxでブロックを消したとしても -- オブジェクトの情報はそのままなので -- 消えているはずのブロックに乗ったままという変な状態になる -- DeleteBoxで消したときも上記と同じような処理が必要になる end return end --[[ 死亡処理 ブロックにはさまれたら死亡とみなして初期配置に戻す ]] function DeathFunction() -- 簡単に処理をするため -- 単に全部の設定をやりなおす InitializeObject() SetBlocks() Count = 0 ObjectDataClearMoveLeft(obj.no); return end -- ************** -- -- ここから下がコールバック関数の処理 -- -- ************** -- オブジェクトを使用するときはここから下の関数が必要になります -- オブジェクトが移動したときにブロックへ衝突したり -- ブロックが移動してオブジェクトに衝突したりなどのイベント時に呼び出される関数群です -- -- ブロックが動いてしがみつき中のオブジェクトにぶつかったとき呼ばれる -- ブロックは移動後の状態 -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- function MovingBlockHitToClimbingObject(id, box, tri, slope, top, moveX, moveY) -- このサンプルでは非使用 return true end -- -- しがみつき中のブロックが動いておぶじぇくとも移動するときに呼ばれる -- ブロックは移動後の状態 -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- 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) -- 移動したブロックの情報を得る -- Sx, Sy, Ex, Ey = GetBoxPosition(box) -- 引数 -- box -- 対象となる四角ブロックの番号 -- 戻り値 -- Sx, Sy -- ブロック左上隅の座標 -- Ex, Ey -- ブロック右下隅の座標 -- local Sx, Sy, Ex, Ey = GetBoxPosition(box) -- 対象オブジェクトの情報を得る local objX, objY = GetObjectPosition(id) local objSizeX, objSizeY = GetObjectSize(id) -- 立っているブロックが動けば、同じ距離オブジェクトも移動するはず objX = objX + moveX objY = objY + moveY -- 移動後のオブジェクトがブロックへ埋もれるか調べる -- 移動後の矩形で当たり判定をとる -- -- 対象矩形と四角ブロックとの衝突判定 -- CheckRectHitToBox(Sx, Sy, Ex, Ey) -- 引数 -- Sx, Sy -- 判定対象矩形の左上座標 -- Ex, Ey -- 判定対象矩形の右下座標 -- 戻り値 -- list -- 矩形と衝突(重なる)ブロック番号のリスト -- 衝突したブロックがすべて列挙されている -- -- 対象矩形と三角ブロックとの衝突判定は同様に -- CheckRectHitToBox(Sx, Sy, Ex, Ey) -- local list = {CheckRectHitToBox(objX, objY, objX + objSizeX-1, objY + objSizeY-1)} local list_tri = {CheckRectHitToTriangle(objX, objY, objX + objSizeX-1, objY + objSizeY-1)} -- #listは衝突した四角ブロックの数 -- #list_triは衝突した三角ブロックの数 if (#list == 0 and #list_tri == 0) then -- 四角、三角どちらのブロックとも衝突しなかったとき -- オブジェクトを移動させる SetObjectPosition(id, objX, objY) return false end -- 以下はブロックとオブジェクトが衝突したときの処理 -- 上に動いて衝突したときは、ブロックに挟まれたことを意味する -- 乗っているブロックと頭上のブロックに挟まれたということ if (moveY < 0) then -- 死亡処理を行う DeathFunction() return false end -- 下に動いて衝突は別ブロックに乗ったことを意味する -- 下へ移動中、別ブロックの上部に衝突したからそこへ乗り移るということ if (moveY > 0) then -- 四角ブロックと衝突したとき if (#list ~= 0) then Sx, Sy, Ex, Ey = GetBoxPosition(list[1]) -- ブロックの座標を調べて objY = Sy - objSizeY -- ブロック上へ乗るようにオブジェクトの座標を計算 SetObjectPosition(id, objX, objY) -- オブジェクトの座標を変更して SetObjectStandOn(id, list[1], 0, 0, 0) -- そのブロックへ立っているように設定して終わり return false end -- 三角ブロックと衝突したときも同様に処理 -- 処理を簡単にするため、スロープとの衝突がおきないものとして処理している -- スロープ上に居るオブジェクトが別ブロックと衝突するのはNGなのです if (#list_tri ~= 0) then -- 三角ブロックの座標などを取得 type, baseX, baseY, plusxX, plusxY, plusyX, plusyY = GetTrianglePosition(list_tri[1]) -- 水平面か頂上にオブジェクトが立つのでそのY座標を調べる -- 斜面が水平面より下と上の両方が考えられるので小さいほうの値を得る if (baseY < plusyY) then Sy = baseY else Sy = plusyY end -- ブロック上へ乗るようにオブジェクトの座標を計算 objY = Sy - objSizeY -- 座標変更 SetObjectPosition(id, objX, objY) -- 斜面頂上と水平面のどちらに立つのか調べて設定 if (type == TRIANGLE_TYPE_RIGHT_DOWN or type == TRIANGLE_TYPE_LEFT_DOWN) then -- 水平面へ着地 SetObjectStandOn(id, 0, list_tri[1], 0, 0) else -- 斜面頂上に着地 SetObjectStandOn(id, 0, 0, 0, list_tri[1]) end return false end end -- 左右に動いて衝突したときはそのブロックに進行を阻まれたときである if (#list ~= 0) then -- 対象ブロックの情報を得る Sx, Sy, Ex, Ey = GetBoxPosition(list[1]) -- 右移動中のとき if (moveX > 0) then -- そのブロックの左側へ密着するように座標を計算 objX = Sx - objSizeX end -- 左移動中のとき if (moveX < 0) then -- そのブロックの右側へ密着するように座標を計算 objX = Ex + 1 end -- 座標更新 SetObjectPosition(id, objX, objY) return false end -- スロープと接触するパターンは考えない -- そのような状況が起きないようにブロックを配置する -- よって、横へ移動したときに三角ブロックと衝突するのは -- 三角ブロックの垂直面とだけである -- if (#list_tri ~= 0) then type, baseX, baseY, plusxX, plusxY, plusyX, plusyY = GetTrianglePosition(list_tri[1]) -- 三角ブロックの座標を求める if (baseX < plusXx) then Sx = baseX Ex = plusxX else Ex = baseX Sx = plusxX end -- あとは四角ブロックと同様の処理 -- 右移動中 if (moveX > 0) then objX = Sx - objSizeX end -- 左移動中 if (moveX < 0) then objX = Ex + 1 end SetObjectPosition(id, objX, objY) return false end return true end -- -- ブロックが動いてオブジェクトにぶつかったときに呼ばれる -- しがみつき中にぶつかったときは別関数が呼ばれる -- ブロックの移動後に呼び出される -- -- 引数 -- id -- 対象となるオブジェクト番号 -- box -- 移動したブロックの番号 -- tri, slope, top -- 三角ブロックの番号だが、三角ブロックは移動不可なので将来に備えた予約 -- 現時点では何の使い道もない -- moveX, moveY -- ブロックの移動量 -- function MovingBlockHitToObject(id, box, tri, slope, top, moveX, moveY) -- 対象ブロックの情報を得る Sx, Sy, Ex, Ey = GetBoxPosition(box) -- オブジェクトの情報を得る objX, objY = GetObjectPosition(id) objSizeX, objSizeY = GetObjectSize(id) -- 左から押された if (moveX > 0) then -- ブロックの右側にオブジェクトが密着するように座標を計算 objX = Ex + 1 end -- 右から押された if (moveX < 0) then -- ブロックの左側にオブジェクトが密着するように座標を計算 objX = Sx - objSizeX end -- 上から押された if (moveY > 0) then -- ブロックの下側にオブジェクトが密着するように座標を計算 objY = Ey + 1 end -- 下から押された if (moveY < 0) then -- ブロックの上側にオブジェクトが密着するように座標を計算 objY = Sy - objSizeY end -- オブジェクトの座標を更新 SetObjectPosition(id, objX, objY) -- 移動後にブロックへ埋もれるか調べる -- 移動後の矩形で当たり判定をとる local list = {CheckRectHitToBox(objX, objY, objX + objSizeX-1, objY + objSizeY-1)} if (#list ~= 0) then -- 衝突があれば0以外が返る -- 死亡処理 DeathFunction() end local list_tri = {CheckRectHitToTriangle(objX, objY, objX + objSizeX-1, objY + objSizeY-1)} if (#list_tri ~= 0) then DeathFunction() end -- オブジェクトがブロック上に立てる状態か調べる -- box, tri, slope, top = ObjectCheckStandBlock(id) -- 引数 -- id -- 対象となるオブジェクトの番号 -- 戻り値 -- box, tri, slope, top -- ブロック上に着地できるならばそのブロック番号が入る -- box, tri, slope, top = ObjectCheckStandBlock(id) -- オブジェクトの立ち位置情報を更新 SetObjectStandOn(id, box, tri, slope, top) return false 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