在比赛屏幕XNA之前的倒计时期间未画出的玩家

时间:2014-04-16 23:00:33

标签: c# oop inheritance xna

基本上我在我的游戏中实施了继承之前,引入了2个新类,玩家和敌人(不使用敌人的atm),在倒计时屏幕(水平倒计时)之前加载并绘制了水平(包括玩家桨)开始)。

现在,当我在游戏中实现了继承性时,所有级别都被从玩家桨中拉开,继承自名为Paddle的类,其中Player和Enemy类是派生类。我已经尝试在播放器类中从基类/ paddle类重写draw方法,然后在基类中使用draw方法。

也许这与绘制方法无关,但我所知道的是,在倒计时画面期间玩家不会被绘制,但当倒计时屏幕完成时,玩家将被抽出。这似乎是一个小问题或变化,但它真的很令人沮丧,因为我无法解决造成这种情况的原因。

相关代码如下:

来自播放器类的

代码

//constructor
public Player(PlayerIndex newID, Texture2D newTexture, Vector2 newPosition, Viewport theViewport, Color newColour)
        : base(newTexture, newPosition, theViewport, newColour)


public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(pTexture, pPosition, pRectangle, pColour);
        //base.Draw(gameTime, spriteBatch);
    }
来自划桨类的

代码

//constructor
public Paddle(Texture2D newTexture, Vector2 newPosition, Viewport theViewport, Color newColour)
    {
        pTexture = newTexture;
        pPosition = newPosition;

        //theres more code here but it's assigning parameter values to properties in this class
    }

public virtual void Update(GameTime gameTime)
    {                        
        pRectangle = new Rectangle((int)pPosition.X, (int)pPosition.Y, pWidth, pHeight);            

    }

    public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(pTexture, pPosition, pRectangle, pColour);
    }
来自game1类的

代码

public void DrawPreGameCountdownScreen(GameTime gameTime)
    {         
        DrawPlayingGameScreen(gameTime);

        //more code here but it's irrelevent....
    }


public void DrawPlayingGameScreen(GameTime gameTime)
    {

        DrawBlocks(gameTime);
        player1.Draw(gameTime, spriteBatch);

        //more code here... but irrelevent to this...

    }

播放器1显然是播放器,它的类型是播放器,而不是Paddle(因为我已经将Paddle类抽象化了......因为我不想直接创建Paddle对象)

我已将Paddle类中的所有属性也保护为。

我也在使用游戏状态来区分游戏中的不同点,因此在倒计时屏幕的更新方法中,它基本上会减少计时器的值,然后在此之前检查计时器不是0,否则国家改变了。

正如我所说,这之前完美无缺,所以我认为它与玩家类有关,或者我做错了。

如果您需要更多信息,请随时询问和任何想法/解决方案等,请告诉我:)。

非常感谢您提供的帮助。

1 个答案:

答案 0 :(得分:1)

在paddle的Update函数中初始化pRectangle成员(在绘图中使用)。如果此成员未在其他位置初始化(到起始位置),则可能在倒计时期间绘制零大小的矩形,因此不会出现。

您不仅仅获得异常的原因是Rectangle是一个结构,因此除非您将其声明为Rectangle?,否则不能为空。而是将其成员初始化为默认值(数字类型为0)。

调试时的一般建议:

  1. 检查以确保相关代码实际调用。设置断点并确保它被击中。
  2. 如果是,检查断点处的数据是否正确。未初始化的值类型确实可以咬你,所以如果看起来你得到一堆默认值,请检查它们。