[英]In C# XNA, how do I display my sprites in random places every time the game loads?
[英]How do I resize sprites in a C# XNA game based on window size?
我正在用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 ... 1},并且仅在渲染点应用窗口尺寸标量。
坐标的伪代码:
x' = x * screenResX
y' = y * screenResY
尺寸类似。 假设您有一个最初为1920x1080设计的32x32子画面,并且希望进行缩放,以使其适合屏幕上的相同逻辑空间(因此不会显得异常小):
r = 32 * screenResX' / screenResY
width' = width * r
height' = height * r
然后,用户设置的分辨率将无关紧要。
如果您担心这可能会影响性能,则可以在屏幕分辨率更改时执行上述操作,以进行一次性计算。 但是,您仍应始终保留原始视区{0 ... 1}。
在屏幕空间坐标上执行CD可以说效率更高
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.