mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-08 14:16:52 +02:00
#15 android gamepad support
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.xproger.openlara"
|
package="org.xproger.openlara"
|
||||||
android:versionCode="6"
|
android:versionCode="1"
|
||||||
android:versionName="1.4" >
|
android:versionName="0.1" >
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
|
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
|
||||||
<supports-screens android:smallScreens="true" android:largeScreens="true" android:normalScreens="true" android:xlargeScreens="true" />
|
<supports-screens android:smallScreens="true" android:largeScreens="true" android:normalScreens="true" android:xlargeScreens="true" />
|
||||||
@@ -11,10 +11,8 @@
|
|||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<!--
|
<!--
|
||||||
android:hasCode="true"
|
|
||||||
android:debuggable="true"
|
android:debuggable="true"
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
|
@@ -85,38 +85,45 @@ float DeadZone(float x) {
|
|||||||
return x = fabsf(x) < 0.2f ? 0.0f : x;
|
return x = fabsf(x) < 0.2f ? 0.0f : x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getPOV(int x, int y) {
|
||||||
|
switch (x) {
|
||||||
|
case -1 : {
|
||||||
|
if (y == -1) return 8;
|
||||||
|
if (y == 0) return 7;
|
||||||
|
if (y == +1) return 6;
|
||||||
|
}
|
||||||
|
case 0 : {
|
||||||
|
if (y == -1) return 1;
|
||||||
|
if (y == 0) return 0;
|
||||||
|
if (y == +1) return 5;
|
||||||
|
}
|
||||||
|
case +1 : {
|
||||||
|
if (y == -1) return 2;
|
||||||
|
if (y == 0) return 3;
|
||||||
|
if (y == +1) return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
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) {
|
||||||
if (id > 1) return;
|
if (id > 1) return;
|
||||||
/* gamepad
|
// gamepad
|
||||||
if (state < 0) {
|
if (state < 0) {
|
||||||
state = -state;
|
|
||||||
Input::Joystick &joy = Input::joy;
|
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case 3 :
|
case -3 : Input::setPos(ikJoyL, vec2(DeadZone(x), DeadZone(y))); break;
|
||||||
joy.L.x = DeadZone(x);
|
case -4 : Input::setPos(ikJoyR, vec2(DeadZone(x), DeadZone(y))); break;
|
||||||
joy.L.y = DeadZone(y);
|
case -5 : Input::setPos(ikJoyPOV, vec2(float(getPOV(sign(x), sign(y))), 0.0f)); break;
|
||||||
break;
|
default : Input::setDown(InputKey(ikJoyA + (int)x), state != -1);
|
||||||
case 4 :
|
|
||||||
joy.R.x = DeadZone(x);
|
|
||||||
joy.R.y = DeadZone(y);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
joy.down[(int)x] = state != 1;
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
if (state == 3 && x < Core::width / 2) {
|
if (state == 3 && x < Core::width / 2) {
|
||||||
vec2 center(Core::width * 0.25f, Core::height * 0.6f);
|
vec2 center(Core::width * 0.25f, Core::height * 0.6f);
|
||||||
vec2 pos(x, y);
|
vec2 pos(x, y);
|
||||||
vec2 d = pos - center;
|
vec2 d = pos - center;
|
||||||
|
Input::setPos(ikJoyL, d.normal());
|
||||||
float angle = atan2(d.x, -d.y) + PI * 0.125f;
|
|
||||||
if (angle < 0.0f) angle += PI2;
|
|
||||||
int pov = int(angle / (PI * 0.25f));
|
|
||||||
|
|
||||||
Input::setPos(ikJoyPOV, vec2(float(1 + pov), 0.0f));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (state == 2 && x > Core::width / 2) {
|
if (state == 2 && x > Core::width / 2) {
|
||||||
@@ -132,7 +139,7 @@ JNI_METHOD(void, nativeTouch)(JNIEnv* env, jobject obj, jint id, jint state, jfl
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (state == 1) {
|
if (state == 1) {
|
||||||
Input::setPos(ikJoyPOV, vec2(0.0f));
|
Input::setPos(ikJoyL, vec2(0.0f));
|
||||||
Input::setDown(ikJoyA, false);
|
Input::setDown(ikJoyA, false);
|
||||||
Input::setDown(ikJoyX, false);
|
Input::setDown(ikJoyX, false);
|
||||||
Input::setDown(ikJoyY, false);
|
Input::setDown(ikJoyY, false);
|
||||||
|
@@ -10,6 +10,8 @@ import android.media.AudioManager;
|
|||||||
import android.media.AudioTrack;
|
import android.media.AudioTrack;
|
||||||
import android.opengl.GLSurfaceView;
|
import android.opengl.GLSurfaceView;
|
||||||
import android.opengl.GLSurfaceView.Renderer;
|
import android.opengl.GLSurfaceView.Renderer;
|
||||||
|
//import com.google.vr.ndk.base.AndroidCompat;
|
||||||
|
//import com.google.vr.ndk.base.GvrLayout;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.res.AssetFileDescriptor;
|
import android.content.res.AssetFileDescriptor;
|
||||||
@@ -27,6 +29,7 @@ import android.view.WindowManager;
|
|||||||
|
|
||||||
public class MainActivity extends Activity implements OnTouchListener, OnGenericMotionListener, OnKeyListener {
|
public class MainActivity extends Activity implements OnTouchListener, OnGenericMotionListener, OnKeyListener {
|
||||||
private GLSurfaceView view;
|
private GLSurfaceView view;
|
||||||
|
//private GvrLayout gvrLayout;
|
||||||
private Wrapper wrapper;
|
private Wrapper wrapper;
|
||||||
private SparseIntArray joys = new SparseIntArray();
|
private SparseIntArray joys = new SparseIntArray();
|
||||||
|
|
||||||
@@ -44,8 +47,9 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
view = new GLSurfaceView(this);
|
view = new GLSurfaceView(this);
|
||||||
view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
|
|
||||||
view.setEGLContextClientVersion(2);
|
view.setEGLContextClientVersion(2);
|
||||||
|
view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
|
||||||
|
view.setPreserveEGLContextOnPause(true);
|
||||||
view.setRenderer(wrapper = new Wrapper());
|
view.setRenderer(wrapper = new Wrapper());
|
||||||
|
|
||||||
view.setFocusable(true);
|
view.setFocusable(true);
|
||||||
@@ -54,8 +58,15 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
|
|||||||
view.setOnTouchListener(this);
|
view.setOnTouchListener(this);
|
||||||
view.setOnGenericMotionListener(this);
|
view.setOnGenericMotionListener(this);
|
||||||
view.setOnKeyListener(this);
|
view.setOnKeyListener(this);
|
||||||
|
/*
|
||||||
|
gvrLayout = new GvrLayout(this);
|
||||||
|
gvrLayout.setPresentationView(view);
|
||||||
|
if (gvrLayout.setAsyncReprojectionEnabled(true))
|
||||||
|
AndroidCompat.setSustainedPerformanceMode(this, true);
|
||||||
|
setContentView(gvrLayout);
|
||||||
|
*/
|
||||||
setContentView(view);
|
setContentView(view);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String packName = getPackageManager().getPackageInfo(getPackageName(), 1).applicationInfo.sourceDir;
|
String packName = getPackageManager().getPackageInfo(getPackageName(), 1).applicationInfo.sourceDir;
|
||||||
AssetFileDescriptor fLevel = this.getResources().openRawResourceFd(R.raw.level2);
|
AssetFileDescriptor fLevel = this.getResources().openRawResourceFd(R.raw.level2);
|
||||||
@@ -138,13 +149,17 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
|
|||||||
wrapper.onTouch(index, -4, event.getAxisValue(MotionEvent.AXIS_Z),
|
wrapper.onTouch(index, -4, event.getAxisValue(MotionEvent.AXIS_Z),
|
||||||
event.getAxisValue(MotionEvent.AXIS_RZ));
|
event.getAxisValue(MotionEvent.AXIS_RZ));
|
||||||
|
|
||||||
|
wrapper.onTouch(index, -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());
|
int index = getJoyIndex(event.getDevice());
|
||||||
if (index == -1) return false;
|
if (index == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
int btn;
|
int btn;
|
||||||
|
|
||||||
@@ -153,6 +168,14 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
|
|||||||
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_R1 : btn = 5; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_SELECT : btn = 6; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_START : btn = 7; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_THUMBL : btn = 8; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_THUMBR : btn = 9; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_L2 : btn = 10; break;
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_R2 : btn = 11; break;
|
||||||
default : btn = -1;
|
default : btn = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +188,7 @@ public class MainActivity extends Activity implements OnTouchListener, OnGeneric
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
System.loadLibrary("game");
|
System.loadLibrary("game");
|
||||||
|
// System.loadLibrary("gvr");
|
||||||
// System.load("/storage/emulated/0/libMGD.so");
|
// System.load("/storage/emulated/0/libMGD.so");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,7 +199,6 @@ class Sound {
|
|||||||
|
|
||||||
public void start(final Wrapper wrapper) {
|
public void start(final Wrapper wrapper) {
|
||||||
int bufferSize = AudioTrack.getMinBufferSize(22050, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);
|
int bufferSize = AudioTrack.getMinBufferSize(22050, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);
|
||||||
System.out.println(String.format("sound buffer size: %d", bufferSize));
|
|
||||||
|
|
||||||
buffer = new short [bufferSize / 2];
|
buffer = new short [bufferSize / 2];
|
||||||
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
|
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
|
||||||
|
Reference in New Issue
Block a user