--[[ コールバック処理のサンプル 障害物とオブジェクトの衝突時などに呼び出される関数をコールバックと呼ぶことにします オブジェクトがブロックにぶつかったら反射するサンプルです ブロック上への着地をさせずにひたすら跳ね返ります ○ボタン 速度を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(MoveObjectNumber, BoxNumber, TriangleNumber, BackBlockNumber) -- 引数 -- MoveObjectNumber -- 移動するキャラクターなどの数を指定します -- -- BoxNumber -- TriangleNumber -- 障害物などブロックの数を指定します -- オブジェクトは速度を与えると -- 自動でブロックとの衝突判定を行いつつ移動します -- 四角ブロックと三角ブロックの設置可能数を与える -- -- BackBlockNumber -- ブロックとは別に画像表示用のキャラクター数 -- -- オブジェクトを初期化 -- ブロックの設置可能数を128にしておく -- 切が良いというだけで128の意味は特にない 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() return end --[[ オブジェクトの情報を初期化する ]] function InitializeObject() -- オブジェクト番号 obj = {} obj.no = 1 -- 番号は1から始まります obj.motion = Anime obj.pattern = 1 obj.count = 0 -- オブジェクトのサイズを設定 -- SetObjectSize(no, width, height) -- 引数 -- no -- 設定するオブジェクトの番号 -- width, height -- オブジェクトの幅と高さ -- SetObjectSize(obj.no, 32, 63) -- 座標を設定 -- SetObjectPosition(no, x, y) -- 引数 -- no -- 設定するオブジェクトの番号 -- x, y -- オブジェクトの座標 -- SetObjectPosition(obj.no, 864, 580) -- 速度を設定 -- SetObjectVelocityReal(no, x, y) -- SetObjectVelocity(no, x, y) -- 引数 -- no -- 設定するオブジェクトの番号 -- x, y -- 速度 -- -- SetObjectVelocity(obj.no, 0, 0) SetObjectVelocityReal(obj.no, 0, 0) -- SetObjectVelocityRealとSetObjectVelocityの違いは -- Real無しはドット単位で速度を与えます -- SetObjectVelocity(1, 10, 4) -- 上記の例だと右に10ドット、下に4ドットの速さを持たせます -- -- Realはドットを100分割したスケールにおける速度を表します -- SetObjectVelocityReal(1, 1000, 400) -- 上記の例だと右に10ドット、下に4ドットの速さを持たせることになります -- -- なぜ100倍した値でも設定できるようになっているかというと -- Realじゃない方は、速度が1ドット未満の情報は切り捨てられるので -- 加速度が0.5などのとき、加速されないことになります -- -- Realだと100倍されるので、50ずつ加速されていくことになります -- その場で使いやすいほうを使ってください return end --[[ ブロックの設置 ]] function SetBlocks() -- 設置されているすべてのブロックを消去する DeleteAllBlock() -- 四角ブロック PutBox(-64, 240, 128, 128) PutBox(1728, 240, 128, 128) PutBox(1856, 240, 128, 128) PutBox(1984, 240, 128, 32) PutBox(64, 336, 128, 32) PutBox(256, 464, 128, 32) PutBox(1408, 464, 128, 32) PutBox(1600, 336, 128, 32) PutBox(512, 592, 128, 32) PutBox(768, 656, 128, 32) PutBox(896, 656, 128, 32) PutBox(1152, 592, 128, 32) -- 三角ブロック PutTriangle(496, 176, 64, 128, 1, -1) PutTriangle(1232, 176, 64, 128, 0, -1) PutTriangle(192, 336, 64, 128, 3, -1) PutTriangle(560, 304, 128, 128, 1, -1) PutTriangle(688, 432, 128, 64, 1, -1) PutTriangle(976, 432, 128, 64, 0, -1) PutTriangle(1104, 304, 128, 128, 0, -1) PutTriangle(1536, 336, 64, 128, 2, -1) PutTriangle(384, 464, 128, 128, 3, -1) PutTriangle(640, 592, 128, 64, 3, -1) PutTriangle(1024, 592, 128, 64, 2, -1) PutTriangle(1280, 464, 128, 128, 2, -1) return end --[[ 四角ブロックの設置 ]] function PutBox(x, y, sizeX, sizeY) -- SetBox(startX, startY, endX, endY, tex, texStartX, texStartY, texWidth, texHeight, subX, subY) -- 引数 -- startX, startY -- ブロック左上座標 -- endX, endY -- ブロック右下座標 -- tex -- ブロック表示に使用するテクスチャ番号 -- texStartX, texStartY -- ブロック表示に使用するテクスチャの切り出し開始位置(左上座標) -- texWidth, texHeight -- ブロック表示に使用するテクスチャの切り出しサイズ -- -1を指定すると、ブロックサイズに合わせて自動で切り出す -- subX, subY -- 切り出したテクスチャは(startX + subX, startY + subY)を開始位置として表示する -- 表示開始位置をずらしたいときに使用する -- -- 戻り値 -- ブロック番号 -- no = SetBox(x, y, x + sizeX - 1, y + sizeY - 1, texBox1, 128, 0, -1, -1, 0, 0); -- 不必要になったブロックは以下のようにして削除することが可能 -- DeleteBox(no) return 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 -- SetTriangle(startX, startY, endX, endY, type, angle, tex, texStartX, texStartY, texWidth, texHeight, subX, subY) -- 引数 -- startX, startY -- ブロック左上座標 -- endX, endY -- ブロック右下座標 -- type -- 斜面がどこにあるか -- 0 = TRIANGLE_TYPE_RIGHT_DOWN -- 1 = TRIANGLE_TYPE_LEFT_DOWN -- 2 = TRIANGLE_TYPE_LEFT_UP -- 3 = TRIANGLE_TYPE_RIGHT_UP -- angle -- ベクトル演算用の角度 -- 例えば斜面が30度であっても、内部演算では0度の水平面として扱うことができる -- tex -- ブロック表示に使用するテクスチャ番号 -- texStartX, texStartY -- ブロック表示に使用するテクスチャの切り出し開始位置(左上座標) -- texWidth, texHeight -- ブロック表示に使用するテクスチャの切り出しサイズ -- -1を指定すると、ブロックサイズに合わせて自動で切り出す -- subX, subY -- 切り出したテクスチャは(startX + subX, startY + subY)を開始位置として表示する -- 表示開始位置をずらしたいときに使用する -- -- 戻り値 -- ブロック番号 -- no = SetTriangle(x, y, x + sizeX - 1, y + sizeY - 1, type, angle, tex, texX, texY, -1, -1, 0, 0); -- 不必要になったブロックは以下のようにして削除することが可能 -- DeleteTriangle(no) return end --[[ 毎フレームこの関数がシステムから呼び出される ]] function MainLoop() PadRefresh() PadUpdate(0) Input = {GetPadStatus()} -- キャラクター移動処理 AliceMove() -- 表示の中心となるキャラクターの座標を取得 x, y = GetObjectPosition(obj.no); -- オブジェクトのサイズを取得 sizeX, sizeY = GetObjectSize(obj.no) -- ビューの座標を計算 -- -- 引数 -- pos -- 基準となる矩形の座標、例えば自キャラの座標をここへ入れる -- キャラが動いたときに、キャラがビュー内に収まるように座標が計算される -- -- size -- 基準となる矩形のサイズ -- CalcViewPoint(x, y, sizeX, sizeY) -- ビューの座標を取得する場合は以下の通り -- view_x, view_y = GetViewPoint() -- DRAW_TO_WORLDとDRAW_TO_VIEWを指定して描画する場合は -- CalcViewPointの後にコマンドを実行してください -- -- 描画コマンドは内部でSCREEN座標系に変換して描画命令を作成しています -- 変換の際にviewの座標を元に変換するので -- 先にview座標を計算しないと表示が多少変になります DrawAnimation(obj.motion, obj.pattern, x, y, 0, DRAW_TO_WORLD) -- ブロック画像を表示 -- DrawBlock(block, object) -- 引数 -- block -- ブロックを表示するZ値 -- back -- 背景画像を表示するZ値 -- Z値によってはブロックより前面に表示も可能です DrawBlock(10, 12) -- オブジェクトの立ち位置を調べる -- box, tri, slope, top = GetObjectStandOn(no) -- 引数 -- no -- 対象となるオブジェクトの番号 -- 戻り値 -- box -- 四角ブロック上に立っていればそのブロック番号 -- tri -- 三角ブロックの水平面上に立っていればそのブロック番号 -- slope -- 三角ブロックの斜面上に立っていればそのブロック番号 -- top -- 三角ブロックの斜面頂上に立っていればそのブロック番号 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() -- オブジェクトが持つ速度を取得 -- x, y = GetObjectVelocityReal(no) -- x, y = GetObjectVelocity(no) -- 引数 -- no -- 対象となるオブジェクトの番号 -- 戻り値 -- x, y -- オブジェクトが持つ速度 -- Realの有無は速度情報が100倍されているかどうかです -- 基本的にreal系だけ使用すればOK -- 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 -- キー入力で左右へ動かす power = 50 -- 加速度 limit = 500 -- 限界速度 -- 加速させる if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then vx = vx - power end if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then vx = vx + power end if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then vy = vy - power end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then vy = vy + power end -- 限界速度を超えないように調節 if (vx > limit) then vx = limit end if (vx < -limit) then vx = -limit end if (vy > limit) then vy = limit end if (vy < -limit) then vy = -limit 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 vy = -5000 -- オブジェクトの立ち位置を変更 -- SetObjectStandOn(no, box, tri, slope, top) -- 引数 -- no -- 対象となるオブジェクトの番号 -- box -- この四角ブロックに立っているものとする -- tri -- この三角ブロックの水平面上に立っているものとする -- slope -- この三角ブロックの斜面上に立っているものとする -- top -- この三角ブロックの斜面頂点上に立っているものとする SetObjectStandOn(obj.no, 0, 0, 0, 0) -- 移動処理において -- ブロック上に立っているときはできるだけブロック上から離れないように移動する -- 上へ向かう速度があったとしても無視してブロック上に居続けようとする -- ジャンプなどでブロックから離れたいときは -- ブロックから離れるような速度をオブジェクトに持たせるだけでは駄目 -- 上のようにしてどのブロック上にも居ないものとして設定を行ってやる必要がある end end -- 速度情報を更新 SetObjectVelocityReal(obj.no, vx, vy) -- オブジェクトの移動処理 -- MoveCheck(no) -- 引数 -- no -- 移動処理を行わせるオブジェクトの番号 -- -- オブジェクトに設定されている速度情報と位置情報を元に移動処理を行います -- ブロックが配置されているときはブロックと衝突判定などを行います -- MoveCheck(obj.no) -- パタパタアニメの処理 obj.motion, obj.pattern, obj.count, loop = CountAnimationPattern(obj.motion, obj.pattern, obj.count, -1, 1, 1) return end -- ************** -- -- ここから下がコールバック関数の処理 -- -- ************** -- オブジェクトを使用するときはここから下の関数が必要になります -- オブジェクトが移動したときにブロックへ衝突したり -- ブロックが移動してオブジェクトに衝突したりなどのイベント時に呼び出される関数群です --[[ ブロックが動いてしがみつき中のオブジェクトにぶつかったとき呼ばれる ブロックは移動後の状態 ]] function MovingBlockHitToClimbingObject(id, box, tri, slope, top, moveX, moveY) -- このサンプルでは非使用 return true end --[[ しがみつき中のオブジェクトが動いておぶじぇくとも移動するときに呼ばれる ブロックは移動後の状態 ]] function ClimbingObjectMovedByBlock(id, box, tri, slope, top, moveX, moveY) -- このサンプルでは非使用 return true end --[[ 立っているブロックが動いたのでオブジェクトも移動するときに呼ばれる ブロックは移動後の状態 ]] function StandingObjectMovedByBlock(id, box, tri, slope, top, moveX, moveY) -- このサンプルでは非使用 return true end --[[ ブロックが動いてオブジェクトにぶつかったときに呼ばれる しがみつき中にぶつかったときは別関数が呼ばれる オブジェクトもブロックも移動前の状態 ]] 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) if (mode == MODE_REFLECT or mode == MODE_REFLECT_X) then -- 現在の速度を取得する vx, vy = GetObjectVelocityReal(id) -- 跳ね返してみる vx = -1 * vx -- 新しい速度に設定する SetObjectVelocityReal(id, vx, vy) -- スクリプト側で処理を完結するときはfalseを返す return false end -- エンジンに処理を任せるときはtrueを返す return true end function MovedObjectHitToBlockForY(id, box, tri, slope, top) if (mode == MODE_REFLECT or mode == MODE_REFLECT_X) then -- 現在の速度を取得する vx, vy = GetObjectVelocityReal(id) -- 跳ね返してみる vy = -1 * vy -- 新しい速度に設定する SetObjectVelocityReal(id, vx, vy) -- スクリプト側で処理を完結するときはfalseを返す return false end -- エンジンに処理を任せるときは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) -- 現在の速度を取得する vx, vy = GetObjectVelocityReal(id) -- 跳ね返してみる -- type, baseX, baseY, plusxX, plusxY, plusyX, plusyY = GetTrianglePosition(id) -- 引数 -- id -- 対象となる三角ブロックの番号 -- 戻り値 -- type -- 三角ブロックの形状 -- 0 = TRIANGLE_TYPE_RIGHT_DOWN -- 1 = TRIANGLE_TYPE_LEFT_DOWN -- 2 = TRIANGLE_TYPE_LEFT_UP -- 3 = TRIANGLE_TYPE_RIGHT_UP -- baseX, baseY -- 直角部分の頂点座標 -- plusxX, plusxY -- 直角部分からX方向へ伸びたところの頂点座標 -- plusyX, plusyY -- 直角部分からY方向へ伸びたところの頂点座標 -- type, baseX, baseY, plusxX, plusxY, plusyX, plusyY = GetTrianglePosition(slope) -- 仮想角度を得る -- angle = GetTriangleAngle(id) -- 引数 -- id -- 対象となる三角ブロックの番号 -- 戻り値 -- angle -- 三角形の斜面角度(設置時に指定した仮想的な角度) angle = GetTriangleAngle(slope) -- 30度の斜面は仮想角度を0度にしているので反射させると変な動きになる -- よって実際の角度である30度に戻している if (angle == 0) then angle = 65536 / 12 end -- 三角ブロックの実際の斜面角度を求める -- (設置時に指定した座標から角度を求めたもの) -- angle = GetTriangleRealAngle(slope) -- 見た目の角度を得る -- 三角関数 -- 角度は0-65535の範囲。3時の方向が0、そこから時計回りに値が増える -- -- sin = MathSin(angle) sin値を求める -- cos = MathCos(angle) cos値を求める -- sin, cos = MathSinCos(angle) sin, cos同時に求める -- -- 角度を求める -- angle = MathAtanInt(x, y) 与える引数は整数値 -- angle = MathAtanInt(x, y) 与える引数は小数値 -- -- 計算に使うsin,cosを求めておく sin, cos = MathSinCos(angle) -- 反射の計算 -- 法線ベクトルを用意するほうがスマート -- 以下の方式だと何をやっているか理解するのに手間がかかる if (type == TRIANGLE_TYPE_RIGHT_UP) then vx = floor * cos - reaction * sin vy = floor * sin + reaction * cos elseif (type == TRIANGLE_TYPE_RIGHT_DOWN) then vx = floor * cos - reaction * sin vy = -floor * sin - reaction * cos elseif (type == TRIANGLE_TYPE_LEFT_UP) then vx = floor * cos + reaction * sin vy = -floor * sin + reaction * cos elseif (type == TRIANGLE_TYPE_LEFT_DOWN) then vx = floor * cos + reaction * sin vy = floor * sin - reaction * cos end -- 新しい速度に設定する SetObjectVelocityReal(id, vx, vy) -- スクリプト側で処理を完結するときはfalseを返す return false 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) -- オブジェクトが移動したときにブロックへ衝突しなかったときでも -- オブジェクトの直下にブロックがあったときは -- そのブロックへ着地できると判定されるので -- 反射処理を行う前に着地をしてしまうことがある -- 勝手に着地されないためにfalseを与えて着地判定をスキップさせている -- しかし、着地判定をスキップしているので -- 着地判定と処理はスクリプト側のどこかで行う必要がある return false end -- オブジェクトが空中へ移動したときに呼び出される -- 例えば、水平面や斜面を移動したときに接するブロックが無い時は空中へ移動する -- 引数 -- id -- 対象となるオブジェクトID function MovingObjectMoveToAir(id) -- ここには落下処理の開始などを書けばよさそう? return true end