Я отвечаю сам, потому что я не могу опубликовать более 2 ссылок (поскольку я новичок), и я не могу публиковать ЛЮБЫЕ изображения.
Я сделал несколько тестов:
для 100x100 он работает хорошо, для 150x150 тоже, для 200x200 он опускается прямо на землю, а для 500x500 это полностью катастрофа:
http://imgur.com/msAx4l&EJ9Qw&iKXFZ&ybFt0
(4 экрана в галерее)
Хорошо, я думал о решении, которое не требует какой-либо проверки, а только некоторых математических уравнений.
Например, в моей другой игре (написанной давным-давно) с плитками squre, а не с бриллиантами, очень просто определить индексы нарисованных плиток. Это выглядит так:
http://i.imgur.com/y9KUv.png
Процедура рисования для него:
//CameraXposition and CameraYposition is position of left-top corner of camera on map.
//Single tile height and width is 100, so if CameraXposition is 1456, then I start drawing from
//tile with index of 14 ((int)(1456/100) == 14).
//CAMERA_WIDTH is 800 and CAMERA_HEIGHT is 600 (screen resolution).
for(int x = (int)CameraXposition/100; x < ((CameraXposition+CAMERA_WIDTH)/100); ++x)
{
for(int y = (int)CameraYposition/100; y < ((CameraYposition+CAMERA_HEIGHT)/100); y++)
{
//Draw(tiles[x][y]);
}
}
Здесь, в изометрическом виде, не все так просто, но я не знаю, как определить это начальные индексы и диапазоны плиток.
Вот мой текущий код для рисования:
void GraphicEngine::Render(Map &m)
{
//camX and camY isn't coordinates of camera, they are coordinates of
//starting point (everything is drawed according to that point)
//it changes as I move mouse.
//zoomFactor is basically a zoom variable, it's float and its minimum is 0.5 and maximum is 1.5.
//It changes as I scroll my mousewheel. The smaller it is, the smaller is everything that's drawed,
//so more tiles can be drawed on screen (becouse they are smaller)
//Not very good, but works.
glTranslatef(camX*zoomFactor, camY*zoomFactor, 0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glBegin(GL_QUADS);
for(int i = 0; i < m.get_width(); ++i)
{
for(int j = m.get_height()-1; j>=0; --j)
{
glTexCoord2f(0, 0);
glVertex3f((m.get_fields()[i][j]->get_pX()-30)*zoomFactor, (m.get_fields()[i][j]->get_pY()+15)*zoomFactor, 0);
glTexCoord2f(1, 0);
glVertex3f((m.get_fields()[i][j]->get_pX())*zoomFactor, (m.get_fields()[i][j]->get_pY())*zoomFactor, 0);
glTexCoord2f(1, 1);
glVertex3f((m.get_fields()[i][j]->get_pX()+30)*zoomFactor, (m.get_fields()[i][j]->get_pY()+15)*zoomFactor, 0);
glTexCoord2f(0, 1);
glVertex3f((m.get_fields()[i][j]->get_pX())*zoomFactor,( m.get_fields()[i][j]->get_pY()+30)*zoomFactor, 0);
}
}
glEnd();
glLoadIdentity();
}