2

タッチ/マルチタッチ入力に問題があります。

ユーザーが押したところに100x100の小さな長方形を描きたい(ミッションは達成されました)が、ユーザーが指を動かしたときにそれらを動かしたい(それはatmではありません)。

動かない部分に加えて、奇妙な動作も得られます。たとえば、最初に親指で触れ、次に中指で触れたとします。各指の下に 2 つの立方体が表示されますが、最初に置いた指 (このシナリオでは親指) を離すと、2 番目に置いた指 (中指) の下の立方体が消え、親指があった場所に残ります。動きがあるたびにこれを正しく更新すると、この問題は自動的に解決すると思います。

これは Draw と Update のスニペットです。どんな助けでも感謝します:

protected override void Update(GameTime gameTime)
    {
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    TouchCollection touchLocations = TouchPanel.GetState();
    i = 0;

    foreach (TouchLocation touchLocation in touchLocations)
    {
        if (touchLocation.State == TouchLocationState.Pressed)
        {
            pos[i] = touchLocation.Position;
        }
        i++;
    }
    base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    for (j = 0; j < i; j++)
    {
        spriteBatch.Draw(whiteRectangle, new Rectangle(((int)pos[j].X - 50), ((int)pos[j].Y - 50), 100, 100), Color.Chocolate);
    }
    spriteBatch.End();
    base.Draw(gameTime);
}
4

2 に答える 2

0

タッチ位置をその位置に関連付けたいと仮定して、辞書を使用することをお勧めします。キーは TouchLocation.Id である必要があります

TouchLocation.Id は、特定のインタラクションに対して同じままです。TouchLocations の順序がフレームごとに同じであるという保証はないため、コレクションに表示される順序ではなく、それらの ID を使用する必要があります。

于 2013-01-08T22:07:37.640 に答える
0

私はこれに少し遅れていますが、何が間違っていたのか、それを解決する方法は次のとおりです...

foreach (TouchLocation touchLocation in touchLocations)
{
    if (touchLocation.State == TouchLocationState.Pressed)
    {
        pos[i] = touchLocation.Position;
    }
    i++;
}

コードのこの部分を書いたとき、私は眠かったと思います (午前 2 時以降は何も良いことが起こりません... 良いコードでさえありません) なぜ場所の状態が押されたかどうかを確認していたのかわかりません... それがそうしなかった理由です移動しても動かない...最初のフレームは確かに押されていますが、移動を開始すると.Moved ...全体として、それを削除すると魅力のように機能します...

foreach (TouchLocation touchLocation in touchLocations)
{
    pos[i] = touchLocation.Position;
    i++;
}

全体として、意図したとおりに動作するようになりました。

乾杯!

于 2013-01-15T10:56:05.590 に答える