下記のサイトを参考に,例えばABCと打ったキーに対し、普通だとキーを離すとそのABCの表示は消えるのですが、それを消さずに格納させ、次のDをうつときにはABCDと文字が表示されるようにしたいのです。
よろしければプログラムの一例を教えてください。
難しいところは文章にて解説していただけるとありがたいです。
よろしくお願いします。
http://sorceryforce.com/xna/tips_pressedkeyboard …
No.1
- 回答日時:
// 押されているキーの一覧を取得
Keys[] pushedKeys = this.keyState.GetPressedKeys();
ってやってから
// 押されているキーを表示する
int y = 50;
foreach (Keys key in pushedKeys)
{
って表示しているから、キーを離してしまうと表示が消える。
キー一覧をオート変数にしているから、関数から抜けて呼び出し元に帰ると、キー一覧が消滅しちゃってる。
キー一覧が毎回消滅しちゃってるから、キーを離すと表示が消えてしまう訳だ。
だったら、グローバル変数に「今まで押された事のあるキー一覧」を作って、新しく押されたキー一覧を、それに足せば良い。
そして、表示部分は、現状では「新しく押されたキー一覧」が表示されてしまっているので「今まで押された事のあるキー一覧」が表示されるように変更すればよい。
No.2
- 回答日時:
こんばんは。
ワープロ見たいに入力したいのでしょうか。
ゲーム系の入力なので、自前でキーが押された、離されたの判定をしないといけないのでは。
取りあえず、リンク先のソースを以下の様に修正、追加して見てください。
//変数追加
private Keys[] textBuffer = new Keys[0];
private bool[] keyBuffer = new bool[256];//押された離されたを記憶する
//関数追加
private bool Find(ref Keys[] pushedKeys, Keys comp)
{
foreach(Keys key in pushedKeys)
if(key == comp)
return true;
return false;
}
No.3
- 回答日時:
続きです。
//関数修正
protected override void Draw(GameTime gameTime)
{
// 画面を指定した色でクリアします
this.GraphicsDevice.Clear(Color.CornflowerBlue);
// 押されているキーの一覧を取得
Keys[] pushedKeys = this.keyState.GetPressedKeys();
//追加
for (int n = 0; n < this.keyBuffer.Length; ++n )
{
Keys key = (Keys)n;
bool bResult = this.Find(ref pushedKeys, key);
if (this.keyBuffer[n] == false && bResult == true)
{
//初めて押された
Array.Resize(ref this.textBuffer, this.textBuffer.Length + 1);
this.textBuffer[this.textBuffer.Length - 1] = key;
this.keyBuffer[n] =true;
}
else if (this.keyBuffer[n] == true && bResult == false)
{
//離された
this.keyBuffer[n] = false;
}
else
{
//押され続けている
}
}
// スプライトの描画準備
this.spriteBatch.Begin();
// 押されているキーを表示する
int y = 50;
foreach (Keys key in this.textBuffer)
{
//以下のキーを無視
switch(key)
{
case Keys.Attn:
case Keys.Zoom:
case Keys.NumLock:
case Keys.CapsLock:
continue;
}
this.spriteBatch.DrawString(this.font, key.ToString(),
new Vector2(50.0f, y), Color.White);
y += 16;
}
// スプライトの一括描画
this.spriteBatch.End();
// 登録された DrawableGameComponent を描画する
base.Draw(gameTime);
}
ご回答くださりありがとうございました。
うまく起動することができました。
また質問で大変恐縮ではございますが、例えばkキーを長く押すと「kkkkkkkkk」とkが連続して表示するようにしたい場合はどうすればよろしいでしょうか?
No.4ベストアンサー
- 回答日時:
こんばんは。
補足頂きました。可能ではありますが、現状では大分強引かと。//boolからintに変更
private int[] keyBuffer = new int[256];
//修正
protected override void Draw(GameTime gameTime)
{
this.GraphicsDevice.Clear(Color.CornflowerBlue);
Keys[] pushedKeys = this.keyState.GetPressedKeys();
//変更
for (int n = 0; n < this.keyBuffer.Length; ++n )
{
Keys key = (Keys)n;
bool bResult = this.Find(ref pushedKeys, key);
if (this.keyBuffer[n] == 0 && bResult == true)
{
//初めて押された
Array.Resize(ref this.textBuffer, this.textBuffer.Length + 1);
this.textBuffer[this.textBuffer.Length - 1] = key;
this.keyBuffer[n] = 1;
}
else if (this.keyBuffer[n] > 0 && bResult == false)
{
//離された
this.keyBuffer[n] = 0;
}
else if (this.keyBuffer[n] > 0 && bResult == true)
{
//押され続けてる
this.keyBuffer[n] = Math.Min(++this.keyBuffer[n], 0xFFFF);
//40回以上検出で連射開始
if (this.keyBuffer[n] >= 40)
{
Array.Resize(ref this.textBuffer, this.textBuffer.Length + 1);
this.textBuffer[this.textBuffer.Length - 1] = key;
}
}
else
{
//その他
}
}
this.spriteBatch.Begin();
int y = 50;
foreach (Keys key in this.textBuffer)
{
switch(key)
{
case Keys.Attn:
case Keys.Zoom:
case Keys.NumLock:
case Keys.CapsLock:
continue;
}
this.spriteBatch.DrawString(this.font, key.ToString(),new Vector2(50.0f, y), Color.White);
y += 16;
}
this.spriteBatch.End();
base.Draw(gameTime);
}
この回答への補足
質問と全くそれた内容で、失礼なことを言ってしまい大変申し訳ございませんでした。
自己解決してみます。
また分からなく場合は改めて質問させていただきます。
ご回答くださりありがとうございました。
ご返事ありがとうございます。
無事変更することができました。
ちなみになのですが、デバックを開始し、キー入力をした後、入力したキーの情報をデータとしてファイルに保存したり、再び開いたりする事はこのプログラムではできますでしょうか?
度々で大変恐縮ではございますがよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/08 09:05
- マウス・キーボード scroll Lockキーを解除したけれど。 1 2022/09/16 09:23
- フリーソフト 1秒毎にキーの←を押すソフト 1 2023/03/06 04:27
- マウス・キーボード 不良表示キー(キーボード) 3 2022/04/27 10:53
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 08:37
- マウス・キーボード NEC PC-9801とか、昔のパソコンのキーボード 2 2022/09/20 20:13
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Windows 95・98 Windows11にバージョン アップしました。 2 2023/07/21 18:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPでこのコード自体に意味は無...
-
3つの連想配列を交互に代入し...
-
PHPで連想配列のプルダウンメニ...
-
foreachで上限回数指定方法また...
-
Excel VBAでフィルター後の対象...
-
PHP、{}記号の意味
-
ftokが動かない?
-
関数をの引数について。
-
phpでforeachの中にforeachがあ...
-
リストボックス複数選択抽出方法
-
プログラミングのPythonのnoteb...
-
プルダウンメニューにDBの内容...
-
file_existsでファイル名の部分...
-
PHPのmin関数、「1」以上の数値...
-
スカラーのベクトル微分
-
Perlで重複行を削除したい
-
特定の文からメールアドレスの...
-
MySQLのデータをPHPで多次元...
-
配列をループでたくさん宣言し...
-
数独かを判断するプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マッチング処理(1:N)
-
smartyのforeachの使い方
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
VB.NET で 二次元のハッシュは...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
POSTで渡されるデータの数がわ...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
Delphi XEの警告文を消したい
-
配列から順位を算出したい
おすすめ情報