NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pohyb objektů po PictureBoxu

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:5.10.2016 12:10

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
5.10.2016 12:10
I can explain it to you, but I can't understand it for you.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Mirek Slouka
Tomáš Brůna:5.10.2016 12:31

Zkus zapnout double buffering ale asi to nepomůže

Editováno 5.10.2016 12:33
Nahoru Odpovědět
5.10.2016 12:31
Vi veri universum vivus vici
Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:5.10.2016 12:52

To jsem zkoušel, nepomáhá

Nahoru Odpovědět
5.10.2016 12:52
I can explain it to you, but I can't understand it for you.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Mirek Slouka
Tomáš Brůna:5.10.2016 16:43

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

Nahoru Odpovědět
5.10.2016 16:43
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Tomáš Brůna:5.10.2016 17:06

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.10.2016 17:06
Vi veri universum vivus vici
Avatar
HONZ4
Člen
Avatar
Odpovídá na Mirek Slouka
HONZ4:5.10.2016 20:14

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

 
Nahoru Odpovědět
5.10.2016 20:14
Avatar
Mirek Slouka
Člen
Avatar
Mirek Slouka:5.10.2016 21:28

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
5.10.2016 21:28
I can explain it to you, but I can't understand it for you.
Avatar
Odpovídá na Mirek Slouka
sadlomaslox25:5.10.2016 21:31

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.10.2016 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.