(Будет ли это накладывать на это награду). Также я не уверен на 100%, какие теги имеют отношение к этому)Игроки, кажется, сталкиваются с воздухом?
Я невероятно путаюсь здесь. Я пытаюсь использовать эту (упрощенную) модель для моих лучников, чтобы столкнуться с:
Однако, как вы можете видеть, мои лучники, кажется, сталкиваются в воздухе! Я бы понял, если они провалились (например, я не поставил достаточно «очков» в моей модели столкновения), но на самом деле, похоже, сталкивается с НИЧТО, абсолютно меня озадачивает.
Я загружаю модель на сервере с тем же кодом, который я показываю там на клиенте, так что это не может быть проблемой. В любом случае у меня есть pastebinned it here.
Затем я добавляю его к трем int[]
массивов, например:
coordsx = new int[80 * 10];
coordsy = new int[80 * 10];
coordsz = new int[80 * 10];
for (javax.vecmath.Vector3f vec : m.getVertices()){ //Quick note: M is a model. As you can see, I'm just going through all the vertex positions.
coordsx[DELTA+(int) vec.x] = 1;
coordsy[DELTA+(int) vec.y] = 1;
coordsz[DELTA+(int) vec.z] = 1;
}
Краткое примечание: DELTA это значение ((80 * 10)/2)
или сохранить вам математику, 400
. Кроме того, я использовал три int[]
, а не int[][][]
, потому что int[][][]
вызвал OutOfMemory
, который я не мог исправить.
Теперь, когда я получил эти массивы координат, я использую этот код, чтобы проверить его:
for (int x = (int) (location.x + 1); x > location.x - 1; x--){
for (int y = (int) (location.y + 1); y > location.y - 1; y--){
for (int z = (int) (location.z + 1); z > location.z - 1; z--){
distancex = x;
distancez = z;
distancey = y;
try{
int i = 0;
if (owner.type == 0){
if (GameServer.DELTA + distancex > 0 && GameServer.DELTA + distancex < 800 && GameServer.coordsx[(int) (GameServer.DELTA + distancex)] == 1){
if (GameServer.DELTA + distancey > 0 && GameServer.DELTA + distancey < 800 && GameServer.coordsy[(int) (GameServer.DELTA + distancey)] == 1){
if (GameServer.DELTA + distancez > 0 && GameServer.DELTA + distancez < 800 && GameServer.coordsz[(int) (GameServer.DELTA + distancez)] == 1){
i = 1;
}
}
}
}
if (i == 1){
collision = true;
YDown = 0;
}
}catch (ArrayIndexOutOfBoundsException e1){
e1.printStackTrace();
}
}
}
}
if (collision){
System.out.println("Collision!");
}else{
System.out.println("No Collision!");
location.y = location.y-=YDown;
}
location
является Vector3f
Х лучников, Y и Z по отношению к местоположение судна - Я проверил это, используя сообщения об ошибке, и местоположение действительно верно возвращается.
Как вы можете видеть, переменная i
устанавливается только в 1, если есть координата как для определения местоположения X, Y, так и для точки, которая проверяется. Очевидно, что я повторяю все соседние координаты, так как мой игрок - это не просто одна точка.
Поскольку игрок, похоже, сталкивается с воздухом, то, очевидно, что-то не так. Но я не могу найти что.
Я нахожусь на правильном пути здесь, или я делаю все совершенно неправильно? И если я на правильном пути, то что здесь не так, и как я могу это исправить?
Трудность в играх заключается в том, что тестирование и отладка - это в значительной степени ад. Однако ваш код обнаружения столкновений, однако, отделился от OpenGL, поэтому он может расплатиться, потратив некоторое усилие на настройку полигонов тестирования, которые вы можете просто запустить в консоли, и выполнить базовые модульные тесты кода, чтобы увидеть, при каких обстоятельствах код не делайте то, что вы ожидаете от этого. Это скучная работа, но это намного проще, чем необходимость отладки в текущей игре - тем более, что запущенная игра будет выплевывать бесконечные потоки отладочных номеров. – Gimby