--[[ オブジェクトとブロックのサンプル 障害物の配置とオブジェクトの移動処理 ]] 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サイズのテクスチャ使用枚数 1, -- 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 = 0 -- 水平と同じ扱いにする 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 end if (type == TRIANGLE_TYPE_RIGHT_UP) then texX = 128 texY = 128 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) DrawFsTextLeft(font, 0, 100, 0, view_x .. "," .. view_y, 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 -- キー入力で左右へ動かす 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 = -500 -- オブジェクトの立ち位置を変更 -- 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 -- オブジェクトを使用するときはここから下の関数が必要になります -- オブジェクトが移動したときにブロックへ衝突したり -- ブロックが移動してオブジェクトに衝突したりなどのイベント時に呼び出される関数群です -- 現在は全部trueを返しておけばOK -- このサンプルでは以下の関数を省略しても動作しますが -- 呼び出す関数が見つからない、というエラーでログが一杯になります --[[ ブロックが動いてしがみつき中のオブジェクトにぶつかったとき呼ばれる ブロックは移動後の状態 ]] 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) return true end function MovedObjectHitToBlockForY(id, box, tri, slope, top) return true end -- 空中からスロープへ移るとき function MovingObjectMoveToSlope(id, slope, velX, velY, floor, reaction) return true end -- 移動終了後、床から浮き上がる方向へ速度があるとき function MovedObjectVectorForAir(id, box, tri, slope, top, floor, reaction) return true end -- 別ブロックへ移ったときに呼び出される -- 法線ベクトル量も渡すので呼び出し側で床から浮き上がる処理とか行える -- 特に処理が必要なければtrueを返してライブラリに処理をさせる function MovingObjectChangeStandingPlace(id, box, tri, slope, top, floor, reaction) return true end -- 空中に居たオブジェクトが着地するか判定するとき呼び出される -- 普通はライブラリに任せるておけばよい function MovingObjectCheckStandOn(id) return true; end function MovingObjectMoveToAir(id) return true end