C++;访问独立类变量的游戏 我一直在尝试用C++图形库SDL 2做游戏,但是我遇到了一个问题。
我有两个类用户和敌人。这里是这两个版本的精简版,只要问一下,我就会把整个内容粘贴上去C++;访问独立类变量的游戏 我一直在尝试用C++图形库SDL 2做游戏,但是我遇到了一个问题。,c++,class,sdl,C++,Class,Sdl,我有两个类用户和敌人。这里是这两个版本的精简版,只要问一下,我就会把整个内容粘贴上去 class User { public: //Friends: friend class Enemy; protected: private: //The sprite position SDL_Rect SpritePos = {10, 100}; }; class Enemy { public:
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};
};
函数敌方::Movement找出精灵的位置,然后相应地移动自身,但是它无法获得精灵的当前值,只有它初始化时使用的值,在本例中为10。这是函数敌人::运动的代码。我如何解决这个问题,请记住这些函数是在循环中运行的
void Enemy::Movement()
{
User Player;
if (Wizard1Pos.x < Player.SpritePos.x)
{
Wizard1Pos.x ++;
}else if (Wizard1Pos.x > Player.SpritePos.x)
{
Wizard1Pos.x --;
}
}
void敌人::移动()
{
用户播放器;
if(Wizard1Pos.xPlayer.SpritePos.x)
{
Wizard1Pos.x--;
}
}
Player.SpritePos.x
将返回变量Player
的成员SpritePos
的成员x
如果只获取初始化值而不是更新值,则可能是从不同的副本读取而不是写入。在有更多关于数据写入方式和位置的信息之前,我建议您查看“引用”和“指针”
编辑:我看到您的实际代码看起来与示例相同,我假设示例已简化:
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 --;
}
}
&
告诉程序不要复制。const
告诉程序,不允许在Movement
方法中更改player
中的任何内容。const
除了防止愚蠢的错误之外,没有任何附加值,正如您将了解到的那样,这是非常有益的。我已经研究过使用引用变量,但是当我从单独的类打印它时,它仍然读取不同的值。如何确保它读取的是正确的副本。我需要查看更多代码。一个公共dropbox/gdrive/skydrive文件夹怎么样?谢谢这真的很有帮助,但我还有两个问题。如何传递正确的User实例(作为参数传递什么),当使用“void Movement(const User&Player)”时,我会得到错误“User没有名称类型”,我如何修复这个错误?我猜你在header.h中写到了这一点。标头还不知道用户可能是什么。你需要在教科书(或谷歌)中查找“转发声明”。关于将什么作为参数传递,你需要决定你希望用户实例(你称之为“玩家”)在哪里生存,以及如何控制它的生存期。您尝试的项目从C++开始有点太多了。我建议花几天时间学习教程,内容包括由多个文件组成的程序。
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 --;
}
}