初級 プログラマー
ポインターは、指のタッチに対応するデバイス画面上の点です。マルチタッチ機能のあるデバイスでは、同時に複数のポインターがサポートされます。
デスクトップ プラットフォームでは、左マウス ボタンを使用してポインターをシミュレートできます。マウス入力の詳細については、「マウス」を参照してください。
ユーザーが、画面をタッチするか、左マウス ボタンをクリックします。
Stride が、ポインターを作成します。
Stride が、特定の指に対応するそのポインターにポインター ID を割り当てます。
ポインターが変更されるたびに、Stride はそのポインターで新しいポインター イベントを作成します。
新しい指ごとに、Stride は新しいポインター ID で新しいポインターを作成します。
[!NOTE] 各ポインター イベントには、1 つのポインターだけについての情報が含まれます。複数のポインターが同じ更新で同時に変更された場合、ポインターごとに異なるイベントが作成されます。
[!WARNING] ポインターの変更の処理は、OS ごとに異なります。つまり、指の同じジェスチャでも、プラットフォームが異なると、若干異なるポインター イベント シーケンスが生成されることがあります。たとえば、Android では、指が画面にタッチしても、動いていない場合は、新しいポインター イベントは作成されません。詳細については、OS のドキュメントを参照してください。
ジェスチャの認識を有効にして、長押しやタップなどのジェスチャを検出できます。詳細については、「ジェスチャ」を参照してください。
PointerEvent は、ポインターのイベントを報告します。イベントには、現在のポインターの位置と時刻の情報が含まれます。ポインターが変更されるたびにスローされます。
最後の更新以降のポインター イベントのリストには、InputManager.PointerEvents を使用してアクセスできます。ポインター イベントは時間順に一覧表示されます。リストは更新のたびにクリアされるので、手動でクリアする必要はありません。
以下のプロパティを使用して、イベントをトリガーしたポインターに関する情報を取得できます。
| プロパティ | 説明 |
|---|---|
| PointerEvent.PointerId | イベントをトリガーしたポインターの ID を示します。 |
[!WARNING] ポインターの ID は、ポインター イベントの 1 回の Pressed->Moved->Released のシーケンスの間だけ有効です。 同じ指でも、画面にタッチするたびに ID が異なる場合があります (非常にすばやく行われた場合であっても)。
[!WARNING] ポインターに ID を割り当てる方法は、OS ごとに異なります。 ポインター ID の値と対応する指の間に関係はありません。
マウスまたはタッチによってポインター イベントがトリガーされたかどうかを確認するには、次のようにします。
bool isTriggeredByMouse = event.Pointer is IMouseDevice
正規化された座標または絶対座標でポインターの位置を取得できます。
@'Stride.Input.PointerEvent.Position' は、ピクセル単位の実際の画面サイズではなく、正規化された X および Y 座標でポインターの位置を返します。そのため、ポインターの位置は任意の解像度に合わせて調整され、異なる解像度ごとに異なるコードを作成する必要はありません。
PointerEvent.AbsolutePosition は、X と Y の絶対座標 (ピクセル単位の実際の画面サイズ) でポインターの位置を返します。たとえば、ポインターが画面の左上隅にある場合、値は (0,0) です。ポインターが右下隅にある場合、値は画面の解像度に依存します (たとえば (1280,720))。
[!TIP] 画面の実際のサイズを取得するには、IPointerDevice.SurfaceSize にアクセスします。次に例を示します。
> var surfaceSize = Input.Pointer.SurfaceSize; > ``` ### ポインター イベントを取得する ポインター イベントを調べるには、[PointerEvent.EventType](xref:Stride.Input.PointerEvent.EventType) を使用します。 5 種類のポインター イベントがあります。 * **Pressed**: 指が画面にタッチしました。 * **Moved**: 指が画面に沿って移動しました。 * **Released**: 指が画面を離れました。 * **Canceled**: ポインター シーケンスがキャンセルされました。このイベントは、たとえば電話の着信によって電話アプリが割り込まれた場合など、アプリケーションが中断されたときに発生します。 > [!NOTE] > 1 つのポインターに対するポインター イベントのシーケンスは、常に **Pressed** イベントで開始します。その後で 1 つ以上の **Moved** イベントが発生する可能性があり、常に **Released** または **Canceled** イベントで終了します。 ### デルタ値を取得する [PointerEvent.DeltaTime](xref:Stride.Input.PointerEvent.DeltaTime) は、前回の @'Stride.Input.PointerEvent' からの経過時間を取得します。 正規化された座標または絶対座標でデルタ位置を取得できます。 ### 正規化されたデルタ値 [PointerEvent.DeltaPosition](xref:Stride.Input.PointerEvent.DeltaPosition) は、前回の @'Stride.Input.PointerEvent' からの位置の変化を、**正規化された** X、Y 座標で取得します。 > [!NOTE] > ポインター イベントのシーケンスの開始時には (つまり、**ポインターの状態**が**ダウン**のとき)、デルタ値は常に null になっています。 ### 絶対デルタ値 [PointerEvent.DeltaPosition](xref:Stride.Input.PointerEvent.AbsoluteDeltaPosition) は、前回の @'Stride.Input.PointerEvent' からの位置の変化を、**絶対** (X,Y) 座標で取得します。 ## コード例 このスクリプトは、ポインターの動きを追跡して、その位置を表示します。cs 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);
}
}
}
} ```