@Override
public void onDrawFrame(GL10 gl) {
float[] scratch = new float[16];
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
// Set the camera position (View matrix)
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
// Calculate the projection and view transformation
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
if(move_x) x=-tiltx/100;
else{
x=0;
if(side_x) {
if (tiltx < -0.1f) {
x = -tiltx / 100;
move_x = true;
}
}
if(!side_x) {
if (tiltx > 0.1f) {
x = -tiltx / 100;
move_x = true;
}
}
}
if(move_y) y=-tilty/100;
else{
y=0;
if(side_y){
if(tilty <-0.1f) {
y=-tilty/100;
move_y=true;
}
}
if(!side_y) {
if(tilty >0.1f) {
y = -tilty / 100;
move_y = true;
}
}
}
Часть выше проверяет, разрешено ли перемещение, если нет, присваивает 0 для перевода значения (x и y). Чем (ниже) перевод применяется, несмотря на значения 0 x или y, он перемещает объект немного дальше, и это приводит к тому, что объект заканчивается частично позади вида. Это также вызывает срабатывание
if (Math.abs(scratch[12])>=2.4 && move_x)
снова при возвращении, что означает воспроизведение звука снова.
Matrix.translateM(mBall.mModelMatrix, 0, (float)x*1f, (float)y*1f, 0f);
// Combine the rotation matrix with the projection and camera view
// Note that the mMVPMatrix factor *must be first* in order
// for the matrix multiplication product to be correct.
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mBall.mModelMatrix, 0);
if (Math.abs(scratch[12])>=2.4 && move_x){
setMyBoolean(true);
move_x=false;
if(scratch[12]<0) {
side_x=false;
scratch[12]=-(float)2.4;
}
else {
side_x=true;
scratch[12]=(float)2.4;
}
// true - prawa strona, false - lewa
}
if (Math.abs(scratch[13])>=1.8 && move_y){
move_y=false;
setMyBoolean(true);
if(scratch[13]<0){
side_y=true;
scratch[13]=-(float)1.8;
}
else {
side_y=false;
scratch[13]=(float)1.8;
}
// true - prawa strona, false - lewa
}
mBall.draw(scratch);
Приведенный выше код проверяет, попал ли объект в стену, блокирует ли он дальнейшее движение, воспроизводит ли звук с помощью setMyBoolean, и, что самое важное, устанавливает объект точно на стену, изменяя царапину [12] и 13 значений.
Как объяснено выше, в следующем цикле положение объекта вычисляется иначе (несмотря на то, что переменная перевода установлена на 0), и шар снова заканчивается в стене.
Стоит отметить, что он не меняет положение в следующих циклах. Он остается в стене до тех пор, пока я не наклоню телефон на другую сторону, не сработав, если это позволит объекту отойти от стены.