gpt4 book ai didi

android - 使用 mGLSurfaceView 处理 UI 事件

转载 作者:行者123 更新时间:2023-11-29 02:15:37 24 4
gpt4 key购买 nike

即使对于常规 View ,手册也非常模糊,甚至没有在 UI 事件概述页面中提及 mGLSurfaceView。

对于初学者来说,所有示例都无法正常工作,因为它们依赖于 View 的 Id(例如 Button button = (Button)findViewById(R.id.corky);)。我在尝试来回发送 UI 事件时遇到了麻烦。我使用了 shotgun 解决方案并将每个输入事件从 mGLSurfaceView 附加到 Activity ...但我渴望更好的东西。

所以,任何人都足够勇敢地想出一个简单的例子,其中包含一个 Activity、一个 mGLSurfaceView 和一个 Activity onTouch 事件,说明点击相对于屏幕大小的位置? (例如 w=50%,h=50% 完美点击屏幕中央)


public class GlClick extends Activity implements OnTouchListener {
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
mGLSurfaceView = new GLSurfaceView(this);
mGLSurfaceView.setRenderer(new GlRenderer());
setContentView(mGLSurfaceView);
mGLSurfaceView.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "example output: click was on 234x211 for a 800x600 screen.")
}
}

class GlRenderer implements Renderer {
// here be lots of messy beginner GL code ...
// ... you'd have wished for dragons.
public void onSurfaceChanged(GL10 gl, int w, int h) {
screenWidth = w;
screenHeight = h;
//TODO: send that to the activity
}
}

最佳答案

我正在开发 android 上的应用程序 ogl

我不使用任何触摸监听器或任何预制的东西,因为迟早你会浪费时间试图弄清楚如何做某事,哈哈

我发现很简单

@Override
public boolean onTouchEvent(MotionEvent event) {
if(sr != null){
/*if(event.getAction() == MotionEvent.ACTION_DOWN){
}else if(event.getAction() == MotionEvent.ACTION_MOVE){
}else if(event.getAction() == MotionEvent.ACTION_CANCEL){
}else if(event.getAction() == MotionEvent.ACTION_UP){*/
GameHandler.onTouchEvent(event);
//}
}
return true;
}

在 GameHandler 中,我首先将触摸从屏幕坐标转换为 glworld 坐标。

在我的 ui 元素中,我有位置和大小,我添加了一个方法“touch(...)”或“isTouched()”

根据我的经验,这非常有效,我建议您尝试一下 ^^

编辑触摸转换

public static void convertTouchToWorldRef(Vect vect){
vect.y = (SceneRenderer.Height-vect.y)/SceneRenderer.Height*SceneRenderer.GAME_DIMENSION_H;
vect.x = (vect.x)/SceneRenderer.Width*SceneRenderer.GAME_DIMENSION_W;
}
;

你需要在y上做height-y(ogl和android有不同的原点位置)

GAME_DIMENSION_* 是 ogl 世界投影平面的大小 (800*600)。

然后是它的基础数学(我不记得英文名字了)但是它的泰勒斯公式 x1/X1 = x2/X2。

编辑:矢量

public class Vector{
private float x = 0;
private float y = 0;
public Vector(float x, float y){
this.x = x;
this.y = y;
}
//add accessors get/set
...
}

您可以浏览互联网以获得更好的示例,例如 http://www.gamedev.net/community/forums/topic.asp?topic_id=302771

关于android - 使用 mGLSurfaceView 处理 UI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4202620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com