我有一个名为Ball的类(用于pong项目),我需要通过Main Constructor传递Texture2D,如下所示:
Ball.cs
public class Ball
{
Texture2D _ballSprite;
private float _ballSpeed;
private Vector2 _ballMovement;
private Vector2 _ballPosition;
private const int WINDOW_WIDTH = 800;
private const int WINDOW_HEIGHT = 600;
public Ball(Texture2D sprite)
{
_ballSprite = sprite;
}
然后在主要 Game1.cs
Ball ball = new Ball();
我应该通过Main中的参数传递什么来显示Texture2D?
答案 0 :(得分:2)
您不应在构造函数中传递Texture2D
。在重置图形设备的情况下,游戏运行时,Texture2D
等图形资源可能会被丢弃。每次发生这种情况时,您都需要所有Texture2D
个对象的新实例。
因此,在XNA中,所有图形资源的内容加载都应该在LoadContent()
方法内完成。您的Game
课程会覆盖LoadContent()
方法。你可以在这里加载你的纹理:byBall.BallSprite = Content.Load<Texture2D>("balltexture");
(在这种情况下你需要公开BallSprite
属性)
或者您可以创建一个在Ball类
中加载的方法public void LoadContent(Content content)
{
_ballSprite = content.Load<Texture2D>("balltexture");
}
然后从覆盖myBall.LoadContent(Content)
类Game
方法中调用LoadContent()
。
请注意,Content
对象为ContentManager
,如果您多次加载相同的纹理,只需将该纹理加载到内存中一次(第一次加载调用)。对于所有后续调用,将返回相同的Texture2D
实例。
Game.LoadContent()
方法,并且每次重置图形设备(这可能在任何时候由于多种原因而发生)。因此,您需要注意LoadContent()
方法中的操作。例如,如果您尝试在Ball
内创建LoadContent()
类实例,则可以在游戏中期和_ballSpeed
,_ballMovement
的任何时间用新球实例替换该球实例, _ballPosition
值会丢失。