用于控制PictureBox属性的类(C#表单)

时间:2016-10-14 10:06:37

标签: c# forms class

我正在尝试用“干净”的代码写一些东西...我想制作一个Pong游戏,现在基于Forms。 我想把游戏很好地分成几类。

我想要一个球类,AI继承自玩家类,我想使用预制的Form类来设置主要的Form属性(宽度等)。

我这样做了一个播放器类,我想问你是否有命名,吸气和设置的方法和一般的想法是正确的。不是某些位(如果不是全部的话)相当多余或写得不好,我不希望将整个“项目”建立在错误的假设上,并在整个代码中加倍相同的错误。

namespace Pong
{
   public class Player
    {
        protected PictureBox PaddleBox { get; set; }
        protected Size PlayerSize
        {
            get
            {
                return PlayerSize;
            }
            set
            {
                if (PlayerSize.Height > 0 && PlayerSize.Width > 0)
                {

                    PlayerSize = new Size(value.Width, value.Height);
                    PaddleBox.Size = PlayerSize;
                }

            }


        }
        protected Point Location
        {
            get
            {
            return Location;
        }
        set
        {
          PaddleBox.Location = new Point(value.X, value.Y);
        }


    }
    protected Color BackColor
    {
        get
        {
            return BackColor;
        }
        set
        {
            PaddleBox.BackColor = value;

        }
    }
    public Player()
    {

        PaddleBox = new PictureBox();

    }
}

}

FORM类现在看起来像这样,也许我应该在构造函数中传递大小,位置和颜色等参数?哪个最好?

namespace Pong
{
    public partial class Form1 : Form
    {
        public Timer gameTime;
        const int screenWidth = 1248;
        const int screenHeight = 720;

        public Form1()
        {

            InitializeComponent();
            this.Height= screenHeight;
            this.Width=screenWidth;
            this.StartPosition=FormStartPosition.CenterScreen;
            Player player = new Player();
            player.PaddleBox.Size = new Size(20, 50);
            player.PaddleBox.Location = new Point(player.PaddleBox.Width / 2, ClientSize.Height/2-player.PaddleBox.Height/2);
            player.PaddleBox.BackColor = Color.Blue;
            this.Controls.Add(player.PaddleBox);
        gameTime = new Timer();
        gameTime.Enabled = true;



    }

    void gameTime_Tick(object sender, EventArgs e)
    {



    }
    private void Form1_Load(object sender, EventArgs e)
    {

    }
}

}

1 个答案:

答案 0 :(得分:0)

你有一个问题:

protected Point Location
{
    get
    {
        return Location;   // <--- this is a circular reference..
                           //      meaning, it will recall this getter again.

    }
    set
    {
        PaddleBox.Location = new Point(value.X, value.Y);
    }
}

改为使用:

protected Point Location
{
    get
    {
        return PaddleBox.Location;
    }
    set
    {
        PaddleBox.Location = value;
    }
}

protected Color BackColor

相同

以下是一个示例,我将如何实现它(以您当前的编程风格(由记事本提供))

namespace Pong
{
    public partial class Form1 : Form
    {
        public Timer gameTime;
        const int screenWidth = 1248;
        const int screenHeight = 720;

        public Form1()
        {

            InitializeComponent();
            this.Height= screenHeight;
            this.Width=screenWidth;
            this.StartPosition=FormStartPosition.CenterScreen;

            Player player = new Player(this);
            player.PlayerSize = new Size(20, 50);
            player.Location = new Point(player.PaddleBox.Width / 2, ClientSize.Height/2-player.PaddleBox.Height/2); // <-- the location is always the upperleft point. don't do this...
            player.BackColor = Color.Blue;

            gameTime = new Timer();
            gameTime.Enabled = true;
        }

        private void gameTime_Tick(object sender, EventArgs e)
        {

        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }

    public class Player
    {
        private PictureBox _paddleBox;

        protected Size PlayerSize
        {
            get
            {
                return _paddleBox.Size;
            }
            set
            {
                if (PlayerSize.Height == 0 || PlayerSize.Width == 0)
                    throw new ArgumentException("Size must be greater than 0");

                _paddleBox.Size = value;
            }
        }

        protected Point Location
        {
            get { return PaddleBox.Location; }
            set { PaddleBox.Location = value; }
        }

        protected Color BackColor
        {
            get { return PaddleBox.BackColor; }
            set { PaddleBox.BackColor = value; }
        }

        public Player(Form form)
        {
            PaddleBox = new PictureBox();
            form.Controls.Add(PaddleBox);
        }
    }   
}

您应该尝试隔离播放器类中的图片框,这将分离表单和图片框的功能......