Diskuze: Pohyb objektů po PictureBoxu

C# .NET .NET (C# a Visual Basic) Pohyb objektů po PictureBoxu American English version English version

Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:

Zdravím, rozhodl jsem se přepsat školní projekt do OOP a hned ze startu jsem narazil na problém. Pohyby objektů jsou nepravidelné a sekají se. Už si s tím nevím rady. Doufám, že se tu najde někdo zkušenějsí, co mi s tím dokáže poradit :-) . Kdyby to nestačilo, můžu přiložit kompletní projekt.

namespace Pong_2._0
{
    public partial class Form1 : Form
    {
        private List<Player> Players = new List<Player>();
        private Dictionary<Keys, Player> PlayerControls = new Dictionary<Keys, Player>();

        public Form1()
        {
            InitializeComponent();
            Player player1 = new Player(new Point(100, 100), new Point(15, 100));
            Player player2 = new Player(new Point(0, 0), new Point(15, 100));
            Players.Add(player1);
            Players.Add(player2);
            PlayerControls.Add(Keys.W, player1);
            PlayerControls.Add(Keys.S, player1);
            PlayerControls.Add(Keys.Up, player2);
            PlayerControls.Add(Keys.Down, player2);
        }

        private void Playground_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            foreach (Player p in Players)
                g.FillRectangle(Brushes.Blue, p.position.X, p.position.Y, p.size.X, p.size.Y);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (PlayerControls.ContainsKey(e.KeyCode))
            {
                PlayerControls[e.KeyCode].KeyDown(e.KeyCode);
                Playground.Refresh();
            }
        }

        private void RealTime_Tick(object sender, EventArgs e)
        {
            foreach (Player p in Players)
                p.Tick();
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (PlayerControls.ContainsKey(e.KeyCode))
            {
                PlayerControls[e.KeyCode].KeyUp(e.KeyCode);
                Playground.Refresh();
            }
        }
    }
}

Třída Player

namespace Pong_2._0
{
    class Player
    {
        public Point position;
        public Point size;
        private bool moveUp, moveDown = false;

        public Player(Point position, Point size)
        {
            this.position = position;
            this.size = size;
        }

        public void KeyDown(Keys k)
        {
            if (k == Keys.Up)
                moveUp = true;
            if (k == Keys.Down)
                moveDown = true;
            if (k == Keys.W)
                moveUp = true;
            if (k == Keys.S)
                moveDown = true;
        }

        public void KeyUp(Keys k)
        {
            if (k == Keys.Up)
                moveUp = false;
            if (k == Keys.Down)
                moveDown = false;
            if (k == Keys.W)
                moveUp = false;
            if (k == Keys.S)
                moveDown = false;
        }

        public void Tick()
        {
            if (moveUp)
                position.Y -= 3;
            if (moveDown)
                position.Y += 3;
        }
    }
}
Odpovědět  -1 5. října 12:10
I can explain it to you, but I can't understand it for you.
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Mirek Slouka
Tomáš Brůna:

Zkus zapnout double buffering ale asi to nepomůže

Editováno 5. října 12:33
Nahoru Odpovědět 5. října 12:31
Lepší být šprt než blbec :)
Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:

To jsem zkoušel, nepomáhá

Nahoru Odpovědět  -1 5. října 12:52
I can explain it to you, but I can't understand it for you.
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Mirek Slouka
Tomáš Brůna:

Můžu tě poprosit o celej projekt? :)

Nahoru Odpovědět 5. října 16:43
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

no, zkoušel jsem to u sebe a dělá mi to taky. Asi půl rokem jsem to řešil taky ale už nevím jak jsem to vyřešil. Snad poradí někdo zkušenější :)

Nahoru Odpovědět 5. října 17:06
Lepší být šprt než blbec :)
Avatar
HONZ4
Člen
Avatar
Odpovídá na Mirek Slouka
HONZ4:

WinForm a PictureBox se na hry nehodí, minimum co se dá použít je WPF tady je ukázka

 
Nahoru Odpovědět 5. října 20:14
Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:

Cílem toho přepisování projektu je, abych se učil práci s objekty. Nedá se to nějak obejít ve WinForm a PictureBoxu?

Nahoru Odpovědět  -1 5. října 21:28
I can explain it to you, but I can't understand it for you.
Avatar
Odpovídá na Mirek Slouka
sadlomaslox25:

me se to zda docela plynule

public partial class Form1 : Form
{
    private float angle;
    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Task.Run(() =>
        {
            while (true)
            {
                Thread.Sleep(5);
                this.Invalidate();
            }
        });
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        angle += 0.5f;

        var x = 100*Math.Sin(2 * Math.PI * angle/360) + 200;
        var y = 100*Math.Cos(2 * Math.PI * angle / 360) + 200;

        e.Graphics.DrawEllipse(new Pen(Brushes.Red,2), new RectangleF((int) Math.Round( x), (int) Math.Round(y), 50, 50));

        x = 100 * Math.Sin(2 * Math.PI * 2*angle / 360) + 200;
        y = 100 * Math.Cos(2 * Math.PI * 2*angle / 360) + 200;

        e.Graphics.DrawEllipse(new Pen(Brushes.Green, 2), new RectangleF((int)Math.Round(x), (int)Math.Round(y), 50, 50));

        x = 100 * Math.Sin(2 * Math.PI * 4 * angle / 360) + 200;
        y = 100 * Math.Cos(2 * Math.PI * 4 * angle / 360) + 200;

        e.Graphics.DrawEllipse(new Pen(Brushes.Blue, 2), new RectangleF((int)Math.Round(x), (int)Math.Round(y), 50, 50));
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }
}
 
Nahoru Odpovědět 5. října 21:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.