简体   繁体   中英

I can't figure out why my image will not repaint

My images is definitally moving, but no matter what I do, I can not get it so the image repaints! The GameManger paints the cat, and the form1 passes the paint args and object to gamemanager.

Form1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    public partial class Form1 : Form
    {
        GameManager myGM = new GameManager();
        int dir = 0;
        public Form1()
        {
            InitializeComponent();
            newGame();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (this.myGM != null)
                this.myGM.paint(e.Graphics);
            //e.Graphics.DrawImage(imgMouse.Images[0], pointXMouse, pointYMouse);
            //e.Graphics.DrawImage(imgCat.Images[0], 50, 100);
            //e.Graphics.DrawImage(imgCheese.Images[0], 75, 100);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Up)
            {
                dir = 0;
            }
            if (e.KeyCode == Keys.Right)
            {
                dir = 1;
            }
            if (e.KeyCode == Keys.Down)
            {
                dir = 2;
            }
            if (e.KeyCode == Keys.Left)
            {
                dir = 3;
            }
        }
        public void newGame()
        {
            timer1.Start();
            myGM.newGame(imgCat, imgMouse, imgCheese, this);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            pictureBox1.Refresh();
        }
        public int getDir()
        {
            return dir;
        }
    }
}

GameManager:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    class GameManager
    {
        Form1 myForm;
        Cat ca1 = new Cat();
        Mouse m = new Mouse();
        Cheese ch = new Cheese();
        int amount = 5;
        int catdir = 0;
        Timer time = new Timer();
        public ImageList imgCat = new ImageList();
        public ImageList imgMouse = new ImageList();
        public ImageList imgCheese = new ImageList();

        public void newGame(ImageList cat, ImageList mouse, ImageList cheese, Form1 form)
        {
            imgCat = cat;
            imgMouse = mouse;
            imgCheese = cheese;
            myForm = form;
            time.Start();
        }

        public void move()
        {
            ca1.Move(amount, catdir);
            m.Move(amount, catdir);
        }

        public void paint(Graphics g)
        {
            g.DrawImage(imgCat.Images[0], ca1.getLocation());
        }

        private void time_Tick(object sender, EventArgs e)
        {
            move();
            getDir();
            myForm.Refresh();
        }
        public void getDir()
        {
            catdir = myForm.getDir();
        }
    }
}

Cat:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CatAndMouse
{
    class Cat: Moveable
    {
        Random myCLoc = new Random();
        private Moveable myCatMove;
        public Point p = new Point(100, 100);
        int dir = 0;

        public void Move(int n, int d)
        {
            dir = d;
            if (dir == 0)
            {
                p.Y = p.Y - n;
            }
            if (dir == 1)
            {
                p.X = p.X + n;
            }
            if (dir == 2)
            {
                p.Y = p.Y + n;
            }
            if (dir == 3)
            {
                p.X = p.X - n;
            }
        }
        public void changeDirection()
        {
        }

        public Point getLocation()
        {
            return p;
        }

        public void paint(PaintEventArgs e)
        {

        }
    }
}

No matter what I do it will just NOT REPAINT!

Doublecheck if the timer is enabled and PictureBox.Paint event is fired (don't be afraid to use debugger). If it won't help try not to use PictureBox.Paint event and Refresh method, but call myGM.paint directly in Timer.Tick handler

This has always worked for me in PictureBoxes and other Controls

PictureBox.Refresh();
PictureBox.Update();

OR

PictureBox.Update();
PictureBox.Refresh();

Although I can't remember which

I had to add time.Tick +=new EventHandler(time_Tick); to the GameManager constructor, apparently that is how a timer gets connected the time_tick method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM