Мастер осади трюки

Всем привет,
мои уроки будут выходить по выходным.

Продолжим, сегодня я поделюсь некоторыми фишками которые я применил в Мастер Осады Два, и один тоже,
(по секрету а ви уже играли в crush the castle 2)

Для графики я исползую BitmapData и draw но чистый draw не подходит так как много есть статических обектив,
+ надо оптимизировать, у нас еще есть эффекты,
следовательно я использую:
— каждый обект имеет свой BitmapData и ссылку на начальную графику (без повор)
— в цикле, для видимых обектив (попадающие в экран) я вызываю метод render

                public function render(canvas:BitmapData, tx:Number, ty:Number):Boolean
                {
                        if (!_render) return false;
                        // начальние координати
                        _p.x = this.px - _bmpdc.width / 2 - tx;                                 
                        _p.y = this.py - _bmpdc.height / 2 - ty;                                
                        // тут пару проверок или обект видимий
                        if (_p.x + _bmpdc.width < 0) return false;
                        if (_p.x - _bmpdc.width > GameOptions.glScreenWidth) return false;
                        //
                        // разница в угле
                        var dd:Boolean = false;
                        _prevAd = _prevA  - this.a;
                        if (_prevAd < 0) _prevAd = - _prevAd;
                        // проверка или нужно переисововать
                        if (_prevAd > _minRenderAngle)
                        {
                                _mat.a = _mat.d = 1;
                                _mat.b = _mat.c = _mat.tx = _mat.ty = 0;
                                //
                                _mat.translate(-_bmpd.width*.5, -_bmpd.height*.5); 
                                _mat.rotate(this.a); 
                                _mat.translate(_bmpdc.width*.5 + _renderOffsetX, _bmpdc.height*.5 + _renderOffsetY); 
                                //
                                _bmpdc.fillRect(_bmpdc.rect, 0x00ffffff);
                                _bmpdc.draw(_bmpd, _mat, null, null, null, true);
                                //_bmpdc.draw(_bmpd, _mat);
                                //canvas.draw(_bmpd, _mat);                                     
                                _prevA = this.a;
                                dd = true;
                                //
                                if(this.hasGraphic)this.graphic.alpha = 1;
                        }
                        // ну и простой копи пиксель
                        canvas.copyPixels(_bmpdc, _bmpdc.rect, _p, null, null, true);
                        return dd;
                }               


и так я проверяю угл изменения и если он больше чем _minRenderAngle для обекта то перерисовую, иначи просто copyPixels,
для различных обектив _minRenderAngle разный (для маленки он больше)
в результате вызов draw проходит не каждый раз а мы знаем что copyPixels намного быстрее чем draw
Пример, draw — 90(красний), copyPixel — 710


Для ефекта отрива голови и разламывании статуй я испозую связку shape-ов


пример координат у меня сохранени в виде масива, монах

[[3.5, -20.4], [4.85, -17.1], [3.5, -13.8], [0.2, -12.45], [-3.1, -13.8], [-4.45, -17.1], [-3.1, -20.4], [0.2, -21.75]],
[[0, -11.55], [7.3, -10.95], [6.35, 21.95], [-5.35, 21.95], [-6.85, -9.45]]

тут два шейпа. так что если надо просто «разбиваем обект»

И тут вопрос как удобно редактировать, всьо просто спасибо тут WCK ви найдете два скрипта для Flash IDE,
первий ето Decompose Polygon — он переводит все полигони в масив координат и
Clear Outline для очистки.

Самое класное что подходит к Nape тоже.

Для ефектов крови и взривов я исползую stardust particle
с етим просто для каждива ефекта например FPBloodEffect(старий код на основе Flint Particles)

                public function FPBloodEffect(ini:Object = null) 
                {
                        super(ini);
                        // создаю 8 красних линий                       
                        counter = new Blast( 8 );                                       
                        
                        addInitializer( new SharedImage( new Line( 6 ) ) );                     
                        addInitializer( new ColorInit( 0xffB50510, 0xff933132) );
                        // тут сила вилета
                        var vel:Number = _ini.getNumber("velocity", 5);
                        
                        var ang:Number = -2 * Math.PI / 7 * Math.random();                      
                        addInitializer( new Velocity( new DiscSectorZone(new Point( 0, 0 ), vel*20, 5, ang, -ang) ) );
                        addInitializer( new Lifetime( 2 ) );

                        addAction( new Age( ) );
                        addAction( new Move() );
                        addAction( new Fade(0.75) );
                        addAction( new Accelerate( -1, 10));
                        addAction( new RotateToDirection( ));
                }


результат(тут рендер сделал отдельно что б било видно партикли)


P.S. если интересно коменти снизу, много пока я держу в секрете а то нехочу прежде времени спойлерить что будет в Мастер Осади Два, игра пока на 33% готова
  • +22

Комментарии (8)

0
Плюсанул. Классный пост, всегда интересно приоткрыть занавес продакшена и посмотреть как все сделано у комрадов. Для маленьких объектов я делаю пререндеры на каждый угол(целый) и копипикселс доставляет. Умножение вместо деления (*.5 вместо /2) — тоже айс, если целочисленное деление на 2,4,8 и др. степени двойки можно вобще юзать побитовый сдвиг (>>).
+1
согласен, но тут плохо подойдет потому как у меня еще есть трещини, кров, обекти все уникальние.
0
Да, если объектов много, то памяти откушает тоже достаточно.Но для часто встречающихся можно все повороты прокэшировать, а остальные матрицой поворачивать, тут приходится балансировать между размером отъедаемой памяти и скоростью копипикселса.
+3
да, да… fps или memory… как всегда сначала нужно сделать игру а потом оптимизировать :)
0
не боишься что и на 2ю часть будут писать рипоф?

Crush the castle 2 — хорош… поднял планку очень высоко…
+1
есть большой процент так как тема замков очень похожа,
но Мастер Осади 2 ето другое чем краш, я ж продолжаю тему первой части,
если помните у меня игра-пазл, и разние с-стеми запуска,
есть много нових вещей, которие я думаю окончательно покажут что игри разние а не рипоф.
+1
если нет то жалко будет потрачених пару месяцев…

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