XNA将Texture2D添加到主构造函数

时间:2016-09-09 02:56:15

标签: c# xna

我有一个名为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?

1 个答案:

答案 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实例。

在第一次更新之前XNA调用

Game.LoadContent()方法,并且每次重置图形设备(这可能在任何时候由于多种原因而发生)。因此,您需要注意LoadContent()方法中的操作。例如,如果您尝试在Ball内创建LoadContent()类实例,则可以在游戏中期和_ballSpeed_ballMovement的任何时间用新球实例替换该球实例, _ballPosition值会丢失。