c#图形对象相互重叠

c#图形对象相互重叠,c#,object,graphics,drawing,pacman,C#,Object,Graphics,Drawing,Pacman,好的,我正在用c#创建一个吃豆人游戏,我已经搞定了吃豆人。现在我正试图让我的怪物加入游戏 我创建了一个包含移动方法和所有内容的类。现在的问题是,我正在另一个图形对象上绘制怪物和吃豆人。它们都是我面板的大小,当我运行代码时,只有吃豆人出现,怪物正在工作,但吃豆人正在移动的图形对象下面 这是绘制怪物和吃豆人的代码: private void timMove_Tick(object sender, EventArgs e) { Bitmap bitmap = new Bitma

好的,我正在用c#创建一个吃豆人游戏,我已经搞定了吃豆人。现在我正试图让我的怪物加入游戏

我创建了一个包含移动方法和所有内容的类。现在的问题是,我正在另一个图形对象上绘制怪物和吃豆人。它们都是我面板的大小,当我运行代码时,只有吃豆人出现,怪物正在工作,但吃豆人正在移动的图形对象下面

这是绘制怪物和吃豆人的代码:

private void timMove_Tick(object sender, EventArgs e)
    {
        Bitmap bitmap = new Bitmap(panBox.Width, panBox.Height);
        Graphics g = Graphics.FromImage(bitmap);
        foreach (Monster mon in monsters)
        {
            mon.move(g);
        }
        foreach (Pacman pac in characters)
        {
           pac.move(g);
        }
        Graphics g2 = panBox.CreateGraphics();
        g2.DrawImage(bitmap, 0, 0);            
    }

我的问题是:如何让它们在同一个图形对象上绘图,或者它们都只是显示,而不是现在只显示pacman?

我认为您应该总体考虑您的类结构。 我建议以这样的方式作为起点:

abstract class GameObject
{
    public abstract void Move();
    public abstract void Draw(Graphics g);
}

class Pacman : GameObject
{
    public override void Move()
    {
        //Update the Position of Pacman, check for collisions, ...
    }

    public override void Draw(Graphics g)
    {
        //Draw Pacman at his x and y coordinates
    }
}

class Monster : GameObject
{
    public override void Move()
    {
        //Update the Position of the Monster, ...   
    }

    public override void Draw(Graphics g)
    {
        //Draw the Monster at his current position
    }
}

class GameClass
{
    private Pacman _pacman;
    private Monster _monster;
    private List<GameObject> _gameobjects = new List<GameObject>();

    public GameClass()
    {
        _pacman = new Pacman();
        _monster = new Monster();
        _gameobjects.Add(_pacman);
        _gameobjects.Add(_monster);
    }


    private void TimerTick()
    {
        //update all GameObjects
        foreach (var gameobject in _gameobjects)
        {
            gameobject.Move();
        }
        //Draw every single GameObject to the Bitmap
        Bitmap bitmap = new Bitmap(panBox.Width, panBox.Height);
        using (Graphics g = Graphics.FromImage(bitmap))
        {
            foreach (var gameobject in _gameobjects)
            {
                gameobject.Draw(g);
            }
        }
        //Draw the Bitmap to the screen
        using (Graphics g = panBox.CreateGraphics())
        {
            g.DrawImage(bitmap, 0, 0);
        }
    }
抽象类游戏对象
{
公共抽象无效移动();
公开摘要作废图(图g);
}
Pacman类:游戏对象
{
公共覆盖无效移动()
{
//更新Pacman的位置,检查碰撞。。。
}
公共覆盖无效绘制(图形g)
{
//在其x和y坐标处绘制Pacman
}
}
类怪物:游戏对象
{
公共覆盖无效移动()
{
//更新怪物的位置。。。
}
公共覆盖无效绘制(图形g)
{
//在怪物当前位置绘制怪物
}
}
类游戏类
{
私人吃豆人(Pacman),;
私人怪物;
私有列表_gameobjects=新列表();
公共游戏类()
{
_吃豆人=新吃豆人();
_怪物=新怪物();
_gameobjects.Add(_pacman);
_游戏对象。添加(_怪物);
}
私有void TimerTick()
{
//更新所有游戏对象
foreach(var gameobject in_gameobjects)
{
gameobject.Move();
}
//将每个游戏对象绘制到位图
位图位图=新位图(panBox.Width、panBox.Height);
使用(Graphics g=Graphics.FromImage(位图))
{
foreach(var gameobject in_gameobjects)
{
游戏对象绘制(g);
}
}
//将位图绘制到屏幕上
使用(Graphics g=panBox.CreateGraphics())
{
g、 DrawImage(位图,0,0);
}
}
一般来说,您应该了解继承/Polimorphism和类。 多晶型: 课程:

哦,我的问题是,如何让他们在同一个图形对象上绘图,或者他们都只是显示而不是现在只显示pacman。在我看来,他们使用的是同一个图形……这是您的实际代码吗?如果是,那么在move()中绘图实际上是如何完成的?