Запретить изменение высоты объекта DisplayObject - PullRequest
2 голосов
/ 08 марта 2011

Есть ли способ предотвратить автоматическое изменение свойства высоты объекта DisplayObject?Это автоматически изменяет размер, чтобы соответствовать содержанию, хотя мой файл swf имеет высоту 32 пикселя.Приведенный ниже код может доказать это, первый кадр врага. Высота равен 32, но позже 27,5, и это портит мой сценарий.

getRect () и getBounds () возвращают точнотак же.Кроме того, я хочу знать, почему в первом кадре она показывает правильную высоту, а во втором она изменяется, она должна показывать 27,5 с начала.

package {
    import flash.display.Sprite;
    import flash.events.Event;
    public class Main extends Sprite {
        private var enemy:Sprite;
        [Embed(source = '../lib/enemy.swf')] private var swf:Class;
        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function update(e:Event):void {
            trace(enemy.height);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            enemy = new swf();
            addChild(enemy);
            addEventListener(Event.ENTER_FRAME, update);
        }

    }

}

Ответы [ 4 ]

4 голосов
/ 11 марта 2011

Это связано с тем, что вы создаете экземпляр целого SWF-файла, и для его синхронизации с основным SWF-файлом должен пройти 1 кадр. То, что я хотел бы сделать, это экспортировать символ в .fla, а затем использовать синтаксис «вставлять символ» во Flex:

[Embed(source='enemy.swf#Symbol1')]
private var swf:Class;

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

2 голосов
/ 08 марта 2011

«Хакерское» решение может состоять в том, чтобы добавить фигуру врагу, который имеет максимальный размер, который вы хотите, а затем сделать его невидимым. Таким образом, я создал хитбоксы для объектов, и они работали довольно хорошо.

Один из способов - добавить его при создании объекта в IDE Flash. Просто нарисуйте его и расположите так, как вы хотите, чтобы фигура была, а затем присвойте ему имя экземпляра, например «sizeHolder». После того, как вы создадите врага, вы позвоните

enemy.sizeHolder.visible = false;

В Flash IDE вы можете поместить его на другую временную шкалу, затем сделать эту временную шкалу невидимой и заблокировать ее, чтобы она не мешала вам при редактировании реального объекта.

Другой способ - добавить его по коду. Нарисуйте объект в другом объекте DisplayObject, установите его как невидимое, а затем добавьте его враг.

1 голос
/ 16 марта 2011

Последовательность анимации вражеского спрайта будет варьироваться по высоте. Это часть процесс анимации. Следовательно фактическая высота на кадр будет варьироваться на основе ограничительной рамки спрайта. Как вы очень хорошо заметили, это поведение по умолчанию .

Способы:

  • Тот, за которым вы в настоящее время следите, сохраняя высоту и используя для расчетов. (Лучше)
  • Как предположил EyeSeeEm, если я правильно понял, что у него был спрайт с невидимой высотой, с надлежащим центрированием центральной точки клипа и центрированием спрайта в каждом кадре, который должен содержаться в границах спрайта невидимой высоты.

Вы часто обнаружите, что в скрипте действия вы встретите функции, которые работают не так, как вы этого хотите. Важно то, что вы адаптируете кодирование для облегчения решения. Это не хак или неэффективно, когда кодирование / метод позволяют легко вносить дальнейшие изменения / расширения.

P.S:

Это будет зависеть от ситуации, но лично я предпочел бы, чтобы высота была динамической в ​​соответствии с экземпляром спрайтовой анимации, поэтому любые удары врага снарядами чуть ли не над его головой фактически не убивают врага.

0 голосов
/ 08 марта 2011

Попробуйте

import flash.display.StageAlign;
import flash.display.StageScaleMode;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
...