• ベストアンサー

下記のサイトを参考に,例えばABCと打ったキーに対し、普通だとキーを離

下記のサイトを参考に,例えばABCと打ったキーに対し、普通だとキーを離すとそのABCの表示は消えるのですが、それを消さずに格納させ、次のDをうつときにはABCDと文字が表示されるようにしたいのです。 よろしければプログラムの一例を教えてください。 難しいところは文章にて解説していただけるとありがたいです。 よろしくお願いします。 http://sorceryforce.com/xna/tips_pressedkeyboardkeys.html

質問者が選んだベストアンサー

  • ベストアンサー
回答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); }

noname#250564
質問者

お礼

ご返事ありがとうございます。 無事変更することができました。 ちなみになのですが、デバックを開始し、キー入力をした後、入力したキーの情報をデータとしてファイルに保存したり、再び開いたりする事はこのプログラムではできますでしょうか? 度々で大変恐縮ではございますがよろしくお願いいたします。

noname#250564
質問者

補足

質問と全くそれた内容で、失礼なことを言ってしまい大変申し訳ございませんでした。 自己解決してみます。 また分からなく場合は改めて質問させていただきます。 ご回答くださりありがとうございました。

その他の回答 (3)

回答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); }

noname#250564
質問者

お礼

ご回答くださりありがとうございました。 うまく起動することができました。 また質問で大変恐縮ではございますが、例えばkキーを長く押すと「kkkkkkkkk」とkが連続して表示するようにしたい場合はどうすればよろしいでしょうか?

回答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.1

 // 押されているキーの一覧を取得  Keys[] pushedKeys = this.keyState.GetPressedKeys(); ってやってから  // 押されているキーを表示する  int y = 50;  foreach (Keys key in pushedKeys)  { って表示しているから、キーを離してしまうと表示が消える。 キー一覧をオート変数にしているから、関数から抜けて呼び出し元に帰ると、キー一覧が消滅しちゃってる。 キー一覧が毎回消滅しちゃってるから、キーを離すと表示が消えてしまう訳だ。 だったら、グローバル変数に「今まで押された事のあるキー一覧」を作って、新しく押されたキー一覧を、それに足せば良い。 そして、表示部分は、現状では「新しく押されたキー一覧」が表示されてしまっているので「今まで押された事のあるキー一覧」が表示されるように変更すればよい。

noname#250564
質問者

お礼

ご回答くださりありがとうございます。 原因がわかり安心しました。

関連するQ&A