Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как создать кодом скругленный прямоугольнег? (http://www.flasher.ru/forum/showthread.php?t=100594)

Ariel 31.08.2007 04:52

Как создать кодом скругленный прямоугольнег?
 
Как создать кодом скругленный прямоугольнег? Заодно и с градиентной заливкой. Юзаю сейчас какой-то левый класс.

Kikasso 31.08.2007 04:56

вам потребуются следующие заклинания:
Цитата:

Сообщение от F1
lineStyle()
beginGradientFill()
moveTo()
lineTo()
curveTo()
lineTo()
curveTo()
endFill()


Ariel 31.08.2007 06:17

эхзампель эсть?

artcraft 31.08.2007 07:03

вот, as2 класс
правда я на скорую руку удалил лишнее... после приличного количества мартини экстра драй :~) надеюсь не в ущерб работоспособности класса...
экземпляры прямоугольников нужно создавать при помощи функции createRect, надеюсь вы разберётесь :~)

Код:

class zh.Rect extends MovieClip{
        private var _w:Number;
        private var _h:Number;
        private var _color;
        private var _borderColor:Number;
        private var _r:Array;
        private var _border:Number;

        public function set w (val:Number):Void{_w=val; draw();}
        public function get w ():Number{return(_w);}       
        public function set h (val:Number):Void{_h=val; draw();}
        public function get h ():Number{return(_h);}       
        public function set color(val):Void{_color=val; draw();}


        public static function createRect(
                parent:MovieClip, name:String, depth:Number,
                w:Number, h:Number, r, color, border:Number, borderColor:Number
        ):MovieClip{
                var params = [w, h, r, color, border, borderColor];
                var mc:MovieClip = parent.createEmptyMovieClip(name, depth);
                mc.__proto__ = Rect.prototype;
                mc.constructor = Rect;
                mc.constructor.apply(mc, params);
                return(mc);
        }
       
        function Rect(wVal:Number, hVal:Number, rVal, colorVal, borderVal:Number, borderColorVal:Number){       
                if(wVal){_w=wVal}else{_w=100;}
                if(hVal){_h=hVal}else{_h=30;}
                if(typeof(rVal)=='object'){_r=rVal;}else if(typeof(rVal)=='number'){_r=[rVal,rVal,rVal,rVal];}else{_r=[0,0,0,0];}
                if(colorVal){_color=colorVal}else{_color=0xCC3300;}
                if(borderVal){_border=borderVal}else{_border=0;}
                if(borderColorVal){_borderColor=borderColorVal}else{_borderColor=0x333333;}
               
                draw();
        }       
       
        public function move(x,y):Rect{
                _x=x;
                _y=y;
                return(this);
        }
       
        private function draw():Void{
                clear();
               
                if(_border==0){
                        drawNoborderRect(0, 0, _w, _h, _r, _color);
                }else{
                        drawNoborderRect(0, 0, _w, _h, _r, _borderColor);
                       
                        var border:Number=_border;
                        if(border>Math.min(_w, _h)/2-.5){border=Math.min(_w, _h)/2-.5;}
                        var rr:Array=[];
                        for (var i:Number = 0; i<4; i++){
                                rr[i]=_r[i]-border;
                                if(rr[i]<0){rr[i]=0;}
                        }
                        drawNoborderRect(border, border, _w-2*border, _h-2*border, rr, _color);
                }
        }
       
        private function drawNoborderRect(x:Number, y:Number, w:Number, h:Number, r:Array, c:Number):Void{
                var theta:Number, angle:Number, cx:Number, cy:Number, px:Number, py:Number;
               
       
                beginFill(c);
               
                // theta = 45 degrees in radians
                theta = Math.PI/4;
               
                // draw top line
                moveTo(x+r[0], y);                               
                lineTo(x+w-r[1], y);
               
                //angle is currently 90 degrees
                angle = -Math.PI/2;
               
                // draw tr corner in two parts
                cx = x+w-r[1]+(Math.cos(angle+(theta/2))*r[1]/Math.cos(theta/2));
                cy = y+r[1]+(Math.sin(angle+(theta/2))*r[1]/Math.cos(theta/2));
                px = x+w-r[1]+(Math.cos(angle+theta)*r[1]);
                py = y+r[1]+(Math.sin(angle+theta)*r[1]);
                curveTo(cx, cy, px, py);               
                angle += theta;
                cx = x+w-r[1]+(Math.cos(angle+(theta/2))*r[1]/Math.cos(theta/2));
                cy = y+r[1]+(Math.sin(angle+(theta/2))*r[1]/Math.cos(theta/2));
                px = x+w-r[1]+(Math.cos(angle+theta)*r[1]);
                py = y+r[1]+(Math.sin(angle+theta)*r[1]);
                curveTo(cx, cy, px, py);
               
                // draw right line
                lineTo(x+w, y+h-r[2]);
               
                // draw br corner
                angle += theta;
                cx = x+w-r[2]+(Math.cos(angle+(theta/2))*r[2]/Math.cos(theta/2));
                cy = y+h-r[2]+(Math.sin(angle+(theta/2))*r[2]/Math.cos(theta/2));
                px = x+w-r[2]+(Math.cos(angle+theta)*r[2]);
                py = y+h-r[2]+(Math.sin(angle+theta)*r[2]);
                curveTo(cx, cy, px, py);
                angle += theta;
                cx = x+w-r[2]+(Math.cos(angle+(theta/2))*r[2]/Math.cos(theta/2));
                cy = y+h-r[2]+(Math.sin(angle+(theta/2))*r[2]/Math.cos(theta/2));
                px = x+w-r[2]+(Math.cos(angle+theta)*r[2]);
                py = y+h-r[2]+(Math.sin(angle+theta)*r[2]);
                curveTo(cx, cy, px, py);
               
                // draw bottom line
                lineTo(y+r[3], x+h);
               
                // draw bl corner
                angle += theta;
                cx = x+r[3]+(Math.cos(angle+(theta/2))*r[3]/Math.cos(theta/2));
                cy = y+h-r[3]+(Math.sin(angle+(theta/2))*r[3]/Math.cos(theta/2));
                px = x+r[3]+(Math.cos(angle+theta)*r[3]);
                py = y+h-r[3]+(Math.sin(angle+theta)*r[3]);
                curveTo(cx, cy, px, py);
                angle += theta;
                cx = x+r[3]+(Math.cos(angle+(theta/2))*r[3]/Math.cos(theta/2));
                cy = y+h-r[3]+(Math.sin(angle+(theta/2))*r[3]/Math.cos(theta/2));
                px = y+r[3]+(Math.cos(angle+theta)*r[3]);
                py = y+h-r[3]+(Math.sin(angle+theta)*r[3]);
                curveTo(cx, cy, px, py);
               
                // draw left line
                lineTo(x, y+r[0]);
               
                // draw tl corner
                angle += theta;
                cx = x+r[0]+(Math.cos(angle+(theta/2))*r[0]/Math.cos(theta/2));
                cy = y+r[0]+(Math.sin(angle+(theta/2))*r[0]/Math.cos(theta/2));
                px = x+r[0]+(Math.cos(angle+theta)*r[0]);
                py = y+r[0]+(Math.sin(angle+theta)*r[0]);
                curveTo(cx, cy, px, py);
                angle += theta;
                cx = x+r[0]+(Math.cos(angle+(theta/2))*r[0]/Math.cos(theta/2));
                cy = y+r[0]+(Math.sin(angle+(theta/2))*r[0]/Math.cos(theta/2));
                px = x+r[0]+(Math.cos(angle+theta)*r[0]);
                py = y+r[0]+(Math.sin(angle+theta)*r[0]);
                curveTo(cx, cy, px, py);
               
                endFill();
        }       
}


p.s.
я улетел в Швейцарию, чао :~)

p.p.s.
терпеть не могу тех кто пишет з.з.ы.

Ariel 31.08.2007 09:24

Вот спасибочки!! Реально удружили! Потащил разбираться!! Йес! Удачи в Швейцарии!

Хотя вообще странно, что к 8-ой версии Макромедия до сих пор не предоставила стандарного класса в коллекции draw для рисования скругленных прямоугольнегов.


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

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