2015-02-10 61 views
0

(我将不会百分之百地确定这个标签是否与此相关)球员似乎与空气相撞?

我在这里令人难以置信的困惑。我试图使用这个(简化)模型让我的弓箭手碰撞: 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是弓箭手X,Y和Z的Vector3f相对于船的位置 - 我已经使用de-bug消息检查过了,位置确实正确地返回。

正如您所看到的,如果在被检查的点的X,Y和Z位置都有一个坐标,则变量i仅被设置为1。显然,我也遍历所有附近的坐标,因为我的球员不只是一个单一的点。

由于玩家似乎与空气发生碰撞,所以显然有些问题。但我找不到什么。

我在这里的正确轨道上,还是我做的一切都完全错误?如果我在正确的轨道上,那么这里出了什么问题,我该如何解决它?

+0

游戏的难点在于测试和调试是非常地狱。然而,你的碰撞检测代码与OpenGL是完全分离的,所以它可以花费一些努力来设置一个测试理由,你可以在控制台中运行,并对代码进行基本的单元测试,看看在哪些情况下代码不会做你期望的事情。这是无聊的工作,但比在运行游戏中进行调试要容易得多 - 尤其是因为运行的游戏将会传播无数的调试数字。 – Gimby 2015-02-10 12:56:19

回答

2

您的模型存在问题。使用三个阵列可以节省内存,但它也会改变模型,创建弓箭手可以碰撞的“阴影”。

假设您有(1,1,1)和(2,2,2)中的顶点。 使用你的模型,在(1,2,2)和其他所有坐标为1或2的任何其他组合处也将有一个顶点。

所以,回到绘图板。

也许你可以通过使用一位而不是32位int为每个坐标节省内存?

或者你可以改变你存储模型的方式。如果使用int的二维数组并存储地板的z坐标,那该怎么办?这会将你的世界限制在每个x,y坐标的一个(或几个)楼层,但会节省大量的内存。

+0

我无法使用二维数组,否则游戏崩溃。不幸的是,多维数组无法应用。你有没有其他推荐的想法可以实现碰撞? – Joehot200 2015-02-10 15:26:29

+0

您可以降低模型的分辨率。或者你可以在http://gamedev.stackexchange.com/中寻求一种存储模式的高效内存方式。 – 2015-02-10 15:35:43

+0

我不在乎记忆效率。我关心CPU的高效率。如果我以某种方式做了一个相同的事情,而不是3阵列的三重阵列,那会工作吗? – Joehot200 2015-02-10 16:02:30