--[[ リプレイファイル保存&読み出しサンプル 記録されたリプレイデータは記録処理を行わなければ消去されます 最新10個まで保存できますが 古いものからどんどんと削除されるので 残しておきたいリプレイデータをファイルに保存する必要があります ファイルからデータを読み込みを行う処理も可能です 操作方法(パッド必須) PSコントローラーとしてボタンを解説 十字キーでキャラを動かして Startボタンで一時停止 Selectボタンを押すとモードが切り替わる モードは以下の3つ 「通常モード」「記録モード」「再生モード」 「通常モード」 適当に操作するだけ Selectを押すと記録モードへ移行する Startを押すとリプレイ管理モードへ移行する 「記録モード」 キャラの動きを記録する Selectを押すと再生モードへ移行する 「再生モード」 記録モードで記録した動きを再現する 最初は一時停止状態で始まるのでStartを押すと再生開始 「リプレイ管理モード」 一時データをファイルへ保存したり再生したり リプレイファイルを読み出して再生するモードです ]] 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 -- シーン番号 SCENE_TITLE = 0 SCENE_GAME = 1 SCENE_SELECT_REPLAY_DATA = 2 SCENE_SELECT_REPLAY_FILE = 3 gScene = SCENE_TITLE -- 現在のシーン replay_mode = 0 -- 記録中か再生中かのフラグ pausing = 0 -- 一時停止中か否かのフラグ -- パタパタアニメを作成(モーション番号の取得) Motion = CreateAnimation("") -- パタパタアニメの情報を設定 Pattern = 1 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); PrintX, PrintY = 480 / 2, 272 / 2 -- キャラの表示位置 size_x, size_y = 32, 63 -- キャラのサイズ limit_x, limit_y = 480, 272 -- キャラの移動可能範囲 gTitleCursor = 0 -- メニューのカーソル位置 return end --[[ 毎フレームこの関数がシステムから呼び出される ]] function MainLoop() -- キー入力 PadRefresh() if (gScene == SCENE_TITLE) then SceneTitle() -- タイトル画面、というかメニュー画面 elseif (gScene == SCENE_GAME) then if (replay_mode == 0) then -- 今回ここには来ないはず elseif (replay_mode == 1) then -- 記録モード RecordingMode() elseif (replay_mode == 2) then -- 再生モード ReplayingMode() end elseif (gScene == SCENE_SELECT_REPLAY_DATA) then SceneSelectReplayData() -- リプレイデータの操作 elseif (gScene == SCENE_SELECT_REPLAY_FILE) then SceneSelectReplayFile() -- リプレイファイルの操作 end -- 一時停止中はその旨を表示 if (pausing == 1) then DrawFsTextLeft(font, 0, 20, 0, "PAUSING", 0, DRAW_TO_SCREEN) end -- キャラの現在位置を表示 -- きちんとリプレイが再生されていることを確認できるように表示している -- (記録と再生に失敗していたら座標がずれるはず) DrawFsTextLeft(font, 200, 0, 0, PrintX .. "," .. PrintY, 0, DRAW_TO_SCREEN) -- キャラの表示 DrawAnimation(Motion, Pattern, PrintX, PrintY, 0, DRAW_TO_WORLD) return end --[[ メニュー画面 ]] function SceneTitle() PadRefresh() -- キー入力を更新 Input = {GetTmpPadStatus()} -- 入力状態を取得 PadUpdate(1) -- Tmp系のみ更新 -- メニュー表示 x = 50 y = 160 suby= 25 DrawFsTextLeft(font, x, y+suby*0, 0, "PlayStart", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+suby*1, 0, "ReplayData", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+suby*2, 0, "ReplayFile", 0, DRAW_TO_SCREEN) -- セレクタ操作 gTitleCursor = CursorUpDown(0, 2, gTitleCursor, true) -- 0から2までの範囲でカーソルを動かす -- セレクタ表示 x = 10 DrawFsTextLeft(font, x, y+suby * gTitleCursor, 0, ">>", 0, DRAW_TO_SCREEN) -- 決定ボタンを押したときの処理 if (CheckPushOkButton()) then -- プレイ開始(記録開始) if (gTitleCursor == 0) then gScene = SCENE_GAME pausing = 0 gTitleCursor = 0 PadResetAll() replay_mode = 1 PrintX, PrintY = 480 / 2, 272 / 2 return end -- リプレイデータ操作を開始 if (gTitleCursor == 1) then LoadReplayFiles() -- 表示する準備としてリプレイファイルを読み込んでおく gScene = SCENE_SELECT_REPLAY_DATA -- 以下はカーソル位置の初期化 gTitleCursor = 1 gTitleSubCursor = 1 SelectReplayDataMode = 0 SelectReplayFileMode = 0 SelectReplayDataCursor = 1 SelectReplayDataSubCursor = 1 return true end -- リプレイファイル捜査を開始 if (gTitleCursor == 2) then LoadReplayFiles() -- 表示する準備としてリプレイファイルを読み込んでおく gScene = SCENE_SELECT_REPLAY_FILE -- 以下はカーソル位置の初期化 gTitleCursor = 1 gTitleSubCursor = 1 SelectReplayFileMode = 0 SelectReplayFileCursor = 1 SelectReplayFileSubCursor = 1 return true end end return false end --[[ リプレイファイル一覧を作る ]] function LoadReplayFiles() -- 初期化 files = {} replayFilesData = {} for i=1, 10, 1 do replayFilesData[i] = {} replayFilesData[i]["name"] = "no data" -- ファイルデータ(表示に使う文字列) replayFilesData[i]["time"] = 0 replayFilesData[i]["filename"] = "" end -- ファイル一覧を取得 -- フォルダ内のファイル一覧が返される files = {ListupFiles("replay/")} -- ファイルが無いならばすることが無いので終了 if (#files == nil) then return end -- ファイルからリプレイ情報を引き出す for i=1, #files, 1 do -- ファイル名をパス、ファイル名、拡張子に分解 fullpath, filename, extension = SplitFilePath(files[i]) -- ファイル名から番号を調べる -- save10.txtなど名前をつけて保存しているから -- save**の**部分を調べる -- まずはファイル名をsaveと数字部分に分解 tmp, tmp2, name, no = string.find(filename, "(%D*)(%d*)") -- 数字部分がちゃんとあるときだけ処理をする if (no ~= "" and no ~= nil) then no = no * 1 -- こうしないと文字列として処理されるので、計算処理を行って数値に変換 -- 上記以外にstring.format("%d", no) * 1 -- などのようにして文字列を数字に変換しないと駄目らしい -- リプレイファイルからデータを読み込む -- ファイル名につけられた数字が保存先の番号 if (1<=no and no <=#replayFilesData) then if (files[i] == "") then replayFilesData[no]["name"] = "no data" replayFilesData[no]["time"] = 0 else -- リプレイファイルからデータを読み出す -- 文字列とデータ数が返ってくる replayFilesData[no]["name"], replayFilesData[no]["time"] = GetReplayFileData(files[i]) end replayFilesData[no]["filename"] = files[i] end end end return end --[[ タイトルメニューからの派生 リプレイデータを選んで保存とか再生とか ]] function SceneSelectReplayData() PadRefresh() Input = {GetTmpPadStatus()} PadUpdate(1) DrawFsTextLeft(font, 0, 0, 0, "SelectReplayData", 0, DRAW_TO_SCREEN) local no, name = SelectReplayData(0) -- リプレイデータの操作を行う if (no == -1) then -- キャンセル gScene = SCENE_TITLE return true elseif (no == -2) then -- 保存完了 gScene = SCENE_TITLE return true elseif (no == 0) then -- 未選択 return false else -- 再生開始 PadResetAll() LoadTmpData(no - 1) PrintX, PrintY = 480 / 2, 272 / 2 gScene = SCENE_GAME replay_mode = 2 gRecord = true return true end return false end --[[ リプレイデータを表示して選択する画面を表示 リプレイを保存する処理も含む 引数 mode 0:再生と保存が出来るモード 1:保存だけが出来るモード 戻り値1 管理番号 0 未選択 -1 キャンセル -2 保存完了 0< 選択された番号(再生対象) 戻り値2 リプレイファイルの登録文字列 ]] function SelectReplayData(mode) x = 50 y = 30 suby = 20 -- データ選択 if (SelectReplayDataMode == 0) then -- キャンセル -- if (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_PUSH) then if (CheckPushCancelButton()) then SelectReplayDataMode = 0 return -1, "" end -- データリスト表示 for i=1, 10, 1 do name = GetReplayName(i); DrawFsTextLeft(font, x, y + suby*(i-1), 0, name, 0, DRAW_TO_SCREEN) end -- カーソル移動 SelectReplayDataCursor = CursorUpDown(1, 10, SelectReplayDataCursor, true) x = 10 DrawFsTextLeft(font, x, y + suby*(SelectReplayDataCursor-1), 0, ">>", 0, DRAW_TO_SCREEN) -- データを選択したらサブメニューを開く -- if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_PUSH) then if (CheckPushOkButton()) then if (CheckTmpDataUsed(SelectReplayDataCursor) == 1) then SelectReplayDataSubCursor = 0 SelectReplayDataMode = 1 return 0, "" end end elseif (SelectReplayDataMode == 1) then -- データの扱い方選択 for i=1, 10, 1 do name = GetReplayName(i); DrawFsTextLeft(font, x, y + suby*(i-1), 0, name, 0, DRAW_TO_SCREEN) end if (mode == 0) then -- 保存と再生が可能 -- カーソル移動 SelectReplayDataSubCursor = CursorUpDown(0, 2, SelectReplayDataSubCursor, true) x = 350 DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor-1), 0, "Play", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor), 0, "Save", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor+1), 0, "Cancel", 0, DRAW_TO_SCREEN) x = 300 DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor-1)+suby*SelectReplayDataSubCursor, 0, ">>", 0, DRAW_TO_SCREEN) else -- 保存のみ可能 -- カーソル移動 SelectReplayDataSubCursor = CursorUpDown(0, 1, SelectReplayDataSubCursor, true) x = 350 DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor), 0, "Save", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor+1), 0, "Cancel", 0, DRAW_TO_SCREEN) x = 300 DrawFsTextLeft(font, x, y + suby * (SelectReplayDataCursor)+suby*SelectReplayDataSubCursor, 0, ">>", 0, DRAW_TO_SCREEN) end -- if (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_PUSH) then if (CheckPushCancelButton()) then -- キャンセル SelectReplayDataMode = 0 SelectReplayDataSubCursor = 1 return 0, "" end -- if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_PUSH) then if (CheckPushOkButton()) then if (mode == 0) then -- 再生と保存が可能 if (SelectReplayDataSubCursor == 0) then -- 再生 return SelectReplayDataCursor, GetReplayName(SelectReplayDataCursor) elseif (SelectReplayDataSubCursor == 1) then -- 保存するのでファイル選択画面へ SelectReplayDataMode = 2 SelectedItemNo = SelectReplayDataCursor SelectReplayFileCursor = 1 SelectReplayFileSubCursor = 1 else -- キャンセル SelectReplayDataMode = 0 SelectReplayDataSubCursor = 1 return 0, "" end else -- 保存のみ可能 if (SelectReplayDataSubCursor == 0) then -- 保存するのでファイル選択画面へ SelectReplayDataMode = 2 SelectedItemNo = SelectReplayDataCursor SelectReplayFileCursor = 1 SelectReplayFileSubCursor = 1 else -- キャンセル SelectReplayDataMode = 0 SelectReplayDataSubCursor = 1 return 0, "" end end end elseif (SelectReplayDataMode == 2) then -- 保存先ファイル選択 tmp, name = SelectReplayFile(1) if (tmp > 0) then SaveReplayData(SelectedItemNo, "save" .. tmp .. ".txt"); SelectReplayDataMode = 0 return -2, "" elseif (tmp < 0) then -- キャンセル SelectReplayDataMode = 1 if (mode == 0) then SelectReplayDataSubCursor = 1 else SelectReplayDataSubCursor = 1 end return 0, "" end end return 0, "" end --[[ タイトルメニューからの派生 リプレイファイルを選んで再生 ]] function SceneSelectReplayFile() PadRefresh() Input = {GetConvertedTmpPadStatus()} PadUpdate(1) DrawFsTextLeft(font, 0, 0, 0, "SelectReplayFile", 0, DRAW_TO_SCREEN) -- リプレイファイルの選択 local tmp, file, name = SelectReplayFile(2) -- キャンセル if (tmp < 0) then gScene = SCENE_TITLE return true end -- ファイルが選択されたらそれを読み込んで再生 if (file ~= "") then PadResetAll(); replay_mode = 2 LoadReplayData(file); gScene = SCENE_GAME PrintX, PrintY = 480 / 2, 272 / 2 gRecord = true return true; end return false end --[[ リプレイファイルを表示して選択する画面を表示 引数 mode 0:ファイル選択のみ 1:ファイル選択後、選択確定のサブメニューを表示「新規・上書き」 2:ファイル選択後、選択確定のサブメニューを表示「再生」 戻り値1 管理番号 0未選択 -1キャンセル 0< 選択された番号 戻り値2 "" :未選択 not "" :選択されたリプレイファイル名 戻り値3 リプレイ登録文字列 ]] function SelectReplayFile(mode) -- ファイルリスト表示 x = 50 y = 30 suby = 20 -- ファイルリスト表示 for i=1, #replayFilesData, 1 do if (replayFilesData[i]["filename"] == "") then DrawFsTextLeft(font, x, y+suby*(i-1), 0, "no data", 0, DRAW_TO_SCREEN) else DrawFsTextLeft(font, x, y+suby*(i-1), 0, replayFilesData[i]["name"], 0, DRAW_TO_SCREEN) end end -- カーソルとサブメニュー表示 if (SelectReplayFileMode == 0) then -- ファイル選択時 SelectReplayFileCursor = CursorUpDown(1, #replayFilesData, SelectReplayFileCursor, true) x = 10 DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1), 0, ">>", 0, DRAW_TO_SCREEN) else -- サブメニュー選択時 x = 300 DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1)+suby*(SelectReplayFileSubCursor-1), 0, ">>", 0, DRAW_TO_SCREEN) SelectReplayFileSubCursor = CursorUpDown(1, 2, SelectReplayFileSubCursor, true) x = 350 if (mode == 1) then DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1), 0, "save", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1)+suby, 0, "cancel", 0, DRAW_TO_SCREEN) else DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1), 0, "play", 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+suby*(SelectReplayFileCursor-1)+suby, 0, "cancel", 0, DRAW_TO_SCREEN) end end -- 入力処理 if (mode == 0) then -- if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_PUSH) then if (CheckPushOkButton()) then return SelectReplayFileCursor, replayFilesData[SelectReplayFileCursor]["filename"], replayFilesData[SelectReplayFileCursor]["name"] -- elseif (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_PUSH) then elseif (CheckPushCancelButton()) then return -1, "", "" else return 0, "", "" end else -- キャンセル if (CheckPushCancelButton()) then if (SelectReplayFileMode == 1) then SelectReplayFileMode = 0 -- gTitleSubCursor = 1 return 0, "", "" else SelectReplayFileMode = 0 -- gTitleSubCursor = 1 return -1, "", "" end end if (CheckPushOkButton()) then if (mode == 1 or (mode == 2 and replayFilesData[SelectReplayFileCursor]["filename"] ~= "")) then if (SelectReplayFileMode == 0) then SelectReplayFileMode = 1 SelectReplayFileSubCursor = 1 else if (SelectReplayFileSubCursor == 1) then return SelectReplayFileCursor, replayFilesData[SelectReplayFileCursor]["filename"], replayFilesData[SelectReplayFileCursor]["name"] else SelectReplayFileMode = 0 -- gTitleSubCursor = 1 end end end end end return 0, "" end --[[ 決定ボタンを押したか調べる □○スタートが該当する ]] function CheckPushOkButton() if (Input[BUTTON_NUMBER_CIRCLE] == BUTTON_STATUS_PUSH) then return true end if (Input[BUTTON_NUMBER_SQUARE] == BUTTON_STATUS_PUSH) then return true end if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then return true end return false end --[[ キャンセルボタンを押したか調べる ×□ボタンが該当する ]] function CheckPushCancelButton() if (Input[BUTTON_NUMBER_CROSS] == BUTTON_STATUS_PUSH) then return true end if (Input[BUTTON_NUMBER_TRIANGLE] == BUTTON_STATUS_PUSH) then return true end return false end function FreeMode() DrawFsTextLeft(font, 0, 0, 0, "NONE", 0, DRAW_TO_SCREEN) Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 0; end PadUpdate(1); else -- 一時停止 if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 1; PadUpdate(1); else -- 記録開始 if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then PadResetAll(); replay_mode = 1 start_pos_x = x; start_pos_y = y PadUpdate(0); else PlayerMove() end end end return end function RecordingMode() DrawFsTextLeft(font, 0, 0, 0, "RECORDING", 0, DRAW_TO_SCREEN) Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 0; end PadUpdate(1); else if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 1; PadUpdate(1); else -- 記録終了 if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then -- リプレイデータのカウント(総入力時間のフレーム数)を取得 -- -- 引数 -- no -- 取得するリプレイデータのID -- -1 読み書き対象の一時データ -- 0 =< 記録された過去のデータ -- -- 戻り値 -- カウント数 -- count = GetReplayTotalTime(-1) ResetReplayCounter(); -- リプレイの名前欄データを設定する -- 名前欄と言ってるが自由使用可能領域のこと -- -- 引数 -- no -- 取得するリプレイデータのID -- -1 読み書き対象の一時データ -- 0 =< 記録された過去のデータ -- name -- 設定するデータ -- 半角で64文字あたりまでok -- SetReplayName(0, "test " .. count ); -- 最新のリプレイデータをリプレイデータへ追加する -- リプレイデータは10個まで保存される PushReplayData() -- 即座に再生ではなく一時中止にする replay_mode = 2 gScene = SCENE_GAME PrintX, PrintY = 480 / 2, 272 / 2 pausing = 1; x = start_pos_x y = start_pos_y; PadUpdate(1); else ApplyInputData(); PlayerMove() end end end return end function ReplayingMode() DrawFsTextLeft(font, 0, 0, 0, "REPLAYING", 0, DRAW_TO_SCREEN) Input = {GetConvertedTmpPadStatus()} if (pausing == 1) then if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 0; end PadUpdate(1); else if (Input[BUTTON_NUMBER_START] == BUTTON_STATUS_PUSH) then pausing = 1; PadUpdate(1); else if (Input[BUTTON_NUMBER_SELECT] == BUTTON_STATUS_PUSH) then ResetReplayCounter(); gScene = SCENE_TITLE pausing = 0 PadUpdate(1); else if (GetNextReplayData()==0) then gScene = SCENE_TITLE pausing = 0 end PlayerMove() end end Motion, Pattern, Count, loop = CountAnimationPattern(Motion, Pattern, Count, -1, 1, 1) end return end function PlayerMove() PadUpdate(0); Input = {GetConvertedPadStatus()} -- キー操作 move_length = 5; if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_HOLD) then PrintY = PrintY - move_length if (PrintY < 0) then PrintY = 0; end end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_HOLD) then PrintY = PrintY + move_length if (PrintY > limit_y - size_y) then PrintY = limit_y - size_y; end end if (Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_RIGHT] == BUTTON_STATUS_HOLD) then PrintX = PrintX + move_length if (PrintX > limit_x - size_x) then PrintX = limit_x - size_x; end end if (Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_PUSH or Input[BUTTON_NUMBER_LEFT] == BUTTON_STATUS_HOLD) then PrintX = PrintX - move_length if (PrintX < 0) then PrintX = 0; end end return end --[[ カーソル上下処理 上を押すと値が1小さくなり、下を押すと値が1大きくなる 引数 min 最小値、これより小さくならない max 最大値、これより大きくならない value 現在の値 loop trueのとき 最小値時に上を押したら最大値になり 最大値時に下を押したら最小値になる falseのとき 最小値〜最大値の範囲を厳守 戻り値 入力判定後の新しい値 ]] function CursorUpDown(min, max, value, loop) -- 最小値と最大値の関係をチェック if (max < min) then return value -- max = min end if (Input[BUTTON_NUMBER_UP] == BUTTON_STATUS_PUSH) then value = value - 1 if (value < min) then if (loop) then value = max else value = min end end end if (Input[BUTTON_NUMBER_DOWN] == BUTTON_STATUS_PUSH) then value = value + 1 if (value > max) then if (loop) then value = min else value = max end end end return value end