我一直在尝试使用图形库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 --;
}
}
答案 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
除了防止愚蠢的错误之外没有任何价值,正如您将学到的那样,这是非常有益的。