Всех приветствую. Я очень очень редко спрашиваю что-либо на форумах, однако сегодня исключение.
Я решил чисто позабавится и написать свой клон майна. Вопросы "зачем писать на устаревшем OpenGL 1.x, на Си, да и ещё клон игры". А я Вам отвечу, что чисто забавы ради. Не спрашивайте.
И вроде всё шло гладко, пока я не добрался до системы ставки/уничтожения блоков. Замечательно
списывая с интернета написав код, он не работал. Я начал пытаться его исправить, гуглил только куда можно. Но нигде не смог найти чего-то подходящего для меня. Если кому не сложно, не могли бы что-то написать по этому поводу?
Блоки хранятся очень просто, в переменной world. Например, "world[2][3][1][15][203] = 2;" поставит блок травы(ID 2) в чанк 2 по X, в чанк 3 по Y, и в координаты 1x, 15y, 203z в этом чанке.
Координаты камеры хранятся в camera.x, camera.y, camera.z. Угол поворота - camera.Xrot, camera.Zrot
Вот этот г*внокод
списанный написанный мной, добавил комментарии:
case WM_RBUTTONDOWN:
if(camera.x < 0 || camera.x >= 256 || camera.y < 0 || camera.y >= 256 || camera.z < 0 || camera.z >= 256) break; // сделал чтобы не выходили за границы массива
float x = camera.x;
float y = camera.y;
float z = camera.z + 1.7; // прибавляю + 1,7 чтобы было из глаз персонажа
int X, Y, Z, oldX, oldY, oldZ;
int dist = 0;
while(dist < 4) // ограничение дальности, где можно ставить блоки
{
dist++;
x += sin(camera.Zrot/180*M_PI); // Самые важные три строчки, но поскольку я ничего не понимаю в тригонометрии, скорее всего тут написан какой-то бред. Простите.
y += cos(camera.Xrot/180*M_PI);
z += tan(camera.Xrot/180*M_PI);
int chunkx = x / 16;
int chunky = y / 16; // узнаю координаты чанка
int dcx = 16*chunkx;
int dcy = 16*chunky;
X = x - dcx;
Y = y - dcy;
Z = z; // узнаю координаты именно для чанка
if(world[chunkx][chunky][X][Y][Z] != 0) // если столкнулись с предметом
{
world[chunkx][chunky][X][Y][Z] = 0; // убираем блок
break;
}
oldX=X; oldY = Y; oldZ = Z; // записываем старые коорды(чтобы потом добавить возможность ставить блоки, а так тут пока не используются)
}
break;