1

我的主要问题是我不明白如何获取生成的图块的位置或如何判断鼠标的位置。我应该使用碰撞来检测鼠标还是其他东西?我可以做些什么来优化我的代码并使其更容易获得诸如位置之类的东西

我从我的代码中取出了一些东西,比如加载纹理只是为了让你们更短,因为这不是问题的一部分。

我的瓷砖生成代码

    public Block[] tiles = new Block[3];
    public int width, height;
    public int[,] index;
    public Rectangle tileRect;

public void Load(ContentManager content)
    {
        tiles[0] = new Block { Type = BlockType.Grass, Position = Vector2.Zero, texture = grass};
        tiles[1] = new Block { Type = BlockType.Dirt, Position = Vector2.Zero, texture = dirt};

        width = 50;
        height = 50;

        index = new int[width, height];

        Random rand = new Random();
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                index[x,y] = rand.Next(0,2);
            }
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                    spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
                        Color.White);          
            }
        }  
    }

块属性代码

public enum BlockType
{
    Dirt,
    Grass,
    Selection
}

public class Block
{
    public BlockType Type { get; set; }
    public Vector2 Position { get; set; }
    public Texture2D texture { get; set; }
}
4

2 回答 2

1

这段代码应该可以解决问题。您可以在切片生成类中添加此方法。(未经测试)

public bool IsMouseInsideTile(int x, int y)
{
    MouseState MS = Mouse.GetState();
    return (MS.X >= x * 64 && MS.X <= (x + 1) * 64 &&
        MS.Y >= y * 64 && MS.Y <= (y + 1) * 64);
}

您可以根据自己的需要编辑此功能。

编辑: 我会稍微解释一下这段代码。

  • Mouse.GetState()获取鼠标的当前位置,作为Vector2

  • 正如您的绘图方法所说,一个瓷砖[a ,b]在该位置[a * 64, b * 64]

  • 瓦片的最大 x 和 y 坐标位于[(a + 1) * 64, (b + 1) * 64],因为纹理64 by 64 pixels具有尺寸。

  • 我检查鼠标是否在每个瓷砖内。如果您愿意,可以添加 MouseHover 事件。

更多编辑: 根据您的评论编辑了我的代码。

更多编辑: 这是 Draw 方法的代码:

public void Draw(SpriteBatch spriteBatch)
    {
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                    spriteBatch.Draw(tiles[index[x,y]].texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
                        Color.White);
                    if(IsMouseInsideTile(x, y))
                        spriteBatch.Draw(selected.texture, tileRect = new Rectangle(x * 64, y * 64, 64, 64), 
                                        Color.White);
            }
        }  
    }
于 2012-03-29T14:03:02.897 回答
1

在 XNA 更新函数中,您可以使用 Mouse.GetState() 获取鼠标位置,这将为您提供鼠标的 X 和 Y 坐标属性。只需将它们除以您的瓷砖大小并向下取整(地板)即可获得最接近的瓷砖坐标索引。

添加代码

public static Vector2 GetGridCoordinates(MouseState mouseState, int gridSize){
    return new Vector2(
        (int)Math.Floor(mouseState.X / gridSize),
        (int)Math.Floor(mouseState.Y / gridSize)
    );
}

您甚至可以将其作为 MouseState 类的扩展函数,因此您所要做的就是:

Vector2 gridCoords = Mouse.GetState().GetGridCoordinates(MyGridSize);

不过我大概是想多了...

于 2012-03-29T08:08:55.077 回答