--[[ オブジェクトのサンプル ]] 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") -- 描画先  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 -- ブロックとは別に画像表示用のキャラクター数 -- -- このサンプルではMoveObjectNumberのみ使用 -- オブジェクトを初期化 ObjectDataInitialize(1, 0, 0, 0) -- オブジェクトの情報を初期化 InitializeObject() -- 三角ブロックの形状 TRIANGLE_TYPE_RIGHT_UP = (3) TRIANGLE_TYPE_RIGHT_DOWN = (0) TRIANGLE_TYPE_LEFT_UP = (2) TRIANGLE_TYPE_LEFT_DOWN = (1) 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, 480/2, 272/2) -- 速度を設定 -- 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 MainLoop() PadRefresh() PadUpdate(0) Input = {GetPadStatus()} -- キャラクター移動処理 AliceMove() -- 表示の中心となるキャラクターの座標を取得 x, y = GetObjectPosition(obj.no) -- 描画コマンドは内部で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) -- 現在の座標と速度を表示 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 -- 速度情報を更新 SetObjectVelocityReal(obj.no, vx, vy) -- オブジェクトの移動処理 -- MoveCheck(no) -- 引数 -- no -- 移動処理を行わせるオブジェクトの番号 -- -- オブジェクトに設定されている速度情報と位置情報を元に移動処理を行います -- ブロックが配置されているときはブロックと衝突判定などを行います -- MoveCheck(obj.no) -- 画面を越えて移動しないようにする x, y = GetObjectPosition(obj.no) sizeX, sizeY = GetObjectSize(obj.no) vx, vy = GetObjectVelocityReal(obj.no) if (x < 0) then x = 0 vx = 0 end if (y < 0) then y = 0 vy = 0 end if (x + sizeX > 480) then x = 480 - sizeX vx = 0 end if (y + sizeY > 272) then y = 272 - sizeY vy = 0 end SetObjectPosition(obj.no, x, y) SetObjectVelocityReal(obj.no, vx, vy) -- パタパタアニメの処理 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