私のアプリケーションは Android の openGL ES 2.0 で作成されており、オブジェクトの位置の更新に関してかなり深刻な問題が発生しています。私のゲーム ループは次のようになります。すべてのオブジェクトを描画します --> ゲーム オブジェクトの位置を更新します --> 繰り返します。ただし、2 種類の位置更新があります。1 つは計算ベースで、値が十分に低いか高い場合に方向が変わります。もう 1 つはタッチ ベースで、ユーザーが任意の位置をタッチしたり、画面をスワイプしたりすると、オブジェクトが追従します。
今問題に。ユーザーが画面に触れたりスワイプしたりすると、タッチにのみ反応するはずのオブジェクトも、計算ベースのオブジェクトの変化する x 値を取得します。まったく異なる位置変数を使用するため、これがなぜなのかわかりません。 .
以下のコードは、タッチ位置の値が GL レンダラーに渡される方法を示す GLsurfaceView からの抜粋です。
public boolean onTouchEvent(MotionEvent e){
if(e != null){
if(e.getAction() == MotionEvent.ACTION_DOWN){
x = e.getX();
y = e.getY();
if(_renderer != null){
queueEvent(new Runnable(){
@Override
public void run() {
_renderer.touchInput(x, y);
}
});
return true;
}
}
if(e.getAction() == MotionEvent.ACTION_MOVE){
x = e.getX();
y = e.getY();
if(_renderer != null){
queueEvent(new Runnable(){
@Override
public void run() {
_renderer.touchInput(x, y);
}
});
}
}
ここに続くコードは、タッチ値がどのようにレンダラーに入り、ワールド座標に変換されるかを示す GL レンダラーからの抜粋です。
public void touchInput(float x, float y){
y = (float)_view[3] - y;
GLU.gluUnProject(x, y, -1.5f, _ModelMatrix, 0, _ProjectionMatrix, 0, _view, 0, touch_to_world_coords, 0);
_world_x = touch_to_world_coords[0] * touch_to_world_coords[3];
_world_y = touch_to_world_coords[1] * touch_to_world_coords[3];
}
次は、非接触オブジェクトの新しい位置を計算するコードです。
public void updateObjectCoords(){
_test_x += 0.05f;
_test_y += 0.05f;
}
最後に、ゲーム ループとして使用するレンダラーからの onDrawFrame です。
public void onDrawFrame(GL10 glContext) {
//Tell OpenGL to use this program when rendering.
GLES20.glUseProgram(_current_shaderProgramHandle);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
//Sets the active texture unit to texture unit 0
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
//Bind the texture to current unit
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, _TextureDataHandle);
//Tells texture uniform sampler to use this texture in the shader by binding it to unit 0
GLES20.glUniform1i(_TextureUniformHandle, 0);
//Draw square, gets coordinates from gluUnproject method
Matrix.setIdentityM(_ModelMatrix, 0);
Matrix.translateM(_ModelMatrix, 0, _world_x, _world_y, -1.0f);
drawSquare();
//Draw square, gets coordinates from updateObjectCoords method
Matrix.setIdentityM(_ModelMatrix, 0);
Matrix.translateM(_ModelMatrix, 0, _test_x, _test_y, -1.0f);
drawSquare();
//GLES20.glUseProgram(_point_shaderProgramHandle);
//drawLight();
updateObjectCoords();
}
編集:私の悪い説明に気づいたので、代わりにこれを追加して、いつ何が起こるかをより明確にします:)
(立方体 1 がタッチ入力を取得し、立方体 2 が updateObjectCoords から座標を取得する場合): アプリケーションの開始: すべてが期待どおりに機能し、立方体 2 (updateObjectCoords one) が期待どおりに移動します。ユーザーが画面に触れます: キューブ 2 は想定どおりに動き続けます。キューブ 1 (タッチ制御) の座標データはキューブ 2 と混ざっているように見えます。あまり反応しません。
(Cube2 は静的に作成されますが、updateObjectCoords は引き続きアクティブであり、_test_x と _test_y の値を更新するためにすべてのフレームで呼び出されます): アプリケーションの開始: すべてが期待どおり ユーザーが画面にタッチ: すべてが完全に機能
したがって、cube1 の配置を妨げているのは、cube2 の継続的な再配置であるように思われます。
これで問題がより明確になったことを願っています!:)
描画される 1 つのオブジェクトの座標が他のすべての translateM に影響するのはなぜですか? 他のすべてのオブジェクトがタッチ座標の影響を受けないのはなぜですか?