2015-02-01 1 views
0

Я делаю игру в AS3 для школьного проекта (используя AIR api). У меня есть опыт работы в AS3 за год, поэтому я бы сказал, что я владелец, но не эксперт. Во всяком случае, я никогда не пытался создавать анимации спрайтов в AS3, и я не совсем уверен, как подойти к нему.Как создать анимацию в AS3?

Если я создаю список растровых изображений и вызываю addChild() и removeChild(), чтобы отображать каждый кадр анимации, это повлияет на частоту кадров, поскольку эти функции не очень эффективны (я пробовал это раньше, и это забивало мои если у меня слишком много анимаций, идущих сразу). Я также попытался создать список объектов BitmapData, добавив растровое изображение в список отображения, а затем указывая его на разные растровые изображения BitmapData, но это, похоже, не работает вообще.

Так что это лучший способ сделать это? Например, в XNA я создавал бы класс спрайтов, который рисовал бы на экране с помощью спрайта, тогда я бы создал список объектов спрайтов и прокрутил их для создания анимации. Есть ли способ добиться аналогичного результата в actionscript?

+1

Что не работает в том, чтобы ездить на велосипеде через BitmapDatas с одним растровым изображением? Прошло некоторое время с тех пор, как я сделал AS3, но я не вижу очевидной причины не делать этого. – 31eee384

+1

@ 31eee384 По-видимому, он установил 'cacheAsBitmap' на этом растровом изображении или на любом из родителей этого растрового изображения в true, это анимация на основе растровых винтов. – Vesper

+0

@ 31eee384 Я действительно нашел способ заставить его работать, мне просто нужно было установить данные растрового изображения сразу после создания объекта растрового изображения, прежде чем пытаться изменить какие-либо свойства. – android927

ответ

1

Первый (простой) способ: вы можете просто использовать мультикадровый MovieClip для анимации. Поместите изображение в каждый кадр, поставьте MovieClip на сцену, и все. Вы можете управлять этой анимацией, используя play(), stop(), gotoAndPlay(), gotoAndStop(). Он будет работать без особых проблем для общей игровой платформы (я сделал это сам давно).

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

Действительное блиттинг здесь происходит

destinationBitmapData.copyPixels(sourceBitmapData, areaRectangle, destinationPoint); 

Где destinationBitmapData ваш «холст», который вы блиттинг к; sourceBitmapData - это исходное изображение, содержащее все рамки анимации; areaRectangle - прямоугольник внутри исходного изображения, определяющий, какую область копировать; destinationPoint - левая верхняя координата области копирования на вашем холсте.

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

При этом уже существует ряд различных готовых двигателей, которые используют блиские и даже продвинутые методы, такие как 3D-ускорение для 2D спрайтов.

Один из них: Starling.

+0

Что касается первого решения, я работаю в flashdevelop, используя чистый actioncript, поэтому я не могу ничего делать с использованием flash. Второе решение может работать, поэтому я, вероятно, попробую это. Что касается скворца, я слышал хорошие вещи об этом, но я уже несколько дней в этом проекте и не могу позволить себе все изменить прямо сейчас. – android927

+0

Я также использую FlashDevelop, но я создаю все необходимые мувиклипы в Flash IDE, а затем просто публикую их как библиотеку SWC, которую я включаю в проект FD.Во Flash нет кода, просто графика. –