问题描述 投票:0回答:1

我试图将我的游戏世界划分为扇形瓦片,并根据玩家对象的位置确定玩家对象所在的瓦片。并根据玩家对象的位置确定玩家对象所在的瓦片,我没有限制世界的大小,所以世界可以是任何大小。瓦片的大小是确定的,而且是恒定的。所以,整个世界被分割成给定尺寸的正方形瓷砖。

例子: 如果我把我的世界分成大小相等的正方形瓷砖,比如说300x300,如果玩家在(0,0)到(300,300)的位置内,瓷砖数量应该是(0,0)。

  • 如果玩家在(0,0)到(300,300)的位置内,瓷砖的数量应该是(0,0)
  • 如果玩家在(0,0)到(300,-300)的位置内,牌号应该是(0,-1)
  • 如果玩家在(-300,0)到(-600,300)的位置内,牌号应该是(-2,-0)

更多的输入和输出示例。

  • 玩家的位置是(10,10), 牌号应该是(0,0)

  • 玩家位置是(-10,10),牌号应该是(-1,0)

  • 玩家位置是(10,-10),牌号应该是(0,-1)

  • 玩家的位置是(-10,-10),牌号应该是(-1,-1)

  • 玩家位置是(1,1),牌号应该是(0,0)

  • 玩家位置是(1,-1),牌号应该是(0,-1)

  • 玩家位置是(-1,1),牌号应该是(-1,0)

  • 玩家位置是(-1,-1),牌号应该是(-1,-1)

  • 玩家位置是(-450,100),牌号应该是(-2,0)

  • 玩家位置是(450,100),牌号应该是(1,0)

  • 玩家位置是(-450,-100),牌号应该是(-2,-1)

  • 玩家位置是(450,-100),牌号应该是(1,-1)

我有下面的代码,似乎只有在XZ为正值时才能正常工作。一旦它是在XZ的负边,我不知道如何计算位置。

public static Sector GetCurrentSector(Vector3 p_position)
{
    int x = Mathf.FloorToInt(p_position.x / cellSize);
    int z = Mathf.FloorToInt(p_position.z / cellSize);

    return new Sector(x, z);
}

我检查了下面的问题,似乎和我的问题有关。

注:我也不知道这个问题叫什么! 所以,这让我搜索起来非常困难。我的搜索让我找到了多处与圆、半径、圆内点等有关的地方。

c# unity3d 2d coordinates tiles
1个回答
0
投票

我建议你使用int而不是FloorToInt,并且使用整数除法。

public static Sector GetCurrentSector(Vector3 p_position)
{
    int x = (int)p_position.x / (int)cellSize;
    int z = (int)p_position.z / (int)cellSize;

    return new Sector(x, z);
}

我的答案是不正确的, 你的方法是正确的 使用matf.FloorInt是更好的整数除法来计算负数.

© www.soinside.com 2019 - 2024. All rights reserved.