Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#XNA 4.0相机变焦和精灵大小调整_C#_Xna_Xna 4.0_Game Development - Fatal编程技术网

c#XNA 4.0相机变焦和精灵大小调整

c#XNA 4.0相机变焦和精灵大小调整,c#,xna,xna-4.0,game-development,C#,Xna,Xna 4.0,Game Development,在我的项目中,我有一个精灵正在画一个盒子。我在单击一个键时使相机缩小。当我缩小时,我希望我的长方体缩放其尺寸,以便即使相机已缩小并“缩小”它,它仍保持一致 我尝试过将对象的尺寸乘以10%,这似乎是缩小时视点的调整,但这似乎不起作用。现在这听起来可能很愚蠢,但是在draw函数中缩放精灵是否也会改变精灵的尺寸 假设长方体为64x64像素。我缩小10%并缩放精灵。精灵是否仍具有64x64的边界,或者放大比例也会改变其尺寸?使用SpriteBatch.Draw()s scale参数将精灵缩小/放大,即6

在我的项目中,我有一个精灵正在画一个盒子。我在单击一个键时使相机缩小。当我缩小时,我希望我的长方体缩放其尺寸,以便即使相机已缩小并“缩小”它,它仍保持一致

我尝试过将对象的尺寸乘以10%,这似乎是缩小时视点的调整,但这似乎不起作用。现在这听起来可能很愚蠢,但是在draw函数中缩放精灵是否也会改变精灵的尺寸


假设长方体为64x64像素。我缩小10%并缩放精灵。精灵是否仍具有64x64的边界,或者放大比例也会改变其尺寸?

使用
SpriteBatch.Draw()
s scale参数将精灵缩小/放大,即64x64将显示为7x7像素(如果启用,外部像素将进行alpha混合)。但是,精灵上没有大小属性,如果您有自己的矩形,精灵的位置变量
SpriteBatch.Draw()
当然不会更改这些属性

另一种方法是在3D空间中绘制精灵,然后在移动相机时缩放所有对象,因此精灵将看起来更小,尽管它仍然是64x64精灵


如何在3D空间中绘制精灵?这里有一个很好的教程。(您需要花时间学习如何使用3D视口、相机等,请参见此处:

要更改精灵尺寸,您需要更改SpriteBatch.Draw的矩形参数。要计算矩形范围上的缩放:

Rectangle scaledRect = new Rectangle(originalRectangle.X, originalRectangle.Y, (int)(originalRectangle.Width*zoom), (int)(originalRectangle.Height*zoom)); // where zoom default is 1.0f
绘图时使用:

spriteBatch.Draw(Texture, scaledRect, Color.White);
现在我很抱歉这么假设,但我不知道你为什么这么做——我认为你做错了什么

您应该使用摄影机变换来缩小/放大。其操作如下:

var transform = Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0))* // camera position
                         Matrix.CreateRotationZ(_rotation)* // camera rotation, default 0
                         Matrix.CreateScale(new Vector3(Zoom, Zoom, 1))* // Zoom default 1
                         Matrix.CreateTranslation(
                             new Vector3(
                                 Device.Viewport.Width*0.5f,
                                 Device.Viewport.Height*0.5f, 0)); // Device from DeviceManager, center camera to given position
SpriteBatch.Begin( // SpriteBatch variable
            SpriteSortMode.BackToFront, // Sprite sort mode - not related
            BlendState.NonPremultiplied, // BelndState - not related
            null,
            null,
            null,
            null,
            transformation); // set camera tranformation
但是,它将改变精灵在精灵批处理中的显示方式-现在还必须考虑不同的鼠标坐标(如果使用鼠标输入)。为此,必须将鼠标位置转换为转换后的世界矩阵:

// mouse position, your tranformation matrix 
public Vector2 ViewToWorld(Vector2 pos, Matrix transform) 
{
    return Vector2.Transform(pos, Matrix.Invert(transform));
}
我在没有直接访问的情况下使用了代码来测试它,所以如果有什么东西不起作用,请随时询问


这并不是直接回答你的问题,如果你能提供为什么在缩放时需要重新调整精灵大小而不是缩放相机的原因-也许我可以更好地回答你的问题,你也应该暂停markmnl链接以了解世界变换以及在这种情况下为什么需要它。

注意:我已经尝试了通过spritebatch绘图进行校准,它不会改变精灵的尺寸。它只会改变其视觉比例。仍在寻求建议。我感谢您的帮助。我有一个摄像头点击框(rect)我用来确定是否渲染精灵。如果精灵的位置落在相机的点击框内,则绘制精灵。如果在外部,则不绘制精灵。该代码起作用。现在,当我通过应用矩阵缩小相机时,我希望保持相机的点击框与窗口的大小相同,因此我尝试增加点击框,但我可以我想我必须使用矩阵来增加相机的hitbox矩形?这是第一张图片。红色框是相机的hitbox。绿色方块是我在hitbox中绘制的精灵集合,灰色框是我在hitbox中绘制的精灵集合这是窗口。-----现在,当我缩小时,我希望相机的点击框保持与窗口(视点)相同的大小,但这不是因为我们正在缩小。--非常感谢你们!我通过使用ViewToWorld功能,输入视口宽度和高度,然后将相机的hitbox设置为X和Y的宽度和高度。再次感谢!感谢你们的时间和链接!