如果我在子类中执行此操作,我会遇到问题。
这是我的主循环,我在其中访问玩家和敌人类的移动,逻辑和显示功能。
//Logic
myPlayer.player_move();
myEnemy.enemy_logic();
//Rendering
myPlayer.player_show();
myEnemy.enemy_show();
所以我访问了Player类的移动玩家的功能,然后我访问了Enemy Class的逻辑(AI)功能。
void Enemy::enemy_move(){
eX -= 2;
}
void Enemy::enemy_logic(){
Player myPlayer;
if(myPlayer.x > SCREEN_WIDTH / 2){
enemy_move();
}
}
因此,如果玩家x值大于屏幕的一半,我希望敌人开始向左移动
我可以编译程序但是当我将玩家移动到屏幕的中间点时,敌人什么也不做。如果我将这个if语句放在main.cpp中,那么它可以正常工作。有什么建议吗?
答案 0 :(得分:1)
因为您正在将Player的实例初始化为未连接任何内容的myPlayer。
您应该在Enemy Class中为myPlayer定义一个私有变量,或者将指向Player类实例的指针作为参数传递,这样您就可以维持状态。
答案 1 :(得分:1)
这是因为您正在重新初始化类Player
的实例。相反,将其作为参数传递:
void Enemy::enemy_logic(Player myPlayer){
if(myPlayer.x > SCREEN_WIDTH / 2){
enemy_move();
}
}
这样函数就会使用你的实例,而不是另一个范围内的新实例。
答案 2 :(得分:1)
如果你的敌人依赖于单个玩家,你可以将每个enmy“绑定”给这样的玩家:
class Player
{
Position m_x, m_y, m_z;
public:
Position const & x (void) { return m_x; }
};
class Enemy
{
public:
Enemy (Player &p) : m_player(p) { }
Player & m_player;
void logic (void)
{
if (m_player.x() > SCREEN_WIDTH/2)
{
move_x();
}
}
void move_x (void) { /*...*/ }
};
int main (void)
{
Player the_player;
Enemy the_enemy(the_player);
// move the player
the_enemy.logic(); // the_enemy knows the_player and acts accordingly
}