我一直在尝试使用图形库 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/