2015-02-10 2 views
0

(Будет ли это накладывать на это награду). Также я не уверен на 100%, какие теги имеют отношение к этому)Игроки, кажется, сталкиваются с воздухом?

Я невероятно путаюсь здесь. Я пытаюсь использовать эту (упрощенную) модель для моих лучников, чтобы столкнуться с: enter image description here

Однако, как вы можете видеть, мои лучники, кажется, сталкиваются в воздухе! Я бы понял, если они провалились (например, я не поставил достаточно «очков» в моей модели столкновения), но на самом деле, похоже, сталкивается с НИЧТО, абсолютно меня озадачивает.

Я загружаю модель на сервере с тем же кодом, который я показываю там на клиенте, так что это не может быть проблемой. В любом случае у меня есть 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, так и для точки, которая проверяется. Очевидно, что я повторяю все соседние координаты, так как мой игрок - это не просто одна точка.

Поскольку игрок, похоже, сталкивается с воздухом, то, очевидно, что-то не так. Но я не могу найти что.

Я нахожусь на правильном пути здесь, или я делаю все совершенно неправильно? И если я на правильном пути, то что здесь не так, и как я могу это исправить?

+0

Трудность в играх заключается в том, что тестирование и отладка - это в значительной степени ад. Однако ваш код обнаружения столкновений, однако, отделился от OpenGL, поэтому он может расплатиться, потратив некоторое усилие на настройку полигонов тестирования, которые вы можете просто запустить в консоли, и выполнить базовые модульные тесты кода, чтобы увидеть, при каких обстоятельствах код не делайте то, что вы ожидаете от этого. Это скучная работа, но это намного проще, чем необходимость отладки в текущей игре - тем более, что запущенная игра будет выплевывать бесконечные потоки отладочных номеров. – Gimby

ответ

2

У вас возникла проблема с вашей моделью. Использование трех массивов может спасти память, но также изменяет модель, создавая «тени», с которыми могут столкнуться ваши лучники.

Предположим, что у вас есть вершины в (1,1,1) и (2,2,2). Используя вашу модель, будет также вершина в (1,2,2) и любая другая комбинация, где все координаты либо 1 или 2.

Итак, вернемся к чертежной доске.

Возможно, вы можете сохранить память, используя один бит вместо 32-разрядного int для каждой координаты?

Или вы можете изменить способ хранения модели. Что делать, если вы используете 2-мерный массив int и сохраните z-координату (ы) пола. Это ограничило бы ваш мир одним (или несколькими) полами в каждой координате x, y, но сэкономит огромное количество памяти.

+0

Я не могу использовать двумерный массив, иначе игра выйдет из строя. К сожалению, для многомерных массивов нет возможности. Есть ли у вас другие рекомендуемые идеи о том, как я мог бы выполнить столкновение? – Joehot200

+0

Вы можете уменьшить разрешение модели. Или вы можете задать в http://gamedev.stackexchange.com/ для эффективного хранения памяти вашей модели. –

+0

Я не забочусь об эффективности памяти. Я забочусь об эффективности процессора. Если бы я как-то сделал тройной массив одной и той же вещи вместо 3-х массивов, это сработало бы? – Joehot200

Смежные вопросы