OnPaintEvent in Timer



  • Hey,
    in meinem Spiel wird der Spieler auf einem Panel gezeichnet.
    Um seine Position neu zu bestimmen habe ich eine Update-Methode:

    public class Spieler
        {
            public Image Spieler_Img = Image.FromFile(@"......");
    
            public int SpielerX = 700;
            public int SpielerY = 400;
    
            public Spieler()
            {
            }
    
            public void Update(PaintEventArgs e)
            {
                var g = e.Graphics;
                g.DrawImage(Spieler_Img, new Point(SpielerX, SpielerY));      
            }
        }
    

    Damit der Spieler laufen kann habe ich noch die Bewegung abhängig von der gedrückten Taste eingebaut.

    public List<Keys> _pressedKeys = new List<Keys>(); 
    
    private void Map_KeyDown(object sender, KeyEventArgs e)
            {
               _pressedKeys.Add(e.KeyData);
            }
    
            private void Map_KeyUp(object sender, KeyEventArgs e)
            {
                _pressedKeys.Clear();
            }
    
            private void SpielerTimer_Tick(object sender, EventArgs e)
            {          
                    // Spieler Bewegungen abhängig von Keys //
                    if (_pressedKeys.Contains(Keys.W))
                    {
                        Player.SpielerY -= 10;
                    }
    
                    if (_pressedKeys.Contains(Keys.S))
                    {
                        Player.SpielerY += 10;
                    }
    
                    if (_pressedKeys.Contains(Keys.A))
                    {
                        Player.SpielerX -= 10;
                    }
    
                    if (_pressedKeys.Contains(Keys.D))
                    {
                        Player.SpielerX += 10;
                    }                  
            }
    

    Mein Problem ist jetzt, dass ich es nicht hinbekomme den Spieler neu zu zeichnen auf dem Pannel... d.h. die Update-Methode mit jedem Tick aufzurufen.
    Bräuchte da ein paar Tipps.

    Danke 🙂
    D.J.


  • Administrator

    Du musst das Control.Paint Event abonnieren. Mit der Control.Invalidate Methode kannst du Bereiche oder alles eines Controls für ungültig erklären, damit diese neu gezeichnet werden.

    Grüssli



  • Danke erstmal.

    Aber wie darf ich das verstehen.
    Muss ich mit dem Control.Paint-Event meinem Panel das Image anfügen?


  • Administrator

    Dein Panel erbt von Control. Heisst dein Panel hat ebenfalls das Paint Event und es hat ebenfalls die Invalidate Methoden. Wenn das Paint Event deines Panels ausgelöst wird, zeichnest du. Und mit der Invalidate Methode kannst du deinem Panel sagen, dass es sich neu zeichnen soll.

    Grüssli



  • Ok Vielen Dank 🙂
    Hab es geschafft.



  • Benutz doch einfach PictureBox1.Refresh() 😉


Anmelden zum Antworten