【问题标题】:Sprite coordinates issue精灵坐标问题
【发布时间】:2019-07-09 23:33:17
【问题描述】:

我使用 allegro4 和 C++ 为一种类型的敌人创建了一个类;在这个类中,我有一个使移动精灵的函数,如下所示:

sprite_one(x, y); 
sprite_two(x2, y2);

class enemy{
    public:
    void mov(){
            x++;
            ----
            y--;
        }
    }        
};


enemy test_one;
test_one.mov();    // this works because its coordinates are x and y

enemy test_two;
test_two.mov();    // this doesn't work, its coordinates are x2 and y2 

问题是当我创建对象时,第一个可以根据函数移动(更新变量x和y),其他的不能,因为它们调用位置变量的方式不同。我该如何解决这个问题?

【问题讨论】:

  • 首先,xy是什么?它们看起来像全局变量,但面向对象的设计原则说它们应该是class enemy 的成员变量,这意味着每个enemy 都可以有自己的坐标。第二......这个----mov 函数中间做了什么?这应该在注释中,不要干扰下一行代码。
  • 函数中间只有变量的增减。我创建了 int x 和 int y 作为全局变量,对于 x2 和 y2 也是一样的。我应该在函数中声明它们吗?
  • 我觉得你需要搜索一个关于C++类成员的在线教程。

标签: c++ function class allegro allegro4


【解决方案1】:

您的enemy 类需要将xy 坐标作为成员变量。这就是您如何让每个实际敌人拥有自己的坐标,与其他所有敌人分开。以下代码至少应该让您启动并运行。您可能想要添加一个公共函数来打印坐标或在屏幕上绘制敌人。

class enemy
{
    int mx, my; // coordinates of this enemy
public:
    enemy(int x, int y)
        : mx(x), my(y) // initialize the coordinates
    {
        // possibly add future initialization here
    }
    void mov()
    {
        ++mx;
        --my;
    }
}

然后你可以像以前一样创建和移动两个敌人:

enemy test_one(x,y);
test_one.mov();

enemy test_two(x2,y2);
test_two.mov();

请注意,x,y,x2,y2 不再是存储敌人当前位置的变量,而是定义其起始位置的常量。

【讨论】: