1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-23 21:32:53 +02:00

#15 android keyboard support; sensor landscape screen orientation

This commit is contained in:
XProger
2017-03-25 03:28:47 +03:00
parent 0e062800b9
commit b481719277
3 changed files with 58 additions and 55 deletions

View File

@@ -19,7 +19,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="landscape"> android:screenOrientation="sensorLandscape">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />

View File

@@ -106,14 +106,32 @@ int getPOV(int x, int y) {
return 0; return 0;
} }
InputKey keyToInputKey(int code) {
int codes[] = {
21, 22, 19, 20, 62, 66, 111, 59, 113, 57,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
};
for (int i = 0; i < sizeof(codes) / sizeof(codes[0]); i++)
if (codes[i] == code)
return (InputKey)(ikLeft + i);
return ikNone;
}
JNI_METHOD(void, nativeTouch)(JNIEnv* env, jobject obj, jint id, jint state, jfloat x, jfloat y) { JNI_METHOD(void, nativeTouch)(JNIEnv* env, jobject obj, jint id, jint state, jfloat x, jfloat y) {
// gamepad // gamepad / keyboard
if (state < 0) { if (state < 0) {
switch (state) { switch (state) {
case -3 : Input::setPos(ikJoyL, vec2(DeadZone(x), DeadZone(y))); break; case -3 : Input::setPos(ikJoyL, vec2(DeadZone(x), DeadZone(y))); break;
case -4 : Input::setPos(ikJoyR, vec2(DeadZone(x), DeadZone(y))); break; case -4 : Input::setPos(ikJoyR, vec2(DeadZone(x), DeadZone(y))); break;
case -5 : Input::setPos(ikJoyPOV, vec2(float(getPOV(sign(x), sign(y))), 0.0f)); break; case -5 : Input::setPos(ikJoyPOV, vec2(float(getPOV(sign(x), sign(y))), 0.0f)); break;
default : Input::setDown(InputKey(ikJoyA + (int)x), state != -1); default : {
int btn = int(x);
InputKey key = btn <= 0 ? InputKey(ikJoyA - btn) : keyToInputKey(btn);
Input::setDown(key, state != -1);
}
} }
return; return;
} }

View File

@@ -31,7 +31,6 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
private GLSurfaceView view; private GLSurfaceView view;
//private GvrLayout gvrLayout; //private GvrLayout gvrLayout;
private Wrapper wrapper; private Wrapper wrapper;
private SparseIntArray joys = new SparseIntArray();
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -121,69 +120,55 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
return true; return true;
} }
private int getJoyIndex(InputDevice dev) {
int src = dev.getSources();
if ((src & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD ||
(src & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) {
int id = dev.getId();
int index = joys.get(id, -1);
if (index == -1) {
index = joys.size();
joys.append(id, index);
}
return index;
}
return -1;
}
@Override @Override
public boolean onGenericMotion(View v, MotionEvent event) { public boolean onGenericMotion(View v, MotionEvent event) {
int index = getJoyIndex(event.getDevice()); int src = event.getDevice().getSources();
if (index == -1) return false;
wrapper.onTouch(index, -3, event.getAxisValue(MotionEvent.AXIS_X), boolean isMouse = (src & (InputDevice.SOURCE_MOUSE)) != 0;
event.getAxisValue(MotionEvent.AXIS_Y)); boolean isJoy = (src & (InputDevice.SOURCE_GAMEPAD | InputDevice.SOURCE_JOYSTICK)) != 0;
wrapper.onTouch(index, -4, event.getAxisValue(MotionEvent.AXIS_Z), if (isMouse) {
event.getAxisValue(MotionEvent.AXIS_RZ)); return true;
}
wrapper.onTouch(index, -5, event.getAxisValue(MotionEvent.AXIS_HAT_X), if (isJoy) {
event.getAxisValue(MotionEvent.AXIS_HAT_Y)); wrapper.onTouch(0, -3, event.getAxisValue(MotionEvent.AXIS_X),
event.getAxisValue(MotionEvent.AXIS_Y));
wrapper.onTouch(0, -4, event.getAxisValue(MotionEvent.AXIS_Z),
event.getAxisValue(MotionEvent.AXIS_RZ));
wrapper.onTouch(0, -5, event.getAxisValue(MotionEvent.AXIS_HAT_X),
event.getAxisValue(MotionEvent.AXIS_HAT_Y));
}
return true; return true;
} }
@Override @Override
public boolean onKey(View v, int keyCode, KeyEvent event) { public boolean onKey(View v, int keyCode, KeyEvent event) {
int index = getJoyIndex(event.getDevice());
if (index == -1)
return false;
int btn; int btn;
switch (keyCode) { switch (keyCode) {
case KeyEvent.KEYCODE_BUTTON_A : btn = 0; break; case KeyEvent.KEYCODE_BUTTON_A : btn = -0; break;
case KeyEvent.KEYCODE_BUTTON_B : btn = 1; break; case KeyEvent.KEYCODE_BUTTON_B : btn = -1; break;
case KeyEvent.KEYCODE_BUTTON_X : btn = 2; break; case KeyEvent.KEYCODE_BUTTON_X : btn = -2; break;
case KeyEvent.KEYCODE_BUTTON_Y : btn = 3; break; case KeyEvent.KEYCODE_BUTTON_Y : btn = -3; break;
case KeyEvent.KEYCODE_BUTTON_L1 : btn = 4; break; case KeyEvent.KEYCODE_BUTTON_L1 : btn = -4; break;
case KeyEvent.KEYCODE_BUTTON_R1 : btn = 5; break; case KeyEvent.KEYCODE_BUTTON_R1 : btn = -5; break;
case KeyEvent.KEYCODE_BUTTON_SELECT : btn = 6; break; case KeyEvent.KEYCODE_BUTTON_SELECT : btn = -6; break;
case KeyEvent.KEYCODE_BUTTON_START : btn = 7; break; case KeyEvent.KEYCODE_BUTTON_START : btn = -7; break;
case KeyEvent.KEYCODE_BUTTON_THUMBL : btn = 8; break; case KeyEvent.KEYCODE_BUTTON_THUMBL : btn = -8; break;
case KeyEvent.KEYCODE_BUTTON_THUMBR : btn = 9; break; case KeyEvent.KEYCODE_BUTTON_THUMBR : btn = -9; break;
case KeyEvent.KEYCODE_BUTTON_L2 : btn = 10; break; case KeyEvent.KEYCODE_BUTTON_L2 : btn = -10; break;
case KeyEvent.KEYCODE_BUTTON_R2 : btn = 11; break; case KeyEvent.KEYCODE_BUTTON_R2 : btn = -11; break;
default : btn = -1; case KeyEvent.KEYCODE_BACK : btn = KeyEvent.KEYCODE_ESCAPE;
default : btn = keyCode;
} }
if (btn != -1) { boolean isDown = event.getAction() == KeyEvent.ACTION_DOWN;
wrapper.onTouch(index, event.getAction() == KeyEvent.ACTION_DOWN ? -2 : -1, btn, 0); wrapper.onTouch(0, isDown ? -2 : -1, btn, 0);
return true; return true;
}
return false;
} }
static { static {