Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Переворачивание карт (3D вращение) (http://www.flasher.ru/forum/showthread.php?t=142507)

firuz 22.07.2010 20:57

Переворачивание карт (3D вращение)
 
Всем привет. Столкнулся с задачей осуществления переворачивания карточек.
Имеется картинка. Ее надо разбить на 24 квадратика. Получатся карточки.
Положить их на сцену "рубашкой наверх".
А потом, случайным (а может быть заданным. пока все-равно) порядком переворачивать.

Главное что-бы переворачивание выглядело реалистично.

Я знаю, есть всякие пакеты построения трехмерных моделей. Ими сложно пользоваться, но научиться можно.
А вот как цельную картинку разбить на кусочки так, что бы кусочки представляли собой отдельные объекты с которыми можно работать?

Есть у кого какие идеи? Подскажите, пожалуйста.


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

gloomyBrain 22.07.2010 21:16

Да ничего сложного-то =) Вот, примерно так
Код AS3:

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;
 
                }
 
        }
 
}

Ну, это что касается разрезания. А вращение сделать не сложно. Используйте один объект Bitmap и 2 BitmapData (обложка и не обложка). Просто в нужный момент меняйте свойство Bitmap.bitmapData на ту битмапдату, которую нужно отобразить

Hidest 22.07.2010 22:28

А переворачивать можете, используя 3D трансформации. Рубашку менять на изображение, когда карта повернута к зрителю ребром.

firuz 23.07.2010 00:58

Ух ты! получается нужно сделать клип с картинкой кземпляром класса Generator и вызвать метод getBitmaps.

А результатом выйдут порезанные картиночки.
А результатом будут объекты result[ind] - массив этих картинок. Я правильно понял?

а как к ним обращаться?
Или это я уже перебрал с нескромностью?

ShockWave512 23.07.2010 01:47

осталось как то сделать закругленные углы :)

AlexDesinger 23.07.2010 10:49

осталось только в цикле создать спрайты, запихнуть туда картинки, расставить их по местам, подписать их на событие или рандомно проходиться по элементам массива и применить к ним псевдо 3d трансформацию вращения.

Hidest 23.07.2010 12:06

Закругленные углы:

Внизу Bitmap, у которой по необходимости меняем bitmapData. Сверху маской Shape, в нем graphics.drawRoundRect(...)

firuz 23.07.2010 12:44

а зачем закругленные углы. Мне они не нужны.
Сцена выглядит так:

На белом поле переворачиваются сами собой последовательно прямоугольнички (карточки), на обратно стороне которых части изображения. Когда все карточки перевернуты на сцене полноценная картинка. И так с несколькими картинками.
Что-то типа мозайки получается.

так как обратиться мне к результатам представленного класса?
Не так ли как я предположил в предыдущем своем сообщении?

AlexDesinger 23.07.2010 13:16

про углы эт шутка, обращайтесь к элементам массива, это удобнее всего.

firuz 26.07.2010 16:31

Друзья! Как мне теперь каждый разрезанный кусочек превратить в DisplayObject, что бы я мог с ним работать?
Так, это код в первом кадре. Я изменил немного подход GloomyBrain, написав это все не в классе.

Код AS3:

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()


Пытался добавить на экран вот так (последний цикл):
Код AS3:

for (var i:int = 0; i<24; i++) {
        addChild(picAr[i]);
}

Добавлено через 21 час 26 минут
Внутри основного цикла тоже не получается осуществить преобразование.. :(
помогите

Добавлено через 21 час 51 минуту
Ура! получилось!


Часовой пояс GMT +4, время: 07:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.