![]() |
|
||||||||||
|
|||||
|
[+1 13.07.11]
[++1 13.07.11] Регистрация: Dec 2009
Сообщений: 42
|
всем привет
![]() Делаю игру с физикой, при нажатии на некоторые элементы они удаляются, сейчас они просто исчезают, а я хочу чтобы они это делали красиво, нужно реализовать эффект уничтожения (точнее нужно чтоб спрайт какбэ разваливался на части и исчез постепенно) мувиклипа, всё это дело нужно навесить на собитие при клике. Вот, буду рад любой помощи по данному вопросу (Отдельно эффект рисовать для каждого спрайта не вариант, так как объектов очень много и все разных размеров и пр.).. заранее спасибо ![]() |
|
|||||
|
У Вас проблема "развалить" объект и навесить событие на клик одновременно? Думаю, проблемы несовместимы по сложности
![]() Вообще, развалить можно нарезав на куски с помощью масок, не сильно реалистично, но однозначно лучше, чем просто "убить" мувик. |
|
|||||
|
[+1 13.07.11]
[++1 13.07.11] Регистрация: Dec 2009
Сообщений: 42
|
Нужно всё это дело программно сделать, чтобы мувик какбэ рассыпался, для каждого анимацию делать не вариант ибо их кучи (разных естественно), не шибко важно реалистично или нет, главное чтоб смотрелось нормально. Чтот совсем видимо не помогут
![]() |
|
|||||
|
Цитата:
1. режете объект на кусочки: 1.1. делаете N копий объекта. Просто создайте Bitmap'ы, в них отрисуйте картину объекта; 1.2. рисуете N треугольников (на Shape), хаотично, но лучше чтобы четко - треугольник к треугольнику. Это будут какбэ (как Вы говорите ) маски;1.3. применяете каждой копии маску, получается кусочек объекта; 2. анимируете каждый кусочек, например, плавное движение от центра и в прозрачность. 3. удаляете все кусочки из памяти (BitmapData.dispose()) Способ ресурсоемкий, но работать будет. |
|
|||||
|
[+1 13.07.11]
[++1 13.07.11] Регистрация: Dec 2009
Сообщений: 42
|
План хороший, годный. Спасибо. Но так как AS3 я учу относительно недавно, то и проблем тут с этим планом у меня достаточно. Буду пробовать, но если вдруг ещё кто что знает по теме - не стесняйтесь, выкладывайте
![]() |
|
|||||
|
[+1 19.06.10]
[+1 27.07.10] Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
|
вариант номер 2:
каждый мувик, который мы будем колбасить, при создании будет состоять из Shape-ов. Собранные в кучу методом myMovieClip_01.addChild(myShape_09) будут смотреться как то, что вам нужно. Затем, када надо убить конкретный мувик, мы берем все его чилды childobj=getChildAt(j), где j = 1..myMovieClip_01.numChildren и делаем addChild(childobj). Что по сути означает, что objchild (маленький Shape из состава убиваемого мувика) перестает быть его чилдом и становится чилдом сцены. Визуально (если скорректирвоать координаты x, y) ничего не будет заметно на этом шаге. После этого можно красиво с помощью Math.random() двигать шейпы в разные стороны с разной скоростью. Пока они не выйдут за пределы сцены где их физически уничтожить.... |
|
|||||
|
Не универсально, ибо мувики всякие бывают. Зависит от случая.
|
|
|||||
|
[+1 19.06.10]
[+1 27.07.10] Регистрация: Aug 2009
Адрес: UTC+2
Сообщений: 353
|
вполне универсально, поскольку поставлена задача делать все программно.
генерить мувики можно программно. в соответствии с каким-либо законом (формулой), описывающей мувик. и можно несколько методов разрушения в классе описать. а вообще, я сторонник созидательных процессов. лучше созидать мувик красиво, чем разрушать его ![]() |
|
|||||
|
Можно пиксельным эффектом, например. Писалось мной давно, наверное криво, разбираться и комментировать лень =)
И не спрашивайте меня, почему они начинают прыгать, я не помню ![]() package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieClip; import flash.filters.BlurFilter; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; import flash.events.Event; import flash.events.MouseEvent; /** * ... * @author FluFme http://www.flufme.ru */ public class Main extends MovieClip { private var bitmapData:BitmapData = new BitmapData(w, h, false, 0xFFFFFF); private var bitmap:Bitmap = new Bitmap(bitmapData); private var pixelArray:Array = []; private const w:int = 550; private const h:int = 400; private const actualWidth:int = 100; private const actualHeight:int = 100; private var image:BitmapData = new Img1(1,1); //private var image2:BitmapData = new Img2(1,1); private var areaRect:Rectangle = new Rectangle(0, 0, w, h); var m:Matrix = new Matrix(1, 0, 0, 1, int(w/2-actualWidth/2), int(h/2-actualHeight/2)); private var l:int; private var xRandomility:int = 100; private var yRandomility:int = 50; private var fallSpeed:Number = 0.25; private var friction:Number = 0.9999; private var runing:Boolean = false; private var blurPoint:Point = new Point(); private var blurFilter:BlurFilter = new BlurFilter(2, 2, 2); private var time:uint = 0; public function Main() { super(); addChild(bitmap); //bitmapData.fillRect(new Rectangle(0, 0, 200, 200), 0x88FF88); resetObjects(); pixelArray.sortOn("color"); for (var i:int = 0; i < l; i++) { //trace(pixelArray[i].color); } stage.addEventListener(MouseEvent.CLICK, onClick); } private function onClick(e:MouseEvent):void { if (!runing) { addEventListener(Event.ENTER_FRAME, enterFrame); } else { time = 0; removeEventListener(Event.ENTER_FRAME, enterFrame); resetObjects(); } runing = !runing; } private function resetObjects():void { pixelArray = getPixelArray(image); l = pixelArray.length; bitmapData.fillRect(areaRect, 0xFFFFFF); var pixel:Pixel; for (var i:int = 0; i < l; i++) { pixel = pixelArray[i] as Pixel; pixel.cdx = Math.floor(Math.random() * xRandomility - xRandomility / 2)/10; pixel.cdy = -Math.round(Math.random() * yRandomility + yRandomility / 2)/10; pixel.dx = friction; pixel.dy = fallSpeed; pixel.x += m.tx; pixel.y += m.ty; } bitmapData.draw(image, m); } private function enterFrame(e:Event):void { var dx:Number; var dy:Number; var fx:Number; var fy:Number; var color:uint; var i:int; var j:int; var dist:int; var angle:uint; bitmapData.fillRect(areaRect, 0xFFFFFF); for (i=0; i < l; i ++) { var pixel:Pixel = pixelArray[i]; //if (time < 30) //{ pixel.cdx *= pixel.dx; pixel.cdy += pixel.dy; color = pixel.color; //} //else { //var t:Number = Math.atan2(h/2-mouseY,w/2 - mouseX); //pixel.cdx += Math.cos((pixel.x-mouseX)/(pixel.x-mouseX)) * pixel.dx; //pixel.cdy += Math.sin((pixel.y-mouseY)/(pixel.y-pixel.x)) * pixel.dy; //pixel.cdx = Math.sin(time/20)*2; //pixel.cdy = Math.cos(time/20)*2; //pixel.cdy = (h/2-mouseY)/100; //} if (pixel.x > w || pixel.x<0) pixel.cdx *= -1; if (pixel.y > h || pixel.y<0) pixel.cdy *= -1; pixel.x += pixel.cdx; pixel.y += pixel.cdy; bitmapData.setPixel32(pixel.x , pixel.y, color); } time++; bitmapData.applyFilter(bitmapData, areaRect, blurPoint, blurFilter); } private function getPixelArray(bmpData:BitmapData):Array { var arr:Array = []; var li:int = bmpData.width; var lj:int = bmpData.height; var col:uint; for (var i:int = 0; i < li; i++) { for (var j:int = 0; j < li; j++) { col = bmpData.getPixel32(i, j); if (col) arr.push(new Pixel(i, j, col)); } } return arr; } } } package { /** * @author FluFme */ public class Pixel { public var x:int; public var y:int; public var cdy:Number=0; public var cdx:Number=0; public var dx:Number; public var dy:Number; public var color:uint; public function Pixel(_x:int, _y:int, _color:uint) { x = _x; y = _y; color = _color; } } }
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:32. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| эффект |
|
|