1

如果我在子类中进行,我很难让 AI 工作。

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

//Logic
        myPlayer.player_move();
        myEnemy.enemy_logic();
//Rendering
        myPlayer.player_show();
        myEnemy.enemy_show();

所以我访问了 Player 类的移动玩家的函数,然后我访问了 Enemy 类的逻辑(AI)函数。

void Enemy::enemy_move(){

eX -= 2;

}

void Enemy::enemy_logic(){
    Player myPlayer;
    if(myPlayer.x > SCREEN_WIDTH / 2){
        enemy_move();
    }
}

因此,如果 Players x 值大于屏幕的一半,我希望敌人开始向左移动

我可以编译程序,但是当我将玩家移动到屏幕的中间点时,敌人什么也不做。如果我将这个 if 语句放在 main.cpp 中,那么它工作正常。有什么建议吗?

4

3 回答 3

1

因为您将 Player 的实例初始化为未连接到任何东西的 myPlayer。

您应该在 Enemy 类中为 myPlayer 定义一个私有变量,或者将指向 Player 类实例的指针作为参数传递,这样您就可以保持状态。

于 2013-07-28T20:16:20.507 回答
1

这是因为您正在重新初始化 class 的实例Player。相反,将其作为参数传递:

void Enemy::enemy_logic(Player myPlayer){
    if(myPlayer.x > SCREEN_WIDTH / 2){
        enemy_move();
    }
}

这样,该函数使用您的实例,而不是不同范围内的新实例。

于 2013-07-28T20:20:37.760 回答
1

如果您的敌人依赖于单个玩家,您可以将每个敌人“绑定”到一个玩家,如下所示:

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
}
于 2013-07-28T20:25:16.400 回答