抱歉,但是我必须重复在“ C++, Adding conditions in class vars”之前所问的相同问题。

我在这里使用SDL2。

在obj.h中:(不包括预处理程序命令)

class obj {
public:
        SDL_Rect clip;
        void addCollideWith( SDL_Rect rect );
        void hasCollide();
        void clearCollideWith();
private:
        std::list<bool *> collideWith;
};


在obj.cpp中:(不包括预处理程序命令)

void obj::addCollideWith( SDL_Rect rect )
{
        collideWith.push_back(SDL_HasIntersection(obj.clip, rect));
}

void obj::hasCollide()
{
    bool retval = true;
    for (std::list<bool *>::iterator it = collideWith.begin(); it != collideWith.end(); it++)
    {
        retval = retval && **it;
    }
    return retval;
}

void clearCollideWith()
{
    collideWith.clear();
}


在main函数内部,我说的是对象移动一个像素,每移动一个像素,它就会检查是否与其他对象发生碰撞。我清除了指针内容“ *”,因为您没有看到变量:collideWith.push_back(SDL_HasIntersection(obj.clip, rect));。我要做的是使它移动一个像素,清除collideWith并再次添加collideWith条件以更新它是true还是false。

现在,出什么问题了?

这使得程序真的很慢!如果我删除collideWith东西,然后启动程序,它将变得更加流畅。现在,我想要的是存储语句,而不是true或false。 std::list需要:

collideWith.pushBack(true /*OR*/ false);


但是我想要的是:

collideWith.pushBack(/*statement determining whether it is true or false*/ var1 > var2);


如果上下文缺失或问题是某种原因,无法理解,请不要抱怨!
(注意:未提及与移动对象和声明obj clip sub-vars有关的上下文,因为它们不是问题的一部分。)

最佳答案

您可以尝试更换

    std::list<bool *> collideWith;




    std::list<SDL_Rect> collideWith;


为了跟踪您要考虑的矩形。

实现可以是:

void obj::addCollideWith( SDL_Rect rect )
{
        collideWith.push_back(rect);
}

// to test if it collides with at least one rectangle
bool obj::hasCollide()
{
    bool retval = false;
    for (std::list<SDL_Rect>::iterator it = collideWith.begin(); it != collideWith.end(); it++)
    {
        retval = retval || SDL_HasIntersection(obj.clip, *it);
    }
    return retval;
}

// to test if it collides with all rectangles
/* bool obj::hasCollide()
{
    bool retval = true;
    for (std::list<SDL_Rect>::iterator it = collideWith.begin(); it != collideWith.end(); it++)
    {
        retval = retval && SDL_HasIntersection(obj.clip, *it);
    }
    return retval;
} */

08-17 14:57