Commit 2fcc88ae authored by kenan's avatar kenan

surface

parent 2fe782e3
......@@ -1453,34 +1453,39 @@ void Game::LoadConfig() {
}
void Game::SaveConfig() {
JNIEnv* jni = 0;
appMain->activity->vm->AttachCurrentThread(&jni, NULL);
if (!jni)
return;
//helper
gameConf.chkMAutoPos = chkMAutoPos->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkMAutoPos", gameConf.chkMAutoPos);
android::saveIntSetting(appMain, jni, "chkMAutoPos", gameConf.chkMAutoPos);
gameConf.chkSTAutoPos = chkSTAutoPos->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkSTAutoPos", gameConf.chkSTAutoPos);
android::saveIntSetting(appMain, jni, "chkSTAutoPos", gameConf.chkSTAutoPos);
gameConf.chkRandomPos = chkRandomPos->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkRandomPos", gameConf.chkRandomPos);
android::saveIntSetting(appMain, jni, "chkRandomPos", gameConf.chkRandomPos);
gameConf.chkAutoChain = chkAutoChain->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkAutoChain", gameConf.chkAutoChain);
android::saveIntSetting(appMain, jni, "chkAutoChain", gameConf.chkAutoChain);
gameConf.chkWaitChain = chkWaitChain->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkWaitChain", gameConf.chkWaitChain);
android::saveIntSetting(appMain, jni, "chkWaitChain", gameConf.chkWaitChain);
//system
gameConf.chkIgnore1 = chkIgnore1->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkIgnore1", gameConf.chkIgnore1);
android::saveIntSetting(appMain, jni, "chkIgnore1", gameConf.chkIgnore1);
gameConf.chkIgnore2 = chkIgnore2->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkIgnore2", gameConf.chkIgnore2);
android::saveIntSetting(appMain, jni, "chkIgnore2", gameConf.chkIgnore2);
gameConf.chkIgnoreDeckChanges = chkIgnoreDeckChanges->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "chkIgnoreDeckChanges", gameConf.chkIgnoreDeckChanges);
android::saveIntSetting(appMain, jni, "chkIgnoreDeckChanges", gameConf.chkIgnoreDeckChanges);
gameConf.auto_save_replay = chkAutoSaveReplay->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "auto_save_replay", gameConf.auto_save_replay);
android::saveIntSetting(appMain, jni, "auto_save_replay", gameConf.auto_save_replay);
gameConf.draw_field_spell = chkDrawFieldSpell->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "draw_field_spell", gameConf.draw_field_spell);
android::saveIntSetting(appMain, jni, "draw_field_spell", gameConf.draw_field_spell);
gameConf.quick_animation = chkQuickAnimation->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "quick_animation", gameConf.quick_animation);
android::saveIntSetting(appMain, jni, "quick_animation", gameConf.quick_animation);
gameConf.prefer_expansion_script = chkPreferExpansionScript->isChecked() ? 1 : 0;
android::saveIntSetting(appMain, "prefer_expansion_script", gameConf.prefer_expansion_script);
android::saveIntSetting(appMain, jni, "prefer_expansion_script", gameConf.prefer_expansion_script);
appMain->activity->vm->DetachCurrentThread();
//gameConf.control_mode = control_mode->isChecked()?1:0;
// android::saveIntSetting(appMain, "control_mode", gameConf.control_mode);
}
......
......@@ -56,6 +56,8 @@ namespace irr
virtual E_DEVICE_TYPE getType() const;
core::array<EKEY_CODE> KeyMap;
private:
static void handleAndroidCommand(ANDROID_APP app, int32_t cmd);
......@@ -80,7 +82,6 @@ namespace irr
video::SExposedVideoData ExposedVideoData;
core::array<EKEY_CODE> KeyMap;
};
} // end namespace irr
......
......@@ -441,13 +441,20 @@ int getIntSetting(ANDROID_APP app, const char* key,int defvalue){
return (int)ret;
}
void saveIntSetting(ANDROID_APP app, const char* key, int value) {
void saveIntSettingAuto(ANDROID_APP app, const char* key, int value){
if (!app || !app->activity || !app->activity->vm)
return;
JNIEnv* jni = 0;
app->activity->vm->AttachCurrentThread(&jni, NULL);
if (!jni)
return;
saveIntSetting(app, jni, key, value);
app->activity->vm->DetachCurrentThread();
}
void saveIntSetting(ANDROID_APP app, JNIEnv* jni, const char* key, int value) {
if (!app || !app->activity || !app->activity->vm)
return;
// Retrieves NativeActivity.
jobject lNativeActivity = app->activity->clazz;
jclass ClassNativeActivity = jni->GetObjectClass(lNativeActivity);
......@@ -464,7 +471,6 @@ void saveIntSetting(ANDROID_APP app, const char* key, int value) {
}
jni->DeleteLocalRef(classApp);
jni->DeleteLocalRef(ClassNativeActivity);
app->activity->vm->DetachCurrentThread();
}
void saveSetting(ANDROID_APP app, const char* key, const char* value) {
......
......@@ -160,7 +160,9 @@ extern void setLastDeck(ANDROID_APP app, const char* deckname);
//save last category name.
extern void setLastCategory(ANDROID_APP app, const char* catename);
extern void saveIntSetting(ANDROID_APP app, const char* key, int value);
extern void saveIntSetting(ANDROID_APP app, JNIEnv* jni, const char* key, int value);
extern void saveIntSettingAuto(ANDROID_APP app, const char* key, int value);
extern void saveSetting(ANDROID_APP app, const char* key, const char* value);
......
......@@ -4,6 +4,7 @@
#include "../Classes/gframe/os.h"
#include <unistd.h>
#include <pthread.h>
#include <Android/CIrrDeviceAndroid.h>
#include "../android/YGOGameOptions.h"
#include "../Classes/gframe/game.h"
......@@ -225,26 +226,37 @@ static void* join_game_thread(void* param) {
return NULL;
}
bool sendKey(int handle, int keycode, bool begin){
if(handle) {
CIrrDeviceAndroid *device = (CIrrDeviceAndroid *) handle;
if (device->isWindowFocused()) {
SEvent event;
event.EventType = EET_KEY_INPUT_EVENT;
int keyCode = keycode;
if (keyCode >= 0 && (u32) keyCode < device->KeyMap.size())
event.KeyInput.Key = device->KeyMap[keyCode];
else
event.KeyInput.Key = KEY_UNKNOWN;
event.KeyInput.PressedDown = begin;
event.KeyInput.Shift = false;
event.KeyInput.Control = false;
device->postEventFromUser(event);
return true;
}
}
return false;
}
/*
* Class: cn_garymb_ygomobile_core_IrrlichtBridge
* Method: nativeRefreshTexture
* Signature: (I)V
*/JNIEXPORT void JNICALL Java_cn_garymb_ygomobile_core_IrrlichtBridge_nativeRefreshTexture(
JNIEnv* env, jclass clazz, jint handle) {
if (handle) {
IrrlichtDevice* device = (IrrlichtDevice*) handle;
if (device->isWindowFocused()) {
if(sendKey(handle, KEY_KEY_R, true)){
irr::os::Printer::log("before send refresh event");
SEvent event;
event.EventType = EET_KEY_INPUT_EVENT;
//just cause a right up event to refresh texture
event.KeyInput.PressedDown = true;
event.KeyInput.Shift = false;
event.KeyInput.Control = false;
event.KeyInput.Key = KEY_KEY_R;
device->postEventFromUser(event);
}
}
}
......@@ -254,19 +266,8 @@ static void* join_game_thread(void* param) {
* Signature: (IZ)V
*/JNIEXPORT void JNICALL Java_cn_garymb_ygomobile_core_IrrlichtBridge_nativeIgnoreChain(
JNIEnv* env, jclass clazz, jint handle, jboolean begin) {
if (handle) {
IrrlichtDevice* device = (IrrlichtDevice*) handle;
if (device->isWindowFocused()) {
if(sendKey(handle, KEY_KEY_S, true)){
irr::os::Printer::log("before send ignore chain");
SEvent event;
event.EventType = EET_KEY_INPUT_EVENT;
//just cause a right up event to refresh texture
event.KeyInput.PressedDown = begin;
event.KeyInput.Shift = false;
event.KeyInput.Control = false;
event.KeyInput.Key = KEY_KEY_S;
device->postEventFromUser(event);
}
}
}
......@@ -276,20 +277,60 @@ static void* join_game_thread(void* param) {
* Signature: (IZ)V
*/JNIEXPORT void JNICALL Java_cn_garymb_ygomobile_core_IrrlichtBridge_nativeReactChain(
JNIEnv* env, jclass clazz, jint handle, jboolean begin) {
if (handle) {
IrrlichtDevice* device = (IrrlichtDevice*) handle;
if (device->isWindowFocused()) {
if(sendKey(handle, KEY_KEY_A, true)){
irr::os::Printer::log("before send react chain");
}
}
//key事件
JNIEXPORT void JNICALL Java_cn_garymb_ygomobile_core_IrrlichtBridge_nativeSendKey(
JNIEnv* env, jclass clazz, jint handle, jint keycode, jboolean begin) {
if(sendKey(handle, keycode, begin)){
irr::os::Printer::log("before send nativeSendKey");
}
}
//touch事件
JNIEXPORT void JNICALL Java_cn_garymb_ygomobile_core_IrrlichtBridge_nativeSendTouch(
JNIEnv* env, jclass clazz, jint handle, jint action, jint id, jfloat x, jfloat y) {
if(handle) {
irr::os::Printer::log("before send touch");
CIrrDeviceAndroid *device = (CIrrDeviceAndroid *) handle;
if (device->isWindowFocused()) {
SEvent event;
event.EventType = EET_KEY_INPUT_EVENT;
//just cause a right up event to refresh texture
event.KeyInput.PressedDown = begin;
event.KeyInput.Shift = false;
event.KeyInput.Control = false;
event.KeyInput.Key = KEY_KEY_A;
event.EventType = EET_TOUCH_INPUT_EVENT;
s32 eventAction = action;
s32 eventType = eventAction & AMOTION_EVENT_ACTION_MASK;
bool touchReceived = true;
switch (eventType) {
case AMOTION_EVENT_ACTION_DOWN:
case AMOTION_EVENT_ACTION_POINTER_DOWN:
event.TouchInput.Event = ETIE_PRESSED_DOWN;
break;
case AMOTION_EVENT_ACTION_MOVE:
event.TouchInput.Event = ETIE_MOVED;
break;
case AMOTION_EVENT_ACTION_UP:
case AMOTION_EVENT_ACTION_POINTER_UP:
case AMOTION_EVENT_ACTION_CANCEL:
event.TouchInput.Event = ETIE_LEFT_UP;
break;
default:
touchReceived = false;
break;
}
if (touchReceived) {
// Process all touches for move action.
event.TouchInput.ID = static_cast<size_t>(id);
event.TouchInput.X = static_cast<s32>(x);
event.TouchInput.Y = static_cast<s32>(y);
device->postEventFromUser(event);
}
}
}
}
static void* cancel_chain_thread(void* param) {
......
......@@ -3,6 +3,7 @@ package cn.garymb.ygomobile;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import cn.garymb.ygomobile.core.IrrlichtBridge;
......@@ -16,19 +17,19 @@ public class GameReceiver extends BroadcastReceiver {
if (ACTION_START.equals(action)) {
//
IrrlichtBridge.gPid = intent.getIntExtra(IrrlichtBridge.EXTRA_PID, 0);
// Log.w("ygo", "pid=" + IrrlichtBridge.gPid);
Log.w("ygo", "pid=" + IrrlichtBridge.gPid);
} else if (ACTION_STOP.equals(action)) {
int pid = intent.getIntExtra(IrrlichtBridge.EXTRA_PID, 0);
if (pid == 0 && IrrlichtBridge.gPid != 0) {
pid = IrrlichtBridge.gPid;
// Log.w("ygo", "will kill last pid=" + pid);
Log.w("ygo", "will kill last pid=" + pid);
}
if (pid == 0) {
pid = android.os.Process.myPid();
// Log.w("ygo", "will kill now pid=" + pid);
Log.w("ygo", "will kill now pid=" + pid);
}
try {
// Log.w("ygo", "kill pid=" + pid);
Log.e("ygo", "kill pid=" + pid);
android.os.Process.killProcess(pid);
} catch (Exception e) {
//ignore
......
......@@ -18,7 +18,10 @@ import android.os.PowerManager;
import android.util.Log;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.InputQueue;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.PopupWindow;
......@@ -78,6 +81,9 @@ public class YGOMobileActivity extends NativeActivity implements
private GameApplication mApp;
private Handler handler = new Handler();
private FullScreenUtils mFullScreenUtils;
private volatile int mPositionX, mPositionY;
private boolean mPaused;
private SurfaceView mSurfaceView;
// public static int notchHeight;
......@@ -100,6 +106,8 @@ public class YGOMobileActivity extends NativeActivity implements
@SuppressWarnings("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
mSurfaceView = new SurfaceView(this);
mSurfaceView.getHolder().addCallback(this);
super.onCreate(savedInstanceState);
Log.e("YGOStarter","跳转完成"+System.currentTimeMillis());
mFullScreenUtils = new FullScreenUtils(this, app().isImmerSiveMode());
......@@ -126,6 +134,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
protected void onResume() {
mPaused = false;
super.onResume();
Log.e("YGOStarter","ygo显示"+System.currentTimeMillis());
if (mLock == null) {
......@@ -140,6 +149,7 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
protected void onPause() {
mPaused = true;
super.onPause();
if (mLock != null) {
if (mLock.isHeld()) {
......@@ -206,18 +216,6 @@ public class YGOMobileActivity extends NativeActivity implements
}
}
private void fullscreen() {
//如果是沉浸模式
if (app().isImmerSiveMode()) {
mFullScreenUtils.fullscreen();
app().attachGame(this);
//游戏大小
int[] size = getGameSize();
getWindow().setLayout(size[0], size[1]);
}
}
private int[] getGameSize(){
//调整padding
float screenW = app().getScreenWidth();
......@@ -236,21 +234,94 @@ public class YGOMobileActivity extends NativeActivity implements
}
int w = (int)(1024.0*xScale);
int h = (int)(640.0*yScale);
mPositionX = (int)((sH - w)/2.0f);
mPositionY = (int)((sW - h)/2.0f);
return new int[]{w, h};
}
private void fullscreen() {
//如果是沉浸模式
if (app().isImmerSiveMode()) {
mFullScreenUtils.fullscreen();
app().attachGame(this);
//游戏大小
// int[] size = getGameSize();
// getWindow().setLayout(size[0], size[1]);
}
}
@Override
public void setContentView(View view) {
FrameLayout layout = new FrameLayout(this);
int[] size = getGameSize();
int w = size[0];
int h = size[1];
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(w, h);
FrameLayout layout = new FrameLayout(this);
lp.gravity = Gravity.CENTER;
layout.addView(mSurfaceView, lp);
layout.addView(view, lp);
getWindow().setLayout(w, h);
getWindow().setGravity(Gravity.CENTER);
view.setLongClickable(true);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v,final MotionEvent event) {
int eventType = event.getAction() & MotionEvent.ACTION_MASK;
switch (eventType) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
break;
default:
return false;
}
IrrlichtBridge.sendTouch(event.getAction(), event.getX(), event.getY(), 0);
return true;
}
});
// getWindow().setLayout(w, h);
// getWindow().setGravity(Gravity.CENTER);
super.setContentView(layout);
getWindow().takeSurface(null);
getWindow().takeInputQueue(null);
}
@Override
public void onInputQueueCreated(InputQueue queue) {
// super.onInputQueueCreated(queue);
}
@Override
public void onInputQueueDestroyed(InputQueue queue) {
// super.onInputQueueDestroyed(queue);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode != KeyEvent.KEYCODE_BACK){
IrrlichtBridge.sendKey(keyCode, true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode != KeyEvent.KEYCODE_BACK){
IrrlichtBridge.sendKey(keyCode, false);
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public void onBackPressed() {
// Toast.makeText(this, "请在游戏里面退出", Toast.LENGTH_SHORT).show();
// super.onBackPressed();
}
private void initExtraView() {
......@@ -425,6 +496,6 @@ public class YGOMobileActivity extends NativeActivity implements
@Override
public void setNativeHandle(int nativeHandle) {
IrrlichtBridge.sNativeHandle = nativeHandle;
IrrlichtBridge.setHandle(nativeHandle);
}
}
......@@ -39,7 +39,7 @@ public final class IrrlichtBridge {
}
public static int sNativeHandle;
private static int sNativeHandle;
//显示卡图
public static native byte[] nativeBpgImage(byte[] data);
//插入文本(大概是发送消息)
......@@ -59,6 +59,10 @@ public final class IrrlichtBridge {
private static native void nativeJoinGame(int handle, ByteBuffer buffer, int length);
private static native void nativeSendKey(int handle, int keycode, boolean begin);
private static native void nativeSendTouch(int handle, int action, int id, float x, float y);
private static final boolean DEBUG = false;
private static final String TAG = IrrlichtBridge.class.getSimpleName();
......@@ -117,37 +121,56 @@ public final class IrrlichtBridge {
return null;
}
}
public static void setHandle(int handle){
synchronized (IrrlichtBridge.class){
sNativeHandle = handle;
}
}
public static int getHandle() {
synchronized (IrrlichtBridge.class){
return sNativeHandle;
}
}
public static void cancelChain() {
nativeCancelChain(sNativeHandle);
nativeCancelChain(getHandle());
}
public static void ignoreChain(boolean begin) {
nativeIgnoreChain(sNativeHandle, begin);
nativeIgnoreChain(getHandle(), begin);
}
public static void reactChain(boolean begin) {
nativeReactChain(sNativeHandle, begin);
nativeReactChain(getHandle(), begin);
}
public static void sendKey(int keycode, boolean begin) {
nativeSendKey(getHandle(), keycode, begin);
}
public static void sendTouch(int action, float x, float y, int id) {
nativeSendTouch(getHandle(), action, id, x, y);
}
public static void insertText(String text) {
nativeInsertText(sNativeHandle, text);
nativeInsertText(getHandle(), text);
}
public static void setComboBoxSelection(int idx) {
nativeSetComboBoxSelection(sNativeHandle, idx);
nativeSetComboBoxSelection(getHandle(), idx);
}
public static void refreshTexture() {
nativeRefreshTexture(sNativeHandle);
nativeRefreshTexture(getHandle());
}
public static void setCheckBoxesSelection(int idx) {
nativeSetCheckBoxesSelection(sNativeHandle, idx);
nativeSetCheckBoxesSelection(getHandle(), idx);
}
public static void joinGame(ByteBuffer options, int length) {
nativeJoinGame(sNativeHandle, options, length);
nativeJoinGame(getHandle(), options, length);
}
public interface IrrlichtApplication {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment