簡體   English   中英

用於控制PictureBox屬性的類(C#窗體)

[英]Class for controlling properties of the PictureBox (C# forms)

我正在嘗試編寫一些“干凈”的代碼...我現在想基於Forms制作一個Pong游戲。 我想將游戲很好地分為幾類。

我想要一個繼承自玩家類的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)
    {

    }
}

}

您在這里遇到問題:

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);
        }
    }   
}

您應該嘗試在播放器類中隔離圖片框,這會將表單和圖片框的功能分開...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM