C ++游戏访问单独的类变量

时间:2013-12-10 16:08:01

标签: c++ class sdl

我一直在尝试使用图形库SDL 2.0在C ++中制作游戏,但我遇到了一个问题。

我有两个类User和Enemy。以下是两者的简化版本,只要问一下,我就会粘贴整个内容

class User
{
    public:
       //Friends:
       friend class Enemy;


    protected:
    private:
        //The sprite position
        SDL_Rect SpritePos = {10, 100};
};



class Enemy
{
   public:
        //Friends:
        friend class User;

        Enemy();
       int CheckEnemy(SDL_Surface* &ScreenSurface);
       //Loads enemy images
       bool LoadEnemyMedia();

    protected:
    private:
        //Controls the AI movement
        void Movement();

        //Wizard 1's location on screen
        SDL_Rect Wizard1Pos = {50, 70};
};

函数Enemy :: Movement找出精灵的位置,然后相应地移动它自己,但是它无法获得Spritepos的当前值,只有它初始化的值,在这种情况下为10.这里是功能Enemy ::运动的代码。我该如何解决这个问题,请记住这些函数是在循环中运行的。

void Enemy::Movement()
{
    User Player;


    if (Wizard1Pos.x < Player.SpritePos.x)
    {
        Wizard1Pos.x ++;

    }else if (Wizard1Pos.x > Player.SpritePos.x)
    {
        Wizard1Pos.x  --;
    }
}

1 个答案:

答案 0 :(得分:3)

Player.SpritePos.x将返回变量x的成员SpritePos的成员Player

如果您只获取初始化值而不是更新值,那么您可能正在阅读不同于您写入的副本。在有关于数据编写方式和位置的更多信息之前,我建议您查看“参考”和“指针”。

编辑:我看到你的真实代码与示例相同,我假设它是简化的:

void Enemy::Movement()
{
    User Player;
    printf("%u\n", Player.RefTest.x);

    if (Wizard1Pos.x < Player.RefTest.x)
    {
        Wizard1Pos.x ++;
    }else if (Wizard1Pos.x > Player.RefTest.x )
    {
        Wizard1Pos.x  --;
    }
}

User Player;在堆栈上创建一个类型为User的新对象,然后从中读取。在Movement()函数结束时,将删除堆栈变量Player。永远不会写Player

在一个地方创建一个名为Player的变量,然后在另一个地方创建另一个名为Player的变量,它不会以任何方式链接2(例外:全局变量)。变量名称对代码的行为没有影响。

如果您希望Movement引用已存在的User,您需要告诉Movement()方法它所指的User实例。您可以通过向方法添加参数来执行此操作,如下所示:

void Enemy::Movement(const User & someCompletelyArbitraryVariableName)
{
    printf("%u\n", someCompletelyArbitraryVariableName.RefTest.x);

    if (Wizard1Pos.x < someCompletelyArbitraryVariableName.RefTest.x)
    {
        Wizard1Pos.x ++;
    }else if (Wizard1Pos.x > someCompletelyArbitraryVariableName.RefTest.x )
    {
        Wizard1Pos.x  --;
    }
}

&告诉程序不要复制。 const告诉程序,不允许在player方法中更改Movement中的任何内容。 const除了防止愚蠢的错误之外没有任何价值,正如您将学到的那样,这是非常有益的。