1

我有一个基本的按钮类,当鼠标悬停在按钮上时它会发光并适用于我的主菜单。但是,使用暂停功能,我的 x 值将一直不同。我有一个相机类,它改变视口并根据玩家的位置滚动。这一切都很好。然而,当我引入暂停选项时,绘制的“按钮”被正确放置,但是用于鼠标检测的矩形距离它有一段距离。

replay.SetPosition(new Vector2(camera.viewport.Width / 4 + 50,camera.centre.Y));
//replay.SetPosition(new Vector2((int)camera.centre.X , (int)camera.centre.Y);
replay.Update(mouse);

被注释掉的人正确地绘制了图像,但矩形偏离了。未注释的版本具有正确的矩形位置,但图像当前保持在 200(x),250(y)

if (isPaused)
{
    spriteBatch.Draw(pauseTexture,pauseRectangle, Color.White);
    //replay.Draw(spriteBatch);
    exit.Draw(spriteBatch);
    mainmenu.Draw(spriteBatch);
}

相机类更新元素:

public void Update(Vector2 position, int xOffset, int yOffset)
{
    if (position.X < viewport.Width / 4)
        centre.X = viewport.Width / 4;
    else if (position.X > xOffset - (viewport.Width / 4))
        centre.X = xOffset - (viewport.Width / 4);
    else centre.X = position.X;
}

如果需要,我将在一天的大部分时间里添加信息。感谢所有的帮助!

4

1 回答 1

0

不幸的是,我还没有足够的代表发表评论,所以根据给出的信息,我会尽力回答。

听起来您的菜单项的矩形和位置没有一起更新。假设您的位置为 (0,0),矩形为 (0, 0, 100, 100) - (x, y, width, height),因此矩形从 (0, 0) 延伸到 (100, 100 )。例如,如果将位置更新为 (100, 100),则还必须将矩形的 x 和 y 坐标更新为 (100, 100),因此矩形现在从 (100, 100) 延伸到 (200, 200) .

我没有从您的代码示例中获得足够的信息来告诉您哪里出了问题,但据我所知,这就是正在发生的事情。

另一方面..如果您将相机的转换矩阵传递给SpriteBatch.Begin(...)并且您还在该SpriteBatch.Begin...End部分中对您的HUD元素进行绘制调用,您应该考虑在没有传入相机的转换矩阵的情况下制作另一个SpriteBatch.Begin...End部分。这样您的HUD元素' 与世界坐标相比,位置将位于屏幕坐标中,您不会遇到这样的问题。HUD 元素通常不会改变位置,除非您当然允许它们,但与世界坐标相比,您仍将在屏幕坐标中工作。

示例:(请记住,我不记得参数的确切用途SpriteBatch.Begin(...),但这应该会有所帮助)

//Main Draw function
public void Draw() {
    //World Coordinates
    spriteBatch.Begin(cameraTransformationMatrix);
    //Draw all world coordinate objects
    //Player, Enemies, Walls, etc.
    spriteBatch.End();

    //Screen Coordinates
    spriteBatch.Begin();
    //Draw all screen coordinate objects
    //Menus, In-Game HUD elements, etc.
    spriteBatch.End();
}
于 2013-04-10T15:58:07.763 回答