LibGDX入力モジュールのマウス、タッチスクリーン、キーボード
5251 ワード
libgdxがサポートする主な入力デバイスは、デスクトップ/ブラウザ上のマウス、Android上のタッチスクリーン、キーボードです.libgdxがこれらの入力デバイスをどのように抽象化するかを見てみましょう.
キーボード
キーボードは、キーの押下と解放のためのイベントを生成することによって、ユーザがどのキーを入力したかを示す.各イベントには、押された/解放されたキーを識別するキーコードがあります.これらの鍵コードはプラットフォーム間で異なります.Libgdxは、この相違を隠すために独自の鍵コードテーブルを提供することを試みており、Keysクラスを参照して詳細を参照してください.現在押されているキーをポーリングして問い合わせることができます.
Key-codes alone do not give us information about which character the user actually entered. This information is often derived from the state of multiple keys, e.g. the character 'A' is generated by the keys 'a' and 'shift' being pressed simultaneously. In general, deriving characters from the keyboard's state (which keys are down) is non-trivial. Thankfully, the operating system usually has a means to hook up an event listener that not only reports key-code events (key pressed/key released), but also characters. Libgdx uses this mechanism under the hood to provide you with character information. See Event Handling.
マウスとタッチパネル
マウスとタッチ入力により、ユーザーが画面上のものを指すことができます.2つの入力機構は、相互作用する位置を画面左上角に対する2 D座標として報告し、正x軸は右側を指し、y軸は下を指す.
マウスは、どのボタンが押されたかという付加情報を入力します.ほとんどのマウスには、左ボタンと右ボタン、および中ボタンがあります.さらに、通常、多くのアプリケーションでのスケールまたはスクロールに使用できるローラがあります.
タッチ入力はボタンの概念を持たず、ハードウェアの違いによりマルチタッチの傍受が複雑になる.初代Android携帯電話はワンタッチのみ対応.モトローラDroid携帯電話から、マルチタッチは多くのAndroid携帯電話の標準機能となっている.
タッチは異なるデバイス上で完全に異なる実装方法があり、これはポインタインデックスの指定と解放、およびイベントのトリガ方法に関係し、できるだけ多くのデバイスを使用してあなたの制御スキームが実行可能かどうかをテストすることを確保し、市場にも多くの入力テストアプリケーションがあり、特定のデバイスがタッチイベントをどのように処理するかを決定し、マルチデバイス上で実行される制御スキームの設計を支援することができます.
LibGDXはマウスとタッチイベントを統一的に処理し、マウスイベントに対してLibGDXはそれを特殊なタッチイベントと見なし、1本の指だけが追跡され、レポート座標を処理するほか、左ボタンか右ボタンが押されたかを報告し、タッチ入力に対しては複数の指(ポインタ)を追跡し、すべてのイベントを報告するボタンがマウスの左ボタンであることをサポートします.
Androidシステムでは、アプリケーションに設定した内容に応じて、座標システムは縦または横のモードに対して異なります.マウスイベントまたはタッチイベントは、ローテーションpolledまたはイベントを介してEvent Handlingを監視できます.
せっしょくてん
正しい世界座標を取得するコンタクトポイントまたはマウスカーソルは、元の画面座標とカメラの世界座標を変換します.次は簡単な例です.
///TDDO継続
キーボード
キーボードは、キーの押下と解放のためのイベントを生成することによって、ユーザがどのキーを入力したかを示す.各イベントには、押された/解放されたキーを識別するキーコードがあります.これらの鍵コードはプラットフォーム間で異なります.Libgdxは、この相違を隠すために独自の鍵コードテーブルを提供することを試みており、Keysクラスを参照して詳細を参照してください.現在押されているキーをポーリングして問い合わせることができます.
Key-codes alone do not give us information about which character the user actually entered. This information is often derived from the state of multiple keys, e.g. the character 'A' is generated by the keys 'a' and 'shift' being pressed simultaneously. In general, deriving characters from the keyboard's state (which keys are down) is non-trivial. Thankfully, the operating system usually has a means to hook up an event listener that not only reports key-code events (key pressed/key released), but also characters. Libgdx uses this mechanism under the hood to provide you with character information. See Event Handling.
マウスとタッチパネル
マウスとタッチ入力により、ユーザーが画面上のものを指すことができます.2つの入力機構は、相互作用する位置を画面左上角に対する2 D座標として報告し、正x軸は右側を指し、y軸は下を指す.
マウスは、どのボタンが押されたかという付加情報を入力します.ほとんどのマウスには、左ボタンと右ボタン、および中ボタンがあります.さらに、通常、多くのアプリケーションでのスケールまたはスクロールに使用できるローラがあります.
タッチ入力はボタンの概念を持たず、ハードウェアの違いによりマルチタッチの傍受が複雑になる.初代Android携帯電話はワンタッチのみ対応.モトローラDroid携帯電話から、マルチタッチは多くのAndroid携帯電話の標準機能となっている.
タッチは異なるデバイス上で完全に異なる実装方法があり、これはポインタインデックスの指定と解放、およびイベントのトリガ方法に関係し、できるだけ多くのデバイスを使用してあなたの制御スキームが実行可能かどうかをテストすることを確保し、市場にも多くの入力テストアプリケーションがあり、特定のデバイスがタッチイベントをどのように処理するかを決定し、マルチデバイス上で実行される制御スキームの設計を支援することができます.
LibGDXはマウスとタッチイベントを統一的に処理し、マウスイベントに対してLibGDXはそれを特殊なタッチイベントと見なし、1本の指だけが追跡され、レポート座標を処理するほか、左ボタンか右ボタンが押されたかを報告し、タッチ入力に対しては複数の指(ポインタ)を追跡し、すべてのイベントを報告するボタンがマウスの左ボタンであることをサポートします.
Androidシステムでは、アプリケーションに設定した内容に応じて、座標システムは縦または横のモードに対して異なります.マウスイベントまたはタッチイベントは、ローテーションpolledまたはイベントを介してEvent Handlingを監視できます.
せっしょくてん
正しい世界座標を取得するコンタクトポイントまたはマウスカーソルは、元の画面座標とカメラの世界座標を変換します.次は簡単な例です.
public class SimplerTouchTest extends ApplicationAdapter implements InputProcessor {
// we will use 32px/unit in world
public final static float SCALE = 32f;
public final static float INV_SCALE = 1.f/SCALE;
// this is our "target" resolution, not that the window can be any size, it is not bound to this one
public final static float VP_WIDTH = 1280 * INV_SCALE;
public final static float VP_HEIGHT = 720 * INV_SCALE;
private OrthographicCamera camera;
private ExtendViewport viewport;
private ShapeRenderer shapes;
@Override public void create () {
camera = new OrthographicCamera();
// pick a viewport that suits your thing, ExtendViewport is a good start
viewport = new ExtendViewport(VP_WIDTH, VP_HEIGHT, camera);
// ShapeRenderer so we can see our touch point
shapes = new ShapeRenderer();
Gdx.input.setInputProcessor(this);
}
@Override public void render () {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
shapes.setProjectionMatrix(camera.combined);
shapes.begin(ShapeRenderer.ShapeType.Filled);
shapes.circle(tp.x, tp.y, 0.25f, 16);
shapes.end();
}
Vector3 tp = new Vector3();
boolean dragging;
@Override public boolean mouseMoved (int screenX, int screenY) {
// we can also handle mouse movement without anything pressed
// camera.unproject(tp.set(screenX, screenY, 0));
return false;
}
@Override public boolean touchDown (int screenX, int screenY, int pointer, int button) {
// ignore if its not left mouse button or first touch pointer
if (button != Input.Buttons.LEFT || pointer > 0) return false;
camera.unproject(tp.set(screenX, screenY, 0));
dragging = true;
return true;
}
@Override public boolean touchDragged (int screenX, int screenY, int pointer) {
if (!dragging) return false;
camera.unproject(tp.set(screenX, screenY, 0));
return true;
}
@Override public boolean touchUp (int screenX, int screenY, int pointer, int button) {
if (button != Input.Buttons.LEFT || pointer > 0) return false;
camera.unproject(tp.set(screenX, screenY, 0));
dragging = false;
return true;
}
@Override public void resize (int width, int height) {
// viewport must be updated for it to work properly
viewport.update(width, height, true);
}
@Override public void dispose () {
// disposable stuff must be disposed
shapes.dispose();
}
@Override public boolean keyDown (int keycode) {
return false;
}
@Override public boolean keyUp (int keycode) {
return false;
}
@Override public boolean keyTyped (char character) {
return false;
}
@Override public boolean scrolled (int amount) {
return false;
}
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.width = 1280;
config.height = 720;
config.useHDPI = true;
new LwjglApplication(new SimplerTouchTest(), config);
}
}
///TDDO継続