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

何にも接続されていない myPlayer として Player のインスタンスを初期化しているためです。

Enemy クラス内で myPlayer のプライベート変数を定義するか、Player クラス インスタンスへのポインタを引数として渡す必要があります。これにより、状態を維持できます。

于 2013-07-28T20:16:20.507 に答える
1

敵が 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 に答える
1

これは、クラスのインスタンスを再初期化しているためですPlayer。代わりに、パラメーターとして渡します。

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

そうすれば、関数は別のスコープの新しいインスタンスではなく、インスタンスを使用します。

于 2013-07-28T20:20:37.760 に答える