Table of Contents

ポインター

初級 プログラマー

ポインターは、指のタッチに対応するデバイス画面上の点です。マルチタッチ機能のあるデバイスでは、同時に複数のポインターがサポートされます。

デスクトップ プラットフォームでは、左マウス ボタンを使用してポインターをシミュレートできます。マウス入力の詳細については、「マウス」を参照してください。

Stride によるポインター入力の処理方法

  1. ユーザーが、画面をタッチするか、左マウス ボタンをクリックします。

  2. Stride が、ポインターを作成します。

  3. Stride が、特定の指に対応するそのポインターにポインター ID を割り当てます。

  4. ポインターが変更されるたびに、Stride はそのポインターで新しいポインター イベントを作成します。

  5. 新しい指ごとに、Stride は新しいポインター ID で新しいポインターを作成します。

Note

各ポインター イベントには、1 つのポインターだけについての情報が含まれます。複数のポインターが同じ更新で同時に変更された場合、ポインターごとに異なるイベントが作成されます。

Warning

ポインターの変更の処理は、OS ごとに異なります。つまり、指の同じジェスチャでも、プラットフォームが異なると、若干異なるポインター イベント シーケンスが生成されることがあります。たとえば、Android では、指が画面にタッチしても、動いていない場合は、新しいポインター イベントは作成されません。詳細については、OS のドキュメントを参照してください。

ジェスチャの認識を有効にして、長押しやタップなどのジェスチャを検出できます。詳細については、「ジェスチャ」を参照してください。

PointerEvent クラス

PointerEvent は、ポインターのイベントを報告します。イベントには、現在のポインターの位置と時刻の情報が含まれます。ポインターが変更されるたびにスローされます。

最後の更新以降のポインター イベントのリストには、InputManager.PointerEvents を使用してアクセスできます。ポインター イベントは時間順に一覧表示されます。リストは更新のたびにクリアされるので、手動でクリアする必要はありません。

ポインターの情報を取得する

以下のプロパティを使用して、イベントをトリガーしたポインターに関する情報を取得できます。

プロパティ 説明
PointerEvent.PointerId イベントをトリガーしたポインターの ID を示します。
Warning

ポインターの ID は、ポインター イベントの 1 回の Pressed->Moved->Released のシーケンスの間だけ有効です。 同じ指でも、画面にタッチするたびに ID が異なる場合があります (非常にすばやく行われた場合であっても)。

Warning

ポインターに ID を割り当てる方法は、OS ごとに異なります。 ポインター ID の値と対応する指の間に関係はありません。

マウスまたはタッチによってポインター イベントがトリガーされたかどうかを確認するには、次のようにします。

bool isTriggeredByMouse = event.Pointer is IMouseDevice

ポインターの位置を取得する

正規化された座標または絶対座標でポインターの位置を取得できます。

正規化された座標

Position は、ピクセル単位の実際の画面サイズではなく、正規化された X および Y 座標でポインターの位置を返します。そのため、ポインターの位置は任意の解像度に合わせて調整され、異なる解像度ごとに異なるコードを作成する必要はありません。

  • (0,0): ポインターは画面の左上隅にあります。
  • (1,1): ポインターは画面の右下隅にあります。

絶対座標

PointerEvent.AbsolutePosition は、X と Y の絶対座標 (ピクセル単位の実際の画面サイズ) でポインターの位置を返します。たとえば、ポインターが画面の左上隅にある場合、値は (0,0) です。ポインターが右下隅にある場合、値は画面の解像度に依存します (たとえば (1280,720))。

Tip

画面の実際のサイズを取得するには、IPointerDevice.SurfaceSize にアクセスします。次に例を示します。

var surfaceSize = Input.Pointer.SurfaceSize;

ポインター イベントを取得する

ポインター イベントを調べるには、PointerEvent.EventType を使用します。

5 種類のポインター イベントがあります。

  • Pressed: 指が画面にタッチしました。
  • Moved: 指が画面に沿って移動しました。
  • Released: 指が画面を離れました。
  • Canceled: ポインター シーケンスがキャンセルされました。このイベントは、たとえば電話の着信によって電話アプリが割り込まれた場合など、アプリケーションが中断されたときに発生します。
Note

1 つのポインターに対するポインター イベントのシーケンスは、常に Pressed イベントで開始します。その後で 1 つ以上の Moved イベントが発生する可能性があり、常に Released または Canceled イベントで終了します。

デルタ値を取得する

PointerEvent.DeltaTime は、前回の PointerEvent からの経過時間を取得します。

正規化された座標または絶対座標でデルタ位置を取得できます。

正規化されたデルタ値

PointerEvent.DeltaPosition は、前回の PointerEvent からの位置の変化を、正規化された X、Y 座標で取得します。

Note

ポインター イベントのシーケンスの開始時には (つまり、ポインターの状態ダウンのとき)、デルタ値は常に null になっています。

絶対デルタ値

PointerEvent.DeltaPosition は、前回の PointerEvent からの位置の変化を、絶対 (X,Y) 座標で取得します。

コード例

このスクリプトは、ポインターの動きを追跡して、その位置を表示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Stride.Core.Mathematics;
using Stride.Engine;

namespace Stride.Input.Tests
{
    public class PointerTestScript : AsyncScript
    {
        public override async Task Execute()
        {
            var pointerPositions = new Dictionary<int, Vector2>();
            while (true)
            {
                await Script.NextFrame();
                foreach (var pointerEvent in Input.PointerEvents)
                {
                    switch (pointerEvent.EventType)
                    {
                    case PointerEventType.Pressed:
                        pointerPositions[pointerEvent.PointerId] = pointerEvent.Position;
                        break;
                    case PointerEventType.Moved:
                        pointerPositions[pointerEvent.PointerId] = pointerEvent.Position;
                        break;
                    case PointerEventType.Released:
                    case PointerEventType.Canceled:
                        pointerPositions.Remove(pointerEvent.PointerId);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                var positionsStr = pointerPositions.Values.Aggregate("", (current, pointer) => current + (pointer.ToString() + ", "));
                Log.Info("There are currently {0} pointers on the screen located at {1}", pointerPositions.Count, positionsStr);
            }
        }
    }
}

関連項目