@Volsash

Как переместить «камеру» в сторону её направления для установки блоков?

Всех приветствую. Я очень очень редко спрашиваю что-либо на форумах, однако сегодня исключение.

Я решил чисто позабавится и написать свой клон майна. Вопросы "зачем писать на устаревшем 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;
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы