|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
BitmapData#draw(...) проблеммы с применением трансформаций
Салют!
Задался задачей рендерить происходящее в игровом мире в Битмапу. Думал контейнер игрового мира не кидать на сцену вообще, а только делать его отпечатки в БитмапДату и Битмапой, которая будет в ДисплейЛисте, выводить. Идея проста и понятна, но вот никак не смог увидеть больше чем первую координатную плоскость иргового мира, а интересного много и на отрицательных координатах... Так же не смог применить масштабирование снимка игрового мира. Трейсил матрицу трансформации - там все ОК! Думал, что у меня не правильная расстановка объектов внутри мира и решил добавить его на сцену для проверки. Все оказалось на своих местах, но плюс ко всему снимок я получил такой как надо... А теперь вопрос: Как применить трансформации для ДисплейОбджекта, который отрисовывается в БитмапДату, не имея родителя? |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Пример маленький соберите, на котором трансформация не работает. Так сложно что-то сказать. Вы там clipRect неправильный указываете, что ли? И у вас объекты самодеятельностью на ADDED_TO_STAGE не занимаются?
|
|
|||||
TempProj.rar(1,23 КБ (1`264 байт)) - скомпилированый пример. По клику добавляет или убирает "игровой мир" со сцены. В битмапе видно результат.
Код: package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Matrix; public class Main extends Sprite { private var world:Sprite = new Sprite(); private var obj:Shape = new Shape(); private var data:BitmapData = new BitmapData(200, 150); private var tv:Bitmap = new Bitmap(data); private var trans:Matrix = new Matrix(); public function Main():void { // Мир с осями координат world.graphics.lineStyle(2); world.graphics.moveTo( -30, 0); world.graphics.lineTo( 30, 0); world.graphics.moveTo( 0, -20); world.graphics.lineTo( 0, 20); // Обьект мира с центром координат внутри изображения obj.graphics.beginFill(0xFF0000, 0.2); obj.graphics.drawCircle(0, 0, 35); obj.graphics.endFill(); obj.graphics.beginFill(0x00FF00, 0.2); obj.graphics.drawRect(-30, -20, 60, 40); obj.graphics.endFill(); world.addChild(obj); // Битмапа для съемки мира graphics.lineStyle(2); graphics.drawRect(97, 57, 206, 156); addChild(tv); tv.x = 100; tv.y = 60; // Трансформация снимка trans.scale(2, 2); trans.translate(0.5 * tv.width, 0.5 * tv.height); // Поехали... addEventListener(Event.ENTER_FRAME, handleEnterFrame); stage.addEventListener(MouseEvent.CLICK, handleClick); addChild(world); } private function handleClick(event:MouseEvent):void { if (contains(world)) removeChild(world); else addChild(world); } private function handleEnterFrame(event:Event):void { obj.rotationY += 5; // Изменение объекта data.fillRect(data.rect, 0); data.draw(world, trans); } } } |
|
|||||
Не пробовал, но, вроде как, люди обкатали на реальных проектах:
http://flashgameblogs.ru/blog/actionscript/1015.html Здесь было: http://www.flasher.ru/forum/blog.php?bt=7632 |
|
|||||
Регистрация: Jun 2012
Сообщений: 70
|
Проблема в вращении по оси Y. Если его убрать, то все нормально отрисовывается.
__________________
Блог: http://devizgl.blogspot.com/ |
|
|||||
Нашел проблему, но не знаю как сделать все красиво...
В примере я не зря поставил строчку Обычная растеризация мувиков мне не подойдет, так как в проекте я балуюсь с програмной анимацией и перспективой. Короче говоря, пока у объекта null-евая Matrix3d, все работает нормально, но как только вступает в силу ось Z, сразу же вылазит на ружу тот результат, который я показал в примере. Мое решение: Вместо применения матрицы трансформации к миру нужно самостоятельно изменять все объекты мира (попробовал - работает). А чтобы не баловаться с каждым объектом я запихнул мир в контейнер-обертку и провожу манипуляции над целим миром, а снимки делаю не мира, а обертки с миром. Если у кого есть решение получше, буду очень благодарен! Добавлено через 1 минуту Опоздал с постом... Но как я и писал - без Z-трансформации дело не пойдет |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
При желании проекцию можете взять у Stage, она будет точно такая же. Как нашел - не спрашивайте. Интуиция и немного экспериментов. Собственно, там больше не с чем экспериментировать было (в 3D), а что проекция потенциально настраивается, я знал раньше. |
|
|||||
Эксперименты примерно по той же теме.
Может быть, тоже поможет. Кстати, даже если и не пользоваться этими извращениями с отрисовкой в битмапу без родительского контейнера, ручной скейл на основе PerspectiveProjection получается чуть ли не в разы быстрее, чем использование Matrix3D
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
Часовой пояс GMT +4, время: 02:20. |
|
« Предыдущая тема | Следующая тема » |
|
|