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