AS3 заставить врага двигаться к мышке - PullRequest
1 голос
/ 01 октября 2011
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 для программирования.Когда я делаю что-то вроде врага.х + = 1, это работает, но когда я пытаюсь использовать сценарий анимации движения, враг останавливается независимо от положения мыши.Спасибо, Blobstah

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

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

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

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

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

rotation = atan2(yDistance, xDistance);

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

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

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

1 голос
/ 01 октября 2011

Вы передаете значение позиции врага 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;
    }

    // ...
}
0 голосов
/ 01 октября 2011

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

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

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

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

tweenIt(enemy, "width", 200);

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

...