--[[ リプレイ機能サンプル 操作方法(パッド必須) PSコントローラーとしてボタンを解説 十字キーでキャラを動かして Startボタンで一時停止 Selectボタンを押すとモードが切り替わる モードは以下の3つ 「通常モード」「記録モード」「再生モード」 「通常モード 適当に操作するだけ Selectを押すと記録モードへ移行する 「記録モード」 キャラの動きを記録する Selectを押すと再生モードへ移行する 「再生モード」 記録モードで記録した動きを再現する 最初は一時停止状態で始まるのでStartを押すと再生開始 入力情報はリプレイデータとして記録されますが 記録できるのは最大10分までです 最大値チェックやバグチェックはしていないので 10分近くで何が起こるか保障はしません ]] function Initialize() SetWorldSize(1024, 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サイズのテクスチャ使用枚数 -- 今回は256*256のテクスチャ1枚読み込むので1を指定 0, -- 512サイズのテクスチャ使用枚数 0, -- 1024サイズのテクスチャ使用枚数 1, -- フォントの使用種類数 -- フォントを1種類使用するので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 -- パタパタアニメを作成(モーション番号の取得) Motion = CreateAnimation("") Pattern = 0 Count = 0 -- パタパタアニメの情報を設定 time = 20 SetAnimationData(Motion, alice, 0, 128, 64, 64, -16, 0, time); SetAnimationData(Motion, alice, 64, 128, 64, 64, -16, 0, time); SetAnimationData(Motion, alice, 0, 128, 64, 64, -16, 0, time); SetAnimationData(Motion, alice, 128, 128, 64, 64, -16, 0, time); -- キャラの座標 x, y = 480 / 2, 272 / 2 -- キャラのサイズ size_x, size_y = 32, 63 -- キャラが移動可能な最大範囲 limit_x, limit_y = 480, 272 -- 現在の動作モード replay_mode = 0 -- 一時停止中のときは1にする pausing = 0 return end --[[ 毎フレームこの関数がシステムから呼び出される ]] function MainLoop() -- キー入力 PadRefresh() -- 動作モードによって処理を振り分ける if (replay_mode == 0) then FreeMode() -- 通常モード elseif (replay_mode == 1) then RecordingMode() -- 記録モード elseif (replay_mode == 2) then ReplayingMode() -- 再生モード end -- 一時停止中ならば、その旨を表示 if (pausing == 1) then DrawFsTextLeft(font, 0, 20, 0, "PAUSING", 0, DRAW_TO_SCREEN) else -- アニメパターンを更新 -- 一時停止中はアニメを停止させる Motion, Pattern, Count, loop = CountAnimationPattern(Motion, Pattern, Count, -1, 1, 1) end -- 現在位置を表示 DrawFsTextLeft(font, 200, 0, 0, x .. "," .. y, 0, DRAW_TO_SCREEN) -- キャラを表示 DrawAnimation(Motion, Pattern, x, y, 0, DRAW_TO_WORLD) return end --[[ 通常モードの処理 好き勝手にキャラを移動かのう selectを押すとリプレイ記録を開始 ]] function FreeMode() -- 通常モードであることを表示 DrawFsTextLeft(font, 0, 0, 0, "NONE", 0, DRAW_TO_SCREEN)1 -- Cenvertedと付いているのは、キー情報を変換した値を受け取る関数 -- キーコンフィグで設定を変更したときはこちらで情報を呼び出さないと痛い目を見る -- キーコンフィグ情報を無視して、実際に押されたキー情報を得たいときはConvertedなしを使う -- このサンプルではコンフィグ機能つけていないのでConvertedなしでも構わない Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then -- 停止中の処理 if (Input[BUTTON_NUMBER_START] == 0) then pausing = 0; end PadUpdate(1); else -- 非停止中の処理 -- 一時停止 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then -- startが押されたので一時停止させる pausing = 1 PadUpdate(1) else if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then -- selectが押されたので記録を開始する -- 入力情報をリセット -- リプレイ記録もリセットされる -- PadResetAll() -- PadResetAll() -- 記録開始時は入力情報をリセットしておく replay_mode = 1 PadUpdate(0) -- 移動開始位置を保存しておく -- リプレイ再生時はこの座標から移動を再開するのでその準備 start_pos_x, start_pos_x = x, y else -- プレイヤー移動処理 PlayerMove() end end end return end --[[ 記録モードの処理 selectを押すと記録を終了して再生モードへ移る 再生モード開始時は一時停止状態にしておく ]] function RecordingMode() -- 記録モードであることを表示 DrawFsTextLeft(font, 0, 0, 0, "RECORDING", 0, DRAW_TO_SCREEN) -- 一時停止中の入力情報はリプレイデータとして記録するとまずい -- よって、記録されないようにTmp情報を読み込んでいる Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then -- 一時停止中 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then -- startが押されたので一時停止を解除 pausing = 0; end PadUpdate(1) else -- 非一時停止中 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then -- startが押されたので一時停止させる pausing = 1; PadUpdate(1); else if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then -- selectが押されたので記録を終了させる -- モード切替時は入力情報をリセットしておく ResetReplayCounter(); replay_mode = 2 -- 即座に再生ではなく一時中止にする pausing = 1 -- 再生開始時は記録開始時の座標へキャラを移動させておく x, y = start_pos_x, start_pos_y PadUpdate(1); else -- 現フレームの入力情報をリプレイデータへ記録させる -- ApplyInputData() -- ApplyInputData() -- プレイヤー移動 PlayerMove() end end end return end --[[ リプレイ再生モード selectを押すと再生途中であっても通常モードへ移行させる ]] function ReplayingMode() -- 再生モードであることを表示する DrawFsTextLeft(font, 0, 0, 0, "REPLAYING", 0, DRAW_TO_SCREEN) -- 一時停止中は非tmp系の更新を止めているので -- tmp系の情報を読み込む Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then -- 一時停止中 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then -- startが押されたので一時停止を解除 pausing = 0 end PadUpdate(1) else -- 非一時停止中 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then -- startが押されたので一時停止させる pausing = 1; PadUpdate(1); else if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then -- selectが押されたので通常モードへ切り替える -- 入力情報をリセット ResetReplayCounter() replay_mode = 0 PadUpdate(1) else -- リプレイ情報を取得する -- GetNextReplayData() -- 戻り値 -- 1:まだデータが残っている -- 0:すべてのデータを読みきった -- -- Get***PadStatusなどの代わりになる -- 情報を最後まで読み取ったら戻り値が0になるので -- 0が返ってきたらリプレイ終了とみなせる if (GetNextReplayData() == 0) then replay_mode = 0 end PlayerMove() end end end return end --[[ プレイヤー移動処理 ]] function PlayerMove() -- パッド情報を更新 PadUpdate(0); -- 非tmp系を読み込む Input = {GetConvertedPadStatus()} -- キー操作 move_length = 5 -- 移動速度 -- 上下左右の入力に応じて移動処理を行うだけ if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then y = y - move_length if (y < 0) then y = 0; end end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then y = y + move_length if (y > limit_y - size_y) then y = limit_y - size_y; end end if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then x = x + move_length if (x > limit_x - size_x) then x = limit_x - size_x; end end if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then x = x - move_length if (x < 0) then x = 0; end end return end