Я работаю над своей игрой на Android, использую развивающую 2D-игру OpenGL, работающую на устройстве 320x480, работало. (Нет поломок)
К сожалению, проблема с моей защитой Motorola (480x854), похоже на настройку UVточечный объект с разницей в 1 пиксель (отклонение на 1 пиксель вверх или вниз).
SurfaceChanged, ширина возврата 320, высота 569 AndroidManifest anyDensity устанавливает значение false
Ниже двух изображений имеют два прямоугольника, слеваодин - исходное изображение (w = 36, h = 35), без кадрирования;средний - клип по uv, рисование от px1 и обрезка только шириной 34px, высотой 33px, правый один очень длинный прямоугольник, рисование сверху вниз от px0 до px480 шириной 34px, высота 1px, извините за виртуальный код, но вы знаете, что я имею в виду,
Моя предыдущая игра написана в SurfaceView, работала с размерами 320x480, 480x800, 480x854 и 1024x768.
Картинка выглядит как работа, ширина заполнена, но снизу больше всего пусто.
Если я вставлю ш = 320;ч = 480;до GLUgluOrtho2D в SurfaceChanged, некоторые объекты работают (которые не используют кадрирование УФ)
http://i1105.photobucket.com/albums/h355/ch_mac/device_str5.png
Результат, который я хотел бы:
http://i1105.photobucket.com/albums/h355/ch_mac/device_str6.png
Мой метод рисования текстуры:
public void draw(int from_x,int from_y,int w,int h,int pos_x,int pos_y)
{
bind();
float texW=(float)mPow2Width;
float texH=(float)mPow2Height;
float minU= from_x/texW;
float maxU = (from_x+w)/texW;
float minV= from_y/texH;
float maxV = (from_y+h)/texH;
float verticleBuffer[] = {
x, y,
x+w, y,
x, y+h,
x+w, y+h,
};
float coordBuffer[] = {
minU, minV,
maxU, minV,
minU, maxV,
maxU, maxV,
};
FloatBuffer m_vertexBuffer;
FloatBuffer m_textureBuffer;
ByteBuffer l_byteBuf;
l_byteBuf = ByteBuffer.allocateDirect( verticleBuffer.length * 4 );
l_byteBuf.order( ByteOrder.nativeOrder() );
m_vertexBuffer = l_byteBuf.asFloatBuffer();
m_vertexBuffer.put( verticleBuffer );
m_vertexBuffer.position( 0 );
l_byteBuf = ByteBuffer.allocateDirect( coordBuffer.length * 4 );
l_byteBuf.clear();
l_byteBuf.order( ByteOrder.nativeOrder() );
m_textureBuffer = l_byteBuf.asFloatBuffer();
m_textureBuffer.put( coordBuffer );
m_textureBuffer.position( 0 );
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_textureBuffer);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, m_vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
}
SurfaceChanged:
public void onSurfaceChanged(GL10 gl, int w, int h)
{
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
float aspect_w=(float)h/(float)w;
float aspect_h=(float)w/(float)h;
//w=320;
//h=480;
GLU.gluOrtho2D(gl, 0, w, h, 0);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}