【问题标题】:Weird Behaviour when initiate a class上课时的奇怪行为
【发布时间】:2014-09-01 16:47:41
【问题描述】:

我正在开发一款游戏,我制作了所有的积木。现在我正在研究游戏逻辑和渲染。 我有一个抽象的 Monster 类和一个继承自它的名为 GreenMonster 的类。

现在奇怪的是,当我尝试初始化一个 GreenMonster 对象时。

当我这样做时:

private void initGreenMonsters()
    {
        for (int i = 0; i < greenMonsters.Length; i++)
        {
            greenMonsters[i] = new GreenMonster(new Point(0,40),new Size(40, 40));
        }
    }

一切都按照我的计划进行,我可以在表单上渲染图像。

但是当我尝试这样初始化时:

private void initGreenMonsters()
    {
        for (int i = 0; i < greenMonsters.Length; i++)
        {

            greenMonsters[i] = new GreenMonster();
            greenMonsters[i].Position = new Point(0, 40);
            greenMonsters[i].Size = new Size(40, 40);
        }
    }

我没有收到任何错误,应用程序运行,但我可以渲染怪物。

这是我用来绘制怪物的Monster类构造函数和Draw Method:

 public Monster(Point _startPosition,Size _size)
    {
        this.size = _size;
        this.position = _startPosition;
    }

 public virtual void Draw(Graphics g)
    {
        Rectangle monsterRec = new Rectangle(position, size);
        g.DrawImage(img, monsterRec);
    }

这是 GreenMonster 类的构造函数:

public GreenMonster(Point _startPosition, Size _size)
        : base(_startPosition, _size)
    {
        this.img = new Bitmap(SpaceInvadersGame.Properties.Resources.NormalMonster);
        this.hp = 1;
        this.speed = 1;
    }

public GreenMonster()
    {
        this.img = new Bitmap(SpaceInvadersGame.Properties.Resources.NormalMonster);
        this.hp = 1;
        this.speed = 1;
    }

唯一困扰我的是,当我同时查看初始化对象的两种方式时,它看起来都一样.. 我只是找不到两种方式之间的任何不同。 有人知道它有什么不同吗?

如果您需要更多代码以便问题更清楚,我很乐意添加!

这是 Monster 类及其属性 公共抽象类 Monster { 保护点位置; 公共点位置 { 获取 { 返回位置; } 设置 { 位置 = 值; } }

    protected Size size;
    public Size Size { get { return size; } set { value = size; } }

    public int speed;

    protected Bitmap img;

    protected int hp;
    public int HP { get { return hp; } }



    public void SetStartingPosition(int x, int y)
    {
        this.position = new Point(x, y);
    }


    public virtual void Draw(Graphics g)
    {
        Rectangle monsterRec = new Rectangle(position, size);
        g.DrawImage(img, monsterRec);
    }

}

【问题讨论】:

  • GreenMonster 必须有第二个构造函数,否则您的代码将无法编译。可以发一下吗?
  • 是的,我现在就添加它!
  • 那么 Position 和 Size 属性是什么?也许将您的代码发布为MCVE 会有所帮助。
  • 当大小为零或未定义时,基本构造函数Monster() 做了什么?也许它做了一些不幸的事情,Size setter 没有修复。
  • 您需要按照@nvoigt 的说明发布所有代码。似乎属性设置器存在问题。构造函数没问题。

标签: c# inheritance initialization


【解决方案1】:

您正在将传入值设置为当前大小,而不是将当前大小设置为传入值,方法如下:

public Size Size { get { return size; } set { value = size; } }

应该是

public Size Size { get { return size; } set { size = value; } }

Position 的代码看起来不错:

public Point Position { get { return position; } set { position = value; } }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2013-04-20
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多