--[[ キーコンフィグサンプル ]] 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を指定 0) -- アニメデータの使用数 alice = LoadGraphic("ladder.bmp") -- フォント設定 -- font = LoadFontSprite(name) -- 引数 -- name -- 使用するフォント名 -- 戻り値 -- font -- フォント番号 -- 読み込みに成功したら1以上の管理番号が返ってくる -- 失敗したら0が返ってくる 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 -- キーコンフィグ時に表示するボタンの名称 gKeyMapName = {} gKeyMapName[BUTTON_NUMBER_L1] = "L1" gKeyMapName[BUTTON_NUMBER_L2] = "L2" gKeyMapName[BUTTON_NUMBER_R1] = "R1" gKeyMapName[BUTTON_NUMBER_R2] = "R2" gKeyMapName[BUTTON_NUMBER_SELECT] = "Select" gKeyMapName[BUTTON_NUMBER_START] = "Start" gKeyMapName[BUTTON_NUMBER_TRIANGLE] = "Triangle" gKeyMapName[BUTTON_NUMBER_SQUARE] = "Square" gKeyMapName[BUTTON_NUMBER_CROSS] = "Cross" gKeyMapName[BUTTON_NUMBER_CIRCLE] = "Circle" gKeyMapName[BUTTON_NUMBER_UP] = "Up" gKeyMapName[BUTTON_NUMBER_DOWN] = "Down" gKeyMapName[BUTTON_NUMBER_RIGHT] = "Right" gKeyMapName[BUTTON_NUMBER_LEFT] = "Left" gTitleCursor = 0 return end --[[ 毎フレームこの関数がシステムから呼び出される ]] function MainLoop() SceneKeyConfig() return end --[[ キーコンフィグの基本的な処理 設定情報をファイルに吐き出して保存する処理は未実装です luaのファイル操作関数を使い、各自で実装できないことも無い ]] function SceneKeyConfig() -- なんとなく表示 DrawFsTextLeft(font, 0, 0, 0, "KeyConfig", 0, DRAW_TO_SCREEN) -- まずはキー情報を取得 PadRefresh() -- ここでは -- Input = {GetPadStatus()} ではなく -- Input = {GetTmpPadStatus()} このように記述します -- -- 入力情報は2系統用意されていて -- Tmpの有無によって使い分けることができます -- ここではTmp系、非Tmp系と呼ぶことにします -- -- 非Tmp系はリプレイデータとして入力内容が保存されます -- また、リプレイデータを読み込んで再生するときは -- この非Tmp系を使って操作情報を再現します -- -- Tmp系はリプレイデータとして保存されることは無く -- その場面における入力情報を得ます -- 読み込んだリプレイデータではなく実際に今押されているボタンということです -- Input = {GetTmpPadStatus()} -- PadUpdateへ0を与えるとTmp系、非Tmp系両方の情報が更新されますが -- 1を与えると非Tmp系のみ更新されます -- 何に使うのかというと -- -- たとえばリプレイを記録、再生中にゲームなどを一時中断したときに使用します -- 中断中のキー操作をリプレイデータとして記録すると変になってしまいます -- 再生中を一時中断中にリプレイデータを使ってしまうと、これも変になってしまいます -- -- このような問題を防ぐためにリプレイと無関係の非Tmp系のみを更新します -- PadUpdate(1) -- カーソル移動 gTitleCursor = CursorUpDown(0, 8, gTitleCursor, true) -- キーの割り当て状況を取得 map = {} map = {GetReverseKeyMap()} -- 機能に対してどのボタンが割り振られているかを取得 -- キーコンフィグ情報を表示 x = 50 y = 40 height = 20 -- mapで各機能へ対して割り振られているボタンを取得、そしてそれを文字へ変換 -- 機能とボタンが同一名称なのでややこしいね -- 実際のゲームでは左に表示する内容をボタン名ではなく -- shot bomb jumpなどとしてください DrawFsTextLeft(font, x, y+height*0, 0, "Circle " .. gKeyMapName[map[BUTTON_NUMBER_CIRCLE]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*1, 0, "Cross " .. gKeyMapName[map[BUTTON_NUMBER_CROSS]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*2, 0, "Triangle " .. gKeyMapName[map[BUTTON_NUMBER_TRIANGLE]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*3, 0, "Square " .. gKeyMapName[map[BUTTON_NUMBER_SQUARE]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*4, 0, "L1 " .. gKeyMapName[map[BUTTON_NUMBER_L1]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*5, 0, "R1 " .. gKeyMapName[map[BUTTON_NUMBER_R1]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*6, 0, "Select " .. gKeyMapName[map[BUTTON_NUMBER_SELECT]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*7, 0, "Start " .. gKeyMapName[map[BUTTON_NUMBER_START]], 0, DRAW_TO_SCREEN) DrawFsTextLeft(font, x, y+height*8, 0, "Exit ", 0, DRAW_TO_SCREEN) -- カーソルを表示 x = 20 DrawFsTextLeft(font, x, y+height*gTitleCursor, 0, ">>", 0, DRAW_TO_SCREEN) -- 変更対象の機能を設定。ここでは単にカーソルのある場所を変更対象としている if (gTitleCursor == 0) then ButtonName = BUTTON_NUMBER_CIRCLE elseif (gTitleCursor == 1) then ButtonName = BUTTON_NUMBER_CROSS elseif (gTitleCursor == 2) then ButtonName = BUTTON_NUMBER_TRIANGLE elseif (gTitleCursor == 3) then ButtonName = BUTTON_NUMBER_SQUARE elseif (gTitleCursor == 4) then ButtonName = BUTTON_NUMBER_L1 elseif (gTitleCursor == 5) then ButtonName = BUTTON_NUMBER_R1 elseif (gTitleCursor == 6) then ButtonName = BUTTON_NUMBER_SELECT elseif (gTitleCursor == 7) then ButtonName = BUTTON_NUMBER_START elseif (gTitleCursor == 8) then if (Input[BUTTON_NUMBER_CIRCLE] == 0) then -- キーコンフィグから抜ける処理 -- ここではキーコンフィグだけのサンプルなので何も処理していない return end return -- ここで処理を抜けないと以下の処理でキーの入れ替えが起こってしまう end -- 割り当てるボタンを決定 -- とりあえずは何も押していないとして変数を初期化 ButtonNo = BUTTON_NUMBER_NONE -- 何かボタンを押したならばそのボタンに変更 -- どのボタンが押されたのか調べて記録しておく if (Input[BUTTON_NUMBER_CIRCLE] == 0) then ButtonNo = BUTTON_NUMBER_CIRCLE elseif (Input[BUTTON_NUMBER_CROSS] == 0) then ButtonNo = BUTTON_NUMBER_CROSS elseif (Input[BUTTON_NUMBER_TRIANGLE] == 0) then ButtonNo = BUTTON_NUMBER_TRIANGLE elseif (Input[BUTTON_NUMBER_SQUARE] == 0) then ButtonNo = BUTTON_NUMBER_SQUARE elseif (Input[BUTTON_NUMBER_L1] == 0) then ButtonNo = BUTTON_NUMBER_L1 elseif (Input[BUTTON_NUMBER_R1] == 0) then ButtonNo = BUTTON_NUMBER_R1 elseif (Input[BUTTON_NUMBER_SELECT] == 0) then ButtonNo = BUTTON_NUMBER_SELECT elseif (Input[BUTTON_NUMBER_START] == 0) then ButtonNo = BUTTON_NUMBER_START end -- なにもボタンを押していないならば変更しない if (ButtonNo ~= BUTTON_NUMBER_NONE) then -- 実際に入れ替える処理 -- ButtonNameに対してButtonNoを割り振る -- もともとButtonNameに対して割り振られていたボタンは -- ButtonNoが変更前に割り振られていたボタンへと割り振られる -- 要するにボタンの割り振りを入れ替える SetKeyMap(ButtonName, ButtonNo) end return end --[[ カーソル上下処理 上を押すと値が1小さくなり、下を押すと値が1大きくなる 引数 min 最小値、これより小さくならない max 最大値、これより大きくならない value 現在の値 loop trueのとき 最小値時に上を押したら最大値になり 最大値時に下を押したら最小値になる falseのとき 最小値〜最大値の範囲を厳守 戻り値 入力判定後の新しい値 ]] function CursorUpDown(min, max, value, loop) -- 最小値と最大値の関係をチェック if (max < min) then return value 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