アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のサイトを参考に,例えばABCと打ったキーに対し、普通だとキーを離すとそのABCの表示は消えるのですが、それを消さずに格納させ、次のDをうつときにはABCDと文字が表示されるようにしたいのです。

よろしければプログラムの一例を教えてください。

難しいところは文章にて解説していただけるとありがたいです。

よろしくお願いします。


http://sorceryforce.com/xna/tips_pressedkeyboard …

A 回答 (4件)

 // 押されているキーの一覧を取得


 Keys[] pushedKeys = this.keyState.GetPressedKeys();
ってやってから
 // 押されているキーを表示する
 int y = 50;
 foreach (Keys key in pushedKeys)
 {
って表示しているから、キーを離してしまうと表示が消える。

キー一覧をオート変数にしているから、関数から抜けて呼び出し元に帰ると、キー一覧が消滅しちゃってる。

キー一覧が毎回消滅しちゃってるから、キーを離すと表示が消えてしまう訳だ。

だったら、グローバル変数に「今まで押された事のあるキー一覧」を作って、新しく押されたキー一覧を、それに足せば良い。

そして、表示部分は、現状では「新しく押されたキー一覧」が表示されてしまっているので「今まで押された事のあるキー一覧」が表示されるように変更すればよい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/19 22:09

 こんばんは。


 ワープロ見たいに入力したいのでしょうか。
 ゲーム系の入力なので、自前でキーが押された、離されたの判定をしないといけないのでは。
 取りあえず、リンク先のソースを以下の様に修正、追加して見てください。

//変数追加
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;
}
    • good
    • 0

 続きです。



//関数修正
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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/19 21:19

 こんばんは。

補足頂きました。可能ではありますが、現状では大分強引かと。

//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);
}

この回答への補足

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

補足日時:2010/05/21 18:01
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/20 00:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!