AS3 Заставляет врага двигаться к мыши

#flash #actionscript-3 #mouse #flashdevelop #enterframeevent

#вспышка #actionscript-3 #мышь #разработка flash #введите событие фрейма

Вопрос:

 package {

import enemies.Enemy;
import flash.display.Sprite;
import flash.events.*;

public class Main extends Sprite {

    // a place to store the enemy
    public var enemy:Enemy;

    private function handleEnterFrame(e:Event):void {
        tweenIt(enemy.x, mouseX, 2);
    }

    private function tweenIt(variable:Number, target:Number, speed:Number):void{
        if (variable < target) {
            variable  = speed;
        }

        if (variable > target) {
            variable -= speed;
        }
    }

    // this is the first code that is run in our application
    public function Main():void {

        addEventListener(Event.ENTER_FRAME, handleEnterFrame);
        // we create the enemy and store him in our variable
        enemy = new Enemy();

        // we add the enemy to the stage 
        addChild(enemy)

        enemy.x = Math.random() * stage.stageWidth;
        enemy.y = Math.random() * stage.stageHeight;

    }

}

}
  

В класс врага встроено растровое изображение. Я использую FlashDevelop для программирования. Когда я делаю что-то вроде enemy.x =1, это работает, но когда я пытаюсь использовать свой сценарий анимации, враг остается неподвижным, независимо от положения мыши.
Спасибо,
Blobstah

Ответ №1:

Я не разработчик AS3, поэтому я не могу вам помочь, если что-то не так с вашим кодом, но если вы не уверены в том, как математически переместить врага к мыши, вот как. (Это не код, а просто общая суть того, что вы хотите вычислить. Я уверен, что вы можете преобразовать его в AS3.)

Сначала определите расстояние между врагом и вашей мышью.

 xDistance = enemyPositionX - mousePositionX;
yDistance = enemyPositionY - mousePositionY;
  

Затем найдите поворот, необходимый для наведения врага на мышь.

 rotation = atan2(yDistance, xDistance);
  

И, наконец, вот что вы хотите поместить в свою функцию tweenIt, чтобы переместить врага к мыши (на 3 пикселя за вызов функции).

 enemyPositionX -= 3 * cos(rotation);
enemyPositionY -= 3 * sin(rotation);
  

И это должно быть так! Я отдаю должное рекурсивности, потому что именно там я научился это делать.

Комментарии:

1. Я просто хочу, чтобы враг перемещался по координатам. Моя математика в этой функции в порядке. Я считаю, что проблема связана с actionscript, но в любом случае спасибо за вашу помощь.

Ответ №2:

Вы передаете значение позиции противника x своей tweenIt функции, меняете это значение, а затем отбрасываете результат.

Другими словами, variable это другая переменная, чем enemy.x , хотя она получила свое начальное значение enemy.x .

Один из способов исправить это — изменить параметр на ссылку на фактического врага:

 private function handleEnterFrame(e:Event):void {
    tweenIt(enemy, mouseX, 2);
}

private function tweenIt(anEnemy:Enemy, target:Number, speed:Number):void{
    if (anEnemy.x < target) {
        anEnemy.x  = speed;
    }

    // ...
}
  

Комментарии:

1. можно ли сделать это более общим способом? Например, заставить его работать с любой переменной, которую я в него добавляю? спасибо

2. @Jonh: Ну, нет. Вам придется подумать о других способах абстрагирования этого (на ум приходят интерфейсы и полиморфизм). blah = 4 это просто сокращение для blah = blah 4 ; очевидно, что blah 4 часть даст правильное значение, но вместо того, чтобы присваиваться свойству объекта, оно присваивается blah (таким образом, вы меняете значение переменной, но эта переменная не имеет абсолютно ничего общего со свойством объекта — единственнымссылка заключается в том, что свойство использовалось для определения исходного значения для передачи функции)

3. это действительно можно сделать .. anEnemy[«variableName»] = значение; Если вы используете это, это должно сработать 🙂

4. @Michiel: О, я забыл об этом. Вы должны добавить это в качестве ответа.

Ответ №3:

Итак, чтобы добавить к ответу Кэмерона

вы можете создать более общую функцию для изменения переменных. Я продемонстрирую небольшой пример ниже

 private function tweenIt(anEnemy:Enemy, variableName:String, value:Number):void
{
    anEnemy[variableName] = value;
}
  

Вышеупомянутая функция обновит текущее значение нужной вам переменной, поэтому, если вы введете следующее:

 tweenIt(enemy, "width", 200);
  

это обновит ширину вашего вражеского объекта до 200 🙂 И это должно сработать 🙂