シンプルな入力用UIが無いのが痛いところ。


RGKT-NDS-STDY-007(003)



息抜きに数当てゲームでも作ろうかと思ったけど数値入力用の適当なUIがdevkitProにないんで
ざっくりと書いてみたです。
BASIC言語のINPUT ステートメントぽいのを意識してるんですが
どちらかというとシューティングゲームのスコアネーム入力な感じになりつつあったり。
本当はそれっぽいの作りたいが為に console.c 見てたりしてたんです(自白)。


テンキーっぽいのを表示させてタッチスクリーン使って入力させるというのは
如何にもDSらしく、味気ないので却下しました。(ォ


あえてキャラクターで桁毎に配列で数字を文字として持ってるのは
atoi() で済ませれるというのがあったり、
16進数として入力させたい場合やスコアネーム用としての利用を念頭に入れてたりしてるので。
そのせいか、あるいは書き方が悪いのか、
行数が無駄に多く、見辛い気がしますw


変数が static なのも関数化したとき毎フレーム回ってる中で実行させる都合上そうさせてます。
スタートエンドで終わるような場面だけなら使い捨てでいいんですが…。


カーソル位置表示とかは無いです。
それやるだけで処理が途端に面倒くさくなりそうに思えたのでorz
なのでカーソル位置を見失わない応急処置として
左にカーソルを戻す=バックスペースという風に対処しました。
なけなしの工夫でごめんちゃい。(´・ω・`)


INPUT ステートメントもどき(書きかけ)

#include <nds.h>
#include <stdio.h>
#include <stdlib.h>

#define INPUT_MAX 4

int main(void)
{
	
	static char input_array[INPUT_MAX] = {'\0'};
	static u32 i = 0, num = 0;
	
	
	consoleDemoInit();
	
	//入力用配列の初期化
	i = 0;
	input_array[i] = '0';
	
	//プロンプトの表示
	iprintf("\n?\n%c", input_array[i]);
	
	while(1) {
		
		scanKeys();
		
		//数値を増やす
		if(keysDown() & KEY_UP){
			if(input_array[i] < '9'){
				input_array[i]++;
				iprintf("\x1b[1D%c", input_array[i]);
			}
		}
		
		//数値を減らす
		if(keysDown() & KEY_DOWN){
			if(input_array[i] > '0'){
				input_array[i]--;
				iprintf("\x1b[1D%c", input_array[i]);
			}
		}
		
		//前の桁に戻る
		if(keysDown() & KEY_LEFT){
			if(i > 0){
				iprintf("\x1b[1D ");
				input_array[i] = 0;
				i--;
				iprintf("\x1b[2D%c", input_array[i]);
			}
		}
		
		//次の桁に進む
		if(keysDown() & KEY_RIGHT){
			if(i < INPUT_MAX - 1){
				i++;
				input_array[i] = '0';
				iprintf("%c", input_array[i]);
			}
		}
		
		//入力を確定して画面に表示して
		//以前の入力データをリセットする
		if(keysDown() & KEY_A){
			
			num = atoi(input_array);
			iprintf("\ninput number : %d\n", num);
			
			for(i = 0;i < INPUT_MAX;i++)
				input_array[i] = '\0';
			
			i = 0;
			input_array[i] = '0';
			iprintf("\n?\n%c", input_array[i]);
			
		}
		
		swiWaitForVBlank();
		
	}

	return 0;
}