現在、DXライブラリで簡単なキーコンフィグのようなものを作っています(十字キーの操作をWASDに変える、というもの。以下「コントロールサイドの設定」)。
そこで実際に動作確認をしようとコントロールサイドの設定画面に行こうとすると、スタックオーバーフローが発生します。
内容を確認すると、ReturnKeyCode(int Getinput)で止まってしまうようです。
オーバーフローを起こしているローカル変数として表示されているのがGetinput(仮引数)です。
知識不足で解決法がわかりません。
どのようにオーバーフローを解決したらいいでしょうか?
この場合、グローバル変数を使って設定したほうがいいんですかね?
以下に必要と思われるコードを書いておきます。
Config.cpp
#include "DxLib.h"
// ↓ キーの入力状態を返す
#include "Keyboard.h"
#include "ReturnKeyCode.h"
// ここから実際にはヘッダファイル(Config.h)に書いています
typedef enum{
CMenu_CtrlSide, // コントロールサイドの設定
CMenu_Back, // 戻る
CMenu_Num, // 本項目の数
} CMenu ;// 「設定」での選択状態
typedef enum{
CLeftSide, // 左側(WASD)
CRightSide, // 右側(矢印)
} CSelectSide; // 「コントロールサイド」の選択状態
// ここまで
// 更新
static int NowSelect = CMenu_CtrlSide; // 「設定」での現在の選択状態(初期は「コントロールサイドの設定」選択中)
static int NowSelect_Side = CRightSide; // 「コントロールサイド設定」での現在の選択状態(初期は「右側(矢印)」選択中)
// 「設定」の更新
void Config_Update(){
if(Keyboard_Get(ReturnKeyCode(Down))==1){ // 上キーが押されていたら
NowSelect = (NowSelect+1)%CMenu_Num; // 選択状態を一つ下げる
}
if(Keyboard_Get(ReturnKeyCode(Up))==1){ // 下キーが押されていたら
NowSelect = (NowSelect+(CMenu_Num-1))%CMenu_Num; // 選択状態を一つ上げる
}
if(Keyboard_Get(ReturnKeyCode(Enter))==1){ // 決定キーが押されたら
switch(NowSelect){ // 現在選択中の状態によって処理を分岐
case CMenu_CtrlSide: // 「コントロールサイドの設定」選択中なら
CtrlSide_Update(); // シーンをコントロールサイドの設定画面に変更
break;
case CMenu_Back; //「戻る」選択中なら
Menu_Update(); // トップメニューに戻る
}
}
if(Keyboard_Get(ReturnKeyCode(Back))==1){ // 戻るキーが押されていたら
if(NowSelect == Back){ // 「戻る」選択中なら
Menu_Update; // シーンをメニューに変更
}else{ // それ以外なら
NowSelect = Back; // 選択状態を「戻る」にする
}
}
}
// 「コントロールサイドの設定」の更新
void CtrlSide_Update(){
if(Keyboard_Get(ReturnKeyCode(Left))==1){ // 左キーが押されていたら
NowSelect_Side = CLeftSide; // 左側(WASD)へ
}
if(Keyboard_Get(ReturnKeyCode(Right))==1){ // 右キーが押されていたら
NowSelect_Side = CRightSide; // 右側(矢印)へ
}
if(Keyboard_Get(ReturnKeyCode(Enter))==1){ // 決定キーが押されたら
switch(NowSelect_Side){ // 現在選択中の状態によって処理を分岐
case CLeftSide: // 左側(WASD)なら
ReturnKeyCode_Data(CLeftSide); // ReturnKeyCode→SaveCtrlSide に設定を保存
break;
case CRightSide: // 右側(矢印)なら
ReturnKeyCode_Data(CRightSide); // 上に同じ
}
Config_Update(); // 「設定」トップに戻る
}
}
#pragma once
void ReturnKeyCode_Data(int GetCtrlSide); // 「コントロールサイドの設定」で選んだコントロールサイドを保存する関数
int ReturnKeyCode(int Getinput); // どの方向への入力かを引数に、対応するキーコードを設定されたコントロールサイドに応じて返す関数
typedef enum{
Up, // 上へ動かす操作
Down, // 下へ動かす操作
Left, // 左へ動かす操作
Right, // 右へ動かす操作
Enter, // 決定する操作
Back // 戻る操作
} input ; // どの入力のときの操作か
typedef enum{
LeftSide, // 左側(WASD)
RightSide // 右側(矢印)
} CtrlSide ; // 保存されたコントロールサイド
#include "DxLib.h"
#include "ReturnKeyCode.h"
static CtrlSide SaveCtrlSide = RightSide; // コントロールサイドデータ格納用変数
// 「コントロールサイドの設定」で選んだコントロールサイドを保存する関数
void ReturnKeyCode_Data(int GetCtrlSide){
if(GetCtrlSide == LeftSide){
SaveCtrlSide = LeftSide; // 「左側(WASD)」で保存
}else{
SaveCtrlSide = RightSide; // 「右側(矢印)」で保存
}
}
// どの入力のときかを引数に、対応するキーコードを設定されたコントロールサイドに応じて返す関数
int ReturnKeyCode(int Getinput){
if(SaveCtrlSide = LeftSide){ // 左側(WASD)のとき
switch(Getinput){
case Up:
return KEY_INPUT_W;
break;
case Down:
return KEY_INPUT_S;
break;
case Left:
return KEY_INPUT_A;
break;
case Right:
return KEY_INPUT_D;
break;
case Enter:
return KEY_INPUT_LSHIFT;
break;
case Back:
return KEY_INPUT_LCONTROL;
}
}else{ // 右側(矢印)のとき
switch(Getinput){
case Up:
return KEY_INPUT_UP;
break;
case Down:
return KEY_INPUT_DOWN;
break;
case Left:
return KEY_INPUT_LEFT;
break;
case Right:
return KEY_INPUT_RIGHT;
break;
case Enter:
return KEY_INPUT_RSHIFT;
break;
case Back:
return KEY_INPUT_RCONTROL;
}
}
}