【问题标题】:Compare new Vector2 position with previous Vector2 position将新的 Vector2 位置与之前的 Vector2 位置进行比较
【发布时间】:2012-07-29 13:09:17
【问题描述】:

我正在尝试在游戏区域中放置不同的对象,例如网格,但是我的创建这些对象和位置的方法存在一些问题。我正在尝试将每个新位置存储在列表中,然后将每个新位置与列表中的位置进行比较,然后才能将其用作游戏区域网格中的新位置。我只想使用每个随机位置一次。帮助是preciated!谢谢!

也许有更好的方法来做到这一点?

public void AddItemsToGameArea(ContentManager content)
{
    foreach (string buildingPart in contentHouseOne)
    {
        Vector2 newPosition = NewRandomPosition;
        if (!checkPreviousPositions)
        {
            listHouseParts.Add(new HousePart(content, buildingPart, newPosition));
            listUsedPosition.Add(newPosition);
            checkPreviousPositions = true;
        }
        else
        {
            for (int i = 0; i < listUsedPosition.Count(); i++)
            {
                // Check?? 
            }

        }
    }
}

public Vector2 NewRandomPosition
{
    get
    {
        return new Vector2(gridPixels * Game1.random.Next(1, 8), gridPixels * Game1.random.Next(1, 8));
    }
}

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    我认为您应该考虑使用布尔数组来处理网格:

    bool occupiedPositions[columns, rows];
    

    所以,当你占据一个网格单元时,你可以这样做:

    occupiedPositons[i, j] = true;
    

    您还可以生成一个包含网格可用位置的列表,并从中随机获取位置并在执行时消除元素:

    List<Vector2> emptyCells;
    
    // fill it with your NewRandomPosition() contentHouseOne.Count times
    
    foreach (string buildingPart in contentHouseOne)
    {
        int positionIndex = random.Next(emptyCells.Count);
        Vector2 newPosition = emptyCells[positionIndex];
        emptyCells.RemoveAt(positionIndex);
    
        // do yout stuff using newPosition here
    }
    

    【讨论】:

    • 嗨!感谢您的回答!如果我使用occupPositons[i, j] = true;我必须先在循环中将所有网格位置设置为 false 吗?
    • C# 应该自动执行此操作,但请尝试一下,我不能确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多