• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqt誰得windowscocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision322 (tree)
Zeit2022-07-30 00:48:45
Autorxops-mikan

Log Message

コンソール画面における文字入力処理をクラス化

Ändern Zusammenfassung

Diff

--- trunk/gamemain.cpp (revision 321)
+++ trunk/gamemain.cpp (revision 322)
@@ -1769,7 +1769,6 @@
17691769 #ifdef ENABLE_DEBUGCONSOLE
17701770 Show_Console = false;
17711771 InfoConsoleData = NULL;
1772- InputConsoleData = NULL;
17731772 NewCommand[0] = '\0';
17741773 ScreenShot = 0;
17751774 #endif
@@ -1912,15 +1911,13 @@
19121911
19131912 //コンソール用初期化
19141913 InfoConsoleData = new ConsoleData [MAX_CONSOLELINES];
1915- InputConsoleData = new ConsoleData;
19161914 for(int i=0; i<MAX_CONSOLELINES; i++){
19171915 InfoConsoleData[i].color = d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f);
19181916 InfoConsoleData[i].textdata[0] = '\0';
19191917 }
1920- InputConsoleData->color = d3dg->GetColorCode(1.0f,1.0f,0.0f,1.0f);
1921- InputConsoleData->textdata[0] = '\0';
19221918 AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), "Game Debug Console.");
19231919 AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), " Command list >help");
1920+ ConsoleTextBoxControl.InitTextBox("", MAX_CONSOLELEN - (int)strlen(CONSOLE_PROMPT), 0x01|0x04|0x20);
19241921 #endif
19251922
19261923 //マウスカーソルを中央へ移動
@@ -2113,7 +2110,7 @@
21132110 if( Show_Console == false ){
21142111 Show_Console = true;
21152112
2116- strcpy(InputConsoleData->textdata, CONSOLE_PROMPT);
2113+ ConsoleTextBoxControl.SetTextBoxStr("");
21172114 }
21182115 else{
21192116 Show_Console = false;
@@ -3509,27 +3506,6 @@
35093506 strcpy(InfoConsoleData[MAX_CONSOLELINES-1].textdata, str);
35103507 }
35113508
3512-//! @brief 入力用コンソールに文字を一文字追加
3513-//! @param inchar 追加する文字
3514-void maingame::ConsoleInputText(char inchar)
3515-{
3516- for(int i=0; i<MAX_CONSOLELEN; i++){
3517- if( InputConsoleData->textdata[i] == '\0' ){
3518- InputConsoleData->textdata[i] = inchar;
3519- InputConsoleData->textdata[i+1] = '\0';
3520- return;
3521- }
3522- }
3523-}
3524-
3525-//! @brief 入力用コンソールの文字を一文字削除
3526-void maingame::ConsoleDeleteText()
3527-{
3528- int s = (int)strlen(InputConsoleData->textdata);
3529- if( s == (int)strlen(CONSOLE_PROMPT) ){ return; }
3530- InputConsoleData->textdata[ s-1 ] = '\0';
3531-}
3532-
35333509 //! @brief コマンドの判定および引数(整数値)を取得
35343510 //! @param cmd 判定するコマンド文字のポインタ
35353511 //! @param num 与えられた引数を受け取るポインタ
@@ -3559,49 +3535,20 @@
35593535 //! @brief デバック用コンソールの入力処理
35603536 void maingame::InputConsole()
35613537 {
3538+ char str[MAX_CONSOLELEN];
35623539 NewCommand[0] = '\0';
35633540
3564- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x0F)) ){ // [ENTER]
3565- //何か入力されていれば〜
3566- if( strcmp(InputConsoleData->textdata, CONSOLE_PROMPT) != 0 ){
3567- //コンソールに追加し、未処理コマンドとして登録
3568- AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), InputConsoleData->textdata);
3569- strcpy(NewCommand, &(InputConsoleData->textdata[strlen(CONSOLE_PROMPT)]));
3570- }
3541+ if( ConsoleTextBoxControl.ProcessTextBox(inputCtrl) == true ){
3542+ //[ENTER]
3543+ //コンソールに追加し、未処理コマンドとして登録
3544+ strcpy(str, CONSOLE_PROMPT);
3545+ strcat(str, ConsoleTextBoxControl.GetTextBoxStr());
3546+ AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str);
35713547
3572- //入力エリアを初期化
3573- strcpy(InputConsoleData->textdata, CONSOLE_PROMPT);
3548+ strcpy(NewCommand, ConsoleTextBoxControl.GetTextBoxStr());
3549+
3550+ ConsoleTextBoxControl.SetTextBoxStr("");
35743551 }
3575- else{
3576- //数字
3577- for(char key=0x16; key<=0x1F; key++){
3578- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
3579- ConsoleInputText(key + 0x1A);
3580- }
3581- }
3582- for(char key=0x04; key<=0x0D; key++){
3583- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
3584- ConsoleInputText(key + 0x2C);
3585- }
3586- }
3587-
3588- //アルファベット小文字
3589- for(char key=0x20; key<=0x39; key++){
3590- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
3591- ConsoleInputText(key + 0x41);
3592- }
3593- }
3594-
3595- //スペース
3596- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x11)) ){ // [SPACE]
3597- ConsoleInputText(' ');
3598- }
3599-
3600- //一文字削除
3601- if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x0E)) ){ // [BACK]
3602- ConsoleDeleteText();
3603- }
3604- }
36053552 }
36063553
36073554 //! @brief デバック用コンソールのメイン処理
@@ -4651,11 +4598,14 @@
46514598
46524599 //入力中の文字
46534600 int cnt;
4601+ char str[MAX_CONSOLELEN];
46544602 for(cnt=0; cnt<MAX_CONSOLELINES; cnt++){
46554603 if( InfoConsoleData[cnt].textdata[0] == NULL ){ break; }
46564604 }
4657- d3dg->Draw2DTextureDebugFontText(5+1, cnt*17+5+1, InputConsoleData->textdata, d3dg->GetColorCode(0.0f,0.0f,0.0f,1.0f));
4658- d3dg->Draw2DTextureDebugFontText(5, cnt*17+5, InputConsoleData->textdata, InputConsoleData->color);
4605+ strcpy(str, CONSOLE_PROMPT);
4606+ strcat(str, ConsoleTextBoxControl.GetTextBoxStr());
4607+ d3dg->Draw2DTextureDebugFontText(5+1, cnt*17+5+1, str, d3dg->GetColorCode(0.0f,0.0f,0.0f,1.0f));
4608+ d3dg->Draw2DTextureDebugFontText(5, cnt*17+5, str, d3dg->GetColorCode(1.0f,1.0f,0.0f,1.0f));
46594609 }
46604610
46614611 #endif
@@ -4679,7 +4629,7 @@
46794629 #ifdef ENABLE_DEBUGCONSOLE
46804630 //コンソール用データを解放
46814631 if( InfoConsoleData != NULL ){ delete [] InfoConsoleData; }
4682- if( InputConsoleData != NULL ){ delete InputConsoleData; }
4632+ ConsoleTextBoxControl.DestroyTextBox();
46834633 #endif
46844634
46854635 GameState->NextState();
--- trunk/gamemain.h (revision 321)
+++ trunk/gamemain.h (revision 322)
@@ -279,12 +279,10 @@
279279 #ifdef ENABLE_DEBUGCONSOLE
280280 bool Show_Console; //!< デバック用コンソールを表示
281281 ConsoleData *InfoConsoleData; //!< デバック用コンソールデータ(表示済み)
282- ConsoleData *InputConsoleData; //!< デバック用コンソールデータ(入力中)
282+ TextBoxObject ConsoleTextBoxControl; //!< デバック用コンソールデータ(入力中)
283283 char NewCommand[MAX_CONSOLELEN]; //!< 新たに入力された未処理のコマンド
284284 int ScreenShot; //!< SSを撮影する
285285 void AddInfoConsole(int color, const char *str);
286- void ConsoleInputText(char inchar);
287- void ConsoleDeleteText();
288286 bool GetCommandNum(const char *cmd, int *num);
289287 void InputConsole();
290288 void ProcessConsole();
--- trunk/gui-object.cpp (revision 321)
+++ trunk/gui-object.cpp (revision 322)
@@ -232,3 +232,165 @@
232232 d3dg->Draw2DBox(pos_x+3, pos_y+knob_y+3, pos_x+width-3, pos_y+knob_y + (int)knob_height -3, color2);
233233 }
234234 }
235+
236+//! @brief コンストラクタ
237+TextBoxObject::TextBoxObject()
238+{
239+ mode = 0;
240+ inputstr[0] = '\0';
241+ maxlen = MAX_INPUTBOXLEN;
242+}
243+
244+//! @brief ディストラクタ
245+TextBoxObject::~TextBoxObject()
246+{}
247+
248+//! @brief 入力ボックス初期化
249+//! @param str デフォルト文字列
250+//! @param in_maxlen 最大文字数(1〜127)
251+//! @param in_mode 入力モード
252+//! @note 入力モードは、以下の値を組み合わせて指定します。
253+//! @note 0x01:数字、0x02:数字/-/.、0x04:アルファベット小文字、0x08:アルファベット大文字、0x20:スペース
254+void TextBoxObject::InitTextBox(const char *str, int in_maxlen, int in_mode)
255+{
256+ if( in_maxlen < 1 ){ in_maxlen = 1; }
257+ if( in_maxlen > MAX_INPUTBOXLEN ){ in_maxlen = MAX_INPUTBOXLEN; }
258+
259+ mode = in_mode;
260+ SetTextBoxStr(str);
261+ maxlen = in_maxlen;
262+}
263+
264+//! @brief 入力ボックス解放
265+void TextBoxObject::DestroyTextBox()
266+{}
267+
268+//! @brief 入力ボックス文字列を設定
269+//! @param str 文字列
270+void TextBoxObject::SetTextBoxStr(const char *str)
271+{
272+ if( str == NULL ){ str = ""; }
273+ if( (int)strlen((char*)str) > maxlen ){ return; }
274+
275+ strcpy(inputstr, (char*)str);
276+}
277+
278+//! @brief 入力ボックス文字列を取得
279+//! @return 文字列のポインタ
280+const char* TextBoxObject::GetTextBoxStr()
281+{
282+ return inputstr;
283+}
284+
285+//! @brief 文字を一文字追加
286+//! @param inchar 追加する文字
287+void TextBoxObject::InputChar(char inchar)
288+{
289+ for(int i=0; i<maxlen; i++){
290+ if( inputstr[i] == '\0' ){
291+ inputstr[i] = inchar;
292+ inputstr[i+1] = '\0';
293+ return;
294+ }
295+ }
296+}
297+
298+//! @brief 文字を一文字削除
299+void TextBoxObject::DeleteChar()
300+{
301+ int s = (int)strlen(inputstr);
302+ if( s == 0 ){ return; }
303+ inputstr[ s-1 ] = '\0';
304+}
305+
306+//! @brief 入力ボックス文字列処理
307+//! @param inputCtrl InputControlクラスのポインタ
308+//! @return 入力済み状態でENTERキー:true それ以外(エラー含む):false
309+//! @attention 事前にInputControlクラスを適切に処理しておく必要があります。 ※GetInputState()関数など。
310+bool TextBoxObject::ProcessTextBox(InputControl *inputCtrl)
311+{
312+ if( inputCtrl == NULL ){ return false; }
313+
314+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x0F)) ){ // [ENTER]
315+ //何か入力されていれば〜
316+ if( inputstr[0] != '\0' ){
317+ return true;
318+ }
319+ }
320+ else{
321+ //一文字削除
322+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x0E)) ){ // [BACK]
323+ DeleteChar();
324+ }
325+
326+ if( (mode & 0x01)||(mode & 0x02) ){
327+ //数字
328+ for(char key=0x16; key<=0x1F; key++){
329+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
330+ InputChar(key + 0x1A);
331+ }
332+ }
333+ for(char key=0x04; key<=0x0D; key++){
334+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
335+ InputChar(key + 0x2C);
336+ }
337+ }
338+
339+ if( mode & 0x02 ){
340+ //if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x48)) ){ InputChar('+'); }
341+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x3D)) ){ InputChar('-'); }
342+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x49)) ){ InputChar('-'); }
343+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x44)) ){ InputChar('.'); }
344+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x4A)) ){ InputChar('.'); }
345+ }
346+ }
347+
348+ if( (mode & 0x04)&&(mode & 0x08) ){
349+ if( inputCtrl->CheckKeyNow(OriginalkeycodeToDinputdef(0x14)) ){ // [SHIFT]
350+ //アルファベット大文字
351+ for(char key=0x20; key<=0x39; key++){
352+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
353+ InputChar(key + 0x21);
354+ }
355+ }
356+ }
357+ else{
358+ //アルファベット小文字
359+ for(char key=0x20; key<=0x39; key++){
360+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
361+ InputChar(key + 0x41);
362+ }
363+ }
364+ }
365+ }
366+ else if( mode & 0x04 ){
367+ //アルファベット小文字
368+ for(char key=0x20; key<=0x39; key++){
369+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
370+ InputChar(key + 0x41);
371+ }
372+ }
373+ }
374+ else if( mode & 0x08 ){
375+ //アルファベット大文字
376+ for(char key=0x20; key<=0x39; key++){
377+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(key)) ){
378+ InputChar(key + 0x21);
379+ }
380+ }
381+ }
382+
383+ //if( mode & 0x10 ){
384+ // if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x43)) ){ InputChar(','); }
385+ //}
386+
387+ if( mode & 0x20 ){
388+ //スペース
389+ if( inputCtrl->CheckKeyDown(OriginalkeycodeToDinputdef(0x11)) ){ // [SPACE]
390+ InputChar(' ');
391+ }
392+ }
393+ }
394+
395+ return false;
396+}
--- trunk/gui-object.h (revision 321)
+++ trunk/gui-object.h (revision 322)
@@ -37,6 +37,8 @@
3737 #endif
3838 #include "main.h"
3939
40+#define MAX_INPUTBOXLEN 127 //!< 入力ボックス文字列初期化時の最大文字数
41+
4042 //! @brief スクロールバーの管理描画クラス
4143 //! @details スクロールバーの処理や描画を行います。
4244 //! @attention 縦/Y軸方向のスクロールしか想定していません。
@@ -75,4 +77,26 @@
7577 void Draw(class D3DGraphics *d3dg);
7678 };
7779
80+//! @brief 入力ボックスの文字管理クラス
81+//! @details 入力ボックスの文字入力を管理します。
82+//! @attention 描画機能は含まれていません。
83+class TextBoxObject
84+{
85+ int mode;
86+ char inputstr[MAX_INPUTBOXLEN+1]; //!< 入力ボックスの文字列
87+ int maxlen; //!< 入力ボックスの最大文字数
88+
89+ void InputChar(char inchar);
90+ void DeleteChar();
91+
92+public:
93+ TextBoxObject();
94+ ~TextBoxObject();
95+ void InitTextBox(const char *str, int in_maxlen, int in_mode);
96+ void DestroyTextBox();
97+ void SetTextBoxStr(const char *str);
98+ const char* GetTextBoxStr();
99+ bool ProcessTextBox(InputControl *inputCtrl);
100+};
101+
78102 #endif
\ No newline at end of file