我正在用C#和XNA 4.0制作游戏。它使用多个对象(例如玩家角色,敌人,平台等),每个对象都有自己的纹理和命中框。使用类似于以下内容的代码创建和绘制对象:
class Object
{
Texture2D m_texture;
Rectangle m_hitbox;
public Object(Texture2D texture, Vector2 position)
{
m_texture = texture;
m_hitbox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, m_hitbox, Color.White);
}
}
一切正常,但我也想让玩家调整游戏窗口的大小。主游戏类使用以下代码:
private void Update(GameTime gameTime)
{
if (playerChangedWindowSize == true)
{
graphics.PreferredBackBufferHeight = newHeight;
graphics.PreferredBackBufferWidth = newWidth;
graphics.ApplyChanges();
}
}
每当窗口大小发生变化时,这将不可避免地导致对象的位置和命中框变得不准确。我是否有一种简单的方法可以根据新的窗口大小更改位置和命中框?如果新的窗口宽度是之前的两倍,我可能只是将每个对象的hitbox的宽度加倍,但我确信这是一种可怕的方法。
答案 0 :(得分:0)
考虑将坐标系规范化为查看空间 {0 ... 1},并仅在渲染点应用窗口尺寸标量。
坐标的伪代码:
x' = x * screenResX
y' = y * screenResY
类似尺寸。假设您有一个最初为1920x1080设计的32x32精灵,并且希望进行缩放以使其适合屏幕上的相同逻辑空间(因此它看起来不会非常小):
r = 32 * screenResX' / screenResY
width' = width * r
height' = height * r
然后用户设置的分辨率无关紧要。
如果您担心这可能造成的性能,那么您可以在屏幕分辨率更改时执行上述操作,以进行一次性计算。但是,您仍应始终保留原始视图空间{0 ... 1}。
在屏幕空间坐标上执行CD可能更有效率
希望这有帮助