Нужна помощь относительно движений спрайтов в AndEngine

#android #andengine #game-engine

#Android #andengine #игровой движок

Вопрос:

Я разрабатываю игру, в которой один игрок перемещается по экрану с помощью аналогового управления на экране.
Вражеские спрайты периодически добавляются в сцену, и они движутся к игроку. С помощью приведенного ниже кода добавляются враги.

 public void addTarget() {
    Random rand = new Random();

    float x = ( camera.getWidth()   resourcesManager.evilone_region.getWidth());
    float minY = resourcesManager.evilone_region.getHeight();
    int maxY = (int) (camera.getHeight() - resourcesManager.evilone_region
        .getHeight());
    int rangeY = (int) (maxY - minY);
    float y = rand.nextInt(rangeY)   minY;

    target = new AnimatedSprite(x, y, resourcesManager.evilone_region.deepCopy(),vbom){
        @Override
        protected void preDraw(GLState pGLState, Camera pCamera) 
        {
           super.preDraw(pGLState, pCamera);
           pGLState.enableDither();
        }
        @Override
        protected void onManagedUpdate(float pSecondsElapsed) 
        {
            super.onManagedUpdate(pSecondsElapsed);
           if(isPlayerMoved){
               this.registerEntityModifier(new MoveModifier(2, target.getX(),player.getX(),target.getY(),player.getY()));
           }
        }

    };
    attachChild(target);

    target.setCullingEnabled(true);
    final long[] PLAYER_ANIMATE = new long[] {100, 100, 100};
    target.animate(PLAYER_ANIMATE, 0, 2, true);

    int minDuration = 2;
    int maxDuration = 4;
    int rangeDuration = maxDuration - minDuration;
    int actualDuration = rand.nextInt(rangeDuration)   minDuration;

    mod = new MoveModifier(actualDuration, target.getX(),player.getX(),target.getY(),player.getY());

    target.registerEntityModifier(mod.deepCopy());
    TargetsToBeAdded.add(target);

}
private void createSpriteSpawnTimeHandler() {
    float mEffectSpawnDelay = 1f;

    eviloneTimerHandler = new TimerHandler(mEffectSpawnDelay, true,
    new ITimerCallback() {

        @Override
        public void onTimePassed(TimerHandler pTimerHandler) {
            if(isPaused){

            }else{
                //resourcesManager.targetbird.play();
                 addTarget();
            }

        }
    });

    engine.registerUpdateHandler(eviloneTimerHandler);
}
  

Теперь проблема в том, что когда я перемещаю плеер с аналоговым управлением, я хочу получить результат, поскольку каждый враг должен изменить направление и двигаться к игроку. Но при использовании этого кода каждый враг движется к первому добавленному врагу, и все они движутся к игроку, что выглядит очень странно, поскольку все они рушатся друг на друга.
Пожалуйста, помогите.

Ответ №1:

Вам не нужно напрямую перемещать своих врагов к игроку. Вы можете перемещать их на 5 пикселей при каждом обновлении или что-то в этом роде. Вот пример, но этот код должен быть улучшен:

         @Override
        protected void onManagedUpdate(float pSecondsElapsed) 
        {
            super.onManagedUpdate(pSecondsElapsed);

            if( player.getX() > target.getX() )
            {
                 //Move your enemy 5 pixels to right
            }
            else
              //Move your enemy 5 pixels to left

            if( player.getY() > target.getY() )
            {
                 //Move your enemy 5 pixels to down
            }
            else
              //Move your enemy 5 pixels to up
        }
  

Примечание: Не забудьте проверить, достиг ли целевой игрок. И прежде чем начать перемещать свою цель, проверьте, движется ли она в данный момент. Вы можете использовать логическое значение для его проверки. Надеюсь, это поможет.