#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 🙂 И это должно сработать 🙂