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

标签 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 找出 Sprite 的位置,然后相应地移动自己,但是它无法获得 Spritepos 的当前值,只能获得它初始化的值,在本例中为 10。这是函数 Enemy::Movement 的代码。我该如何解决这个问题,请记住这些函数是循环运行的。

void Enemy::Movement()
{
    User Player;


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

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

最佳答案

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

如果您只获得初始化值而不是更新值,则您可能正在从与您正在写入的拷贝不同的拷贝读取。在了解有关数据写入方式和位置的更多信息之前,我建议您查看“引用”和“指针”。

编辑:我看到您的真实代码看起来与示例相同,我原以为它已被简化:

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 的变量不会以任何方式链接这两个变量(异常(exception):全局变量)。变量名对代码的行为没有影响。

如果您希望 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 告诉程序不允许从 Movement 方法中更改 player 中的任何内容。 const 除了防止愚蠢的错误之外没有增加任何值(value),正如您将了解到的那样,这是非常有益的。

关于C++ 游戏访问单独的类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20499374/

相关文章:

c++ - 为什么 SDL_BlitSurface 的 SDL_Rect* 参数不是常量?

c++ - 具体卡牌组合指数如何计算

c++ - 获取错误 : missing template arguments before ‘(’ token

C++ 输入全局变量可跨多个类访问

javascript - jQuery - 检查数组中的 2 个元素是否具有相同的类

java - 我怎样才能得到在我的第一个类的模板部分中定义的类的名称?

c++ - Qt 5.2.1 添加wwWidgets到项目中

c++ - C++ 类的内存布局是否会受到地址空间布局随机化的影响

c++ - 奇怪的未处理异常;访问违规阅读位置

c++ - SDL_GL_SetAttribute 不设置颜色大小