C ++ Game AI仅适用于main

时间:2013-07-28 20:05:58

标签: c++

如果我在子类中执行此操作,我会遇到问题。

这是我的主循环,我在其中访问玩家和敌人类的移动,逻辑和显示功能。

//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中,那么它可以正常工作。有什么建议吗?

3 个答案:

答案 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
}