Стрелять в обратную сторону? - AndEngine классический учебник - PullRequest
1 голос
/ 11 марта 2012

Хорошо, это должно быть достаточно просто, но я запутываюсь в математике.Использование AndEngine BTW>

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

/** shoots a projectile from the player's position along the touched area */
private void shootProjectile(final float pX, final float pY) {

    int offX = (int) (pX - (hero.getX()));
    int offY = (int) (pY - (hero.getY() + hero.getHeight()/2));
    if (offX <= 0) return;

    // position the projectile on the player and set up path
    projectile = pPool.obtainPoolItem();

    int realX = (int) (mCamera.getWidth() - (hero.getX()  ) );
    float ratio = (float) realX / (float) offX;
    int realY = (int) ((offY * ratio));

    float length = (float) Math.sqrt((realX * realX) + (realY * realY));
    float velocity = 280.0f / .5f; // 480 pixels per (sec)f on screen
    float realMoveDuration = length / velocity;

    // defining a moveBymodifier from the projectile's position to the
    // calculated one

    //this code angles the projectile sprite
    double PI = 3.14159265;
    float  dx = pX -  hero.getX();
    float  dy = pY -  hero.getY()-50;

    double  Radius = Math.atan2(dy,dx);
    double Angle = Radius * 180 / PI;

    projectile.setRotation((float)Angle); // sets the angle of the projectile

    //Move modifier for projectile
    MoveByModifier movMByod = new MoveByModifier(realMoveDuration, realX, realY);

    final ParallelEntityModifier par = new ParallelEntityModifier(movMByod);

    DelayModifier dMod = new DelayModifier(0.001f);
    dMod.addModifierListener(new IModifierListener<IEntity>() {

        @Override
        public void onModifierStarted(IModifier<IEntity> arg0, IEntity arg1) {
        }

        @Override
        public void onModifierFinished(IModifier<IEntity> arg0, IEntity arg1) {
            // TODO Auto-generated method stub
            shootingSound.play();
            projectile.setVisible(true);
            projectile.setPosition(hero.getX(), hero.getY() + hero.getHeight() / 2);
            projectilesToBeAdded.add(projectile);
            projectile.animate(50);

        }
    });

    SequenceEntityModifier seq = new SequenceEntityModifier(dMod, par);
    projectile.registerEntityModifier(seq);
    projectile.setVisible(false);
    mMainScene.attachChild(projectile, 1);

У меня герой отлично расположен на правой стороне.Что мне нужно сделать, чтобы снаряд правильно переместился влево?

Огромное спасибо за любую помощь.

MWM

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вы не должны использовать DelayModifier, как вы делаете.Вместо этого создайте PhysicsHandler для ваших спрайтов, а затем установите скорость в PhysicsHandler.Что-то вроде:

PhysicsHandler phys = new PhysicsHandler();
projectile.registerUpdateHandler(phys);
phys.setVelocityX(50);

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

1 голос
/ 23 января 2013

Этот код выглядит как код из http://jimmaru.wordpress.com/2011/09/28/andengine-simple-android-game-tutorial/, если это так, попробуйте это:

private void shootProjectile(final float pX, final float pY) {
    int side = 1;
    int offX = (int) (pX - (hero.getX()));
    int offY = (int) (pY - (hero.getY() + hero.getHeight()/2));
    if (offX <= 0){
       side=-1
    }

    // position the projectile on the player and set up path
    projectile = pPool.obtainPoolItem();

    int realX = (int) (mCamera.getWidth() - (hero.getX()  ) ) * side;
    ....

У меня возникла такая же проблема с кодом по ссылке, с этим изменением я мог выстрелитьобе стороны с игроком в середине экрана.

...