|
|
|||||
Переворачивание карт (3D вращение)
Всем привет. Столкнулся с задачей осуществления переворачивания карточек.
Имеется картинка. Ее надо разбить на 24 квадратика. Получатся карточки. Положить их на сцену "рубашкой наверх". А потом, случайным (а может быть заданным. пока все-равно) порядком переворачивать. Главное что-бы переворачивание выглядело реалистично. Я знаю, есть всякие пакеты построения трехмерных моделей. Ими сложно пользоваться, но научиться можно. А вот как цельную картинку разбить на кусочки так, что бы кусочки представляли собой отдельные объекты с которыми можно работать? Есть у кого какие идеи? Подскажите, пожалуйста. Разрезать исходную картинку вне флеша я пока не принимаю во внимание, поскольку предполагаю, что есть возможность сделать это программно. Но если программно займет много времени и ресурсозатрат, то конечно буду резать вне флеша. |
|
|||||
Да ничего сложного-то =) Вот, примерно так
package { import flash.display.BitmapData; import flash.geom.Point; import flash.geom.Rectangle; /** * ... * @author gloomyBrain */ public class Generator { public static function getBitmaps(src:BitmapData, cols:int, rows:int):Vector.<BitmapData> { var result:Vector.<BitmapData> = new Vector.<BitmapData>(cols * rows, true); var ind:int = 0; var w:int = src.width / cols; var h:int = src.height / rows; var rect:Rectangle = new Rectangle(0, 0, w, h); for (var r:int = 0; r < rows; r++) { // r is row number rect.y = r * h; for (var c:int = 0; c < cols; c++) { // c is column number rect.x = c * w; ind = r * cols + c; result[ind] = new BitmapData(rect.width, rect.height, false); result[ind].copyPixels(src, rect, new Point(0, 0)); } } return result; } } }
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 22.07.2010 в 21:26. |
|
|||||
Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
|
А переворачивать можете, используя 3D трансформации. Рубашку менять на изображение, когда карта повернута к зрителю ребром.
|
|
|||||
Ух ты! получается нужно сделать клип с картинкой кземпляром класса Generator и вызвать метод getBitmaps.
А результатом выйдут порезанные картиночки. А результатом будут объекты result[ind] - массив этих картинок. Я правильно понял? а как к ним обращаться? Или это я уже перебрал с нескромностью? |
|
|||||
осталось как то сделать закругленные углы
|
|
|||||
Регистрация: Feb 2007
Сообщений: 563
|
осталось только в цикле создать спрайты, запихнуть туда картинки, расставить их по местам, подписать их на событие или рандомно проходиться по элементам массива и применить к ним псевдо 3d трансформацию вращения.
|
|
|||||
Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
|
Закругленные углы:
Внизу Bitmap, у которой по необходимости меняем bitmapData. Сверху маской Shape, в нем graphics.drawRoundRect(...) |
|
|||||
а зачем закругленные углы. Мне они не нужны.
Сцена выглядит так: На белом поле переворачиваются сами собой последовательно прямоугольнички (карточки), на обратно стороне которых части изображения. Когда все карточки перевернуты на сцене полноценная картинка. И так с несколькими картинками. Что-то типа мозайки получается. так как обратиться мне к результатам представленного класса? Не так ли как я предположил в предыдущем своем сообщении? |
|
|||||
Регистрация: Feb 2007
Сообщений: 563
|
про углы эт шутка, обращайтесь к элементам массива, это удобнее всего.
|
|
|||||
Друзья! Как мне теперь каждый разрезанный кусочек превратить в DisplayObject, что бы я мог с ним работать?
Так, это код в первом кадре. Я изменил немного подход GloomyBrain, написав это все не в классе. import flash.display.BitmapData; import flash.geom.Point; import flash.geom.Rectangle; /** * ... * @author gloomyBrain. Изменял я :) */ // создаем БигКартинка экземпляр класса pictt - расширение MovieClip. Просто мувик из библиотеки. var BigKartinka:pictt=new pictt(); //создаем БитМапдату для помещения туда картинки var myPic:BitmapData=new BitmapData(240,400); // рисуем в БитмапДату нашу БигКартинку myPic.draw(BigKartinka); //создаем массив для хранения кусочков. НО ЗАЧЕМ? я зачем-то это придумал. а смысла ноль. var picAr:Array = new Array(); //применяем функцию гетБитмапс к нашей битмапе с БигКартинка getBitmaps(myPic, 4, 6); function getBitmaps(src:BitmapData, cols:int, rows:int):Vector.<BitmapData> { var result:Vector.<BitmapData>=new Vector.<BitmapData>(cols*rows,true); var ind:int=0; var w:int=src.width/cols; var h:int=src.height/rows; var rect:Rectangle=new Rectangle(0,0,w,h); for (var r:int = 0; r < rows; r++) {// r is row number rect.y=r*h; for (var c:int = 0; c < cols; c++) {// c is column number rect.x=c*w; ind=r*cols+c; result[ind]=new BitmapData(rect.width,rect.height,false); result[ind].copyPixels(src, rect, new Point(0, 0)); // Вот тут мне кажется ошибка. Я просто перегоняю картиночки в массив, не изменяя их. picAr[ind]=result[ind]; } } return result; } // Этот цикл перебирает массив picAr, который как я надеюсь // содержит в себе 24 кусочка первоначальной картинки for (var i:int = 0; i<24; i++) { } Все компилириуется без ошибок. Но и на экране ничего нет. Оно и понятно. Я ничего на сцену не добавлял. При попытке добавить на сцену элементы массива picAr, выдается ошибка: TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать flash.display::BitmapData@10ce2151 в flash.display.DisplayObject. at piiiic_fla::MainTimeline/frame1() Пытался добавить на экран вот так (последний цикл): Добавлено через 21 час 26 минут Внутри основного цикла тоже не получается осуществить преобразование.. помогите Добавлено через 21 час 51 минуту Ура! получилось! Последний раз редактировалось firuz; 27.07.2010 в 13:40. |
Часовой пояс GMT +4, время: 02:02. |
|
« Предыдущая тема | Следующая тема » |
|
|