Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите с работой с текущими объектами (http://www.flasher.ru/forum/showthread.php?t=157445)

alkven 06.06.2011 02:04

Помогите с работой с текущими объектами
 
Не знала, как точно назвать эту проблему, но суть такова: я создаю объект (квадрат) с помощью функции, передавая в неё параметры из другой функции, которая вызывается при клике на т.н. панель инструментов внизу экрана.
Как это всё выглядит: http://img0.liveinternet.ru/images/a...0031_task4.swf
Если происходит нажатие на квадрат, всплывает меню с опциями поворота и перекрашивания.
Так вот вопрос: При выборе пункта "поворот" или "перекрасить" должен перекраситься текущий объект (я чую, что необходимо использовать this), но у меня поворачиваются все квадраты на экране( Как модифицировать код, чтобы поворачивался текущий объект?

Пробовала делать повторение одного и того же куска кода семь раз, но с разными размерами квадрата, однако это решение какое-то совсем не изящное.
Буду благодарна за помощь, т.к. в as3 работаю всего ничего и самой мне так сразу не разобраться.

Кусок кода
Код AS3:

function Cube1Tool(e:MouseEvent):void
{
        CubeTool(1,12.5,acube1);                       
}
function Cube2Tool(e:MouseEvent):void
{
        CubeTool(2,25,acube2);                       
}
function Cube3Tool(e:MouseEvent):void
{
        CubeTool(3,50,acube3);                       
}
function Cube4Tool(e:MouseEvent):void
{
        CubeTool(4,75,acube4);                       
}
function Cube5Tool(e:MouseEvent):void
{
        CubeTool(5,100,acube5);                       
}
function Cube6Tool(e:MouseEvent):void
{
        CubeTool(6,150,acube6);                       
}
function Cube7Tool(e:MouseEvent):void
{
        CubeTool(7,200,acube7);                       
}
 
 
function CubeTool(a:int,siz:Number,acube:Object):void
{
        acube.visible=true;
        var rect:Sprite = new Sprite();
        rect.graphics.lineStyle(2,0xffffff);
        rect.graphics.beginFill(0x000000);
        rect.graphics.drawRect(-siz/2,-siz/2,siz,siz);
        rect.graphics.endFill();
        rect.x+=282.5;
        rect.y+=150;
        addChild(rect);
        board.addChild(rect);
        acube.addEventListener(MouseEvent.MOUSE_UP, AcubeTool);
        rect.addEventListener(MouseEvent.MOUSE_DOWN, Popup);
        rect.addEventListener(MouseEvent.MOUSE_DOWN, drag);
        rect.addEventListener(MouseEvent.MOUSE_UP, stopdrag);
 
        function drag(e:MouseEvent):void
        {
                rect.startDrag();
        }
 
        function stopdrag(e:MouseEvent):void
        {
                rect.stopDrag();
        }       
 
        function Popup(e:MouseEvent):void
        {
                popupmenu.visible=true;
                popupmenu.rollright.addEventListener(MouseEvent.MOUSE_UP, RollR);
                popupmenu.rollleft.addEventListener(MouseEvent.MOUSE_UP, RollL);
                popupmenu.repaintTool.addEventListener(MouseEvent.MOUSE_UP, RepaintTool);
 
                function RollR(e:MouseEvent):void
                {
                        rect.rotation += 15;
                        popupmenu.visible=false;
                }
                function RollL(e:MouseEvent):void
                {
                        rect.rotation -= 15;
                        popupmenu.visible=false;
                }
 
                function RepaintTool(e:MouseEvent):void
                {
                        var colorInfo:ColorTransform = rect.transform.colorTransform;
                        colorInfo.color = 0x123456;
                        rect.transform.colorTransform = colorInfo;
                        popupmenu.visible=false;
                }
        }
 
        function AcubeTool(e:MouseEvent):void
        {
                acube.visible=false;
                RemoveObject.remove(rect);
                addChild(rect);
                RemoveObject.remove(rect);       
        }
}


tsarapkabel 06.06.2011 13:30

Здесь на мой взгляд лучше будет сохранять ссылку на выбранный объект и вертеть уже её.
Код AS3:

package  {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class NewClass extends Sprite {
                private var sprite:Sprite;
                private var spriteVar:Object;
 
                public function NewClass() {
                        var button:Sprite = new Sprite(); //Круглая кнопка вращения
                        button.graphics.lineStyle(0);
                        button.graphics.beginFill(0x883355);
                        button.graphics.drawCircle (50, 50, 25);
                        button.graphics.endFill();
                        addChild(button);
                        button.buttonMode = true;
                        button.addEventListener(MouseEvent.CLICK, rotateSprite);
                        createRect(50, 100, 70, 58);
                        createRect(150, 100, 80, 68);
                        createRect (250, 100, 90, 78);       
                }
 
                private function createRect(xPosition:Number, yPosition:Number, width:Number, height:Number):void {
                        sprite = new Sprite();
                        sprite.graphics.lineStyle(2);
                        sprite.graphics.beginFill(0x668800);
                        sprite.graphics.drawRect(0, 0, width, height);
                        sprite.graphics.endFill();
                        addChild(sprite);
                        sprite.x = xPosition;
                        sprite.y = yPosition;
                        sprite.buttonMode = true;
                        sprite.addEventListener(MouseEvent.CLICK, onClick);
                }
 
                private function onClick(event:MouseEvent):void {
                        spriteVar = event.target; //при нажатии на квадрат, сохраняем на него ссылку
                }
 
                private function rotateSprite(event:MouseEvent):void {
                        if (spriteVar != null) {
                                trace (spriteVar);
                                spriteVar.rotation += 15; //крутим ссылку
                        } else {
                                trace ("Please, select rectangle first.");
                        }
                }
        }
}


MAPUTO 06.06.2011 13:44

В функцию вращения не мешало бы добавить ссылку на объект и обращение уже будет идти не к rect, а к нужному имени объекта через ссылку.

А лучше использовать не rect, а acube
Код AS3:

                function RollR(e:MouseEvent):void
                {
                        acube.rotation += 15;
                        popupmenu.visible=false;
                }
                function RollL(e:MouseEvent):void
                {
                        acube.rotation -= 15;
                        popupmenu.visible=false;
                }


alkven 06.06.2011 20:13

tsarapkabel, ооо.
Цитата:

Сообщение от tsarapkabel (Сообщение 1001542)
Здесь на мой взгляд лучше будет сохранять ссылку на выбранный объект и вертеть уже её.

Ммм, я думала про нечто подобное, пыталась имена присваивать спрайтам, но до ссылок я не додумалась, всё-таки очень тяжело идёт ещё флэш)
Спасибо большое за подсказку, всё получилось! Изменила так:

Код AS3:

function CubeTool(a:int,siz:Number,acube:Object):void
{
        acube.visible=true;
        var rect:Sprite = new Sprite();
        rect.graphics.lineStyle(2,0xffffff);
        rect.graphics.beginFill(0x000000);
        rect.graphics.drawRect(-siz/2,-siz/2,siz,siz);
        rect.graphics.endFill();
        rect.x+=282.5;
        rect.y+=150;
        addChild(rect);
        board.addChild(rect);
        acube.addEventListener(MouseEvent.MOUSE_UP, AcubeTool);
        rect.addEventListener(MouseEvent.MOUSE_DOWN, Popup);
        rect.addEventListener(MouseEvent.MOUSE_DOWN, drag);
        rect.addEventListener(MouseEvent.MOUSE_UP, stopdrag);
        rect.buttonMode = true;
        rect.addEventListener(MouseEvent.CLICK, onClick);
 
        function onClick(event:MouseEvent):void
        {
                spriteVar = event.target; //при нажатии на квадрат, сохраняем на него ссылку
        }
 
        function drag(e:MouseEvent):void
        {
                rect.startDrag();
        }
 
        function stopdrag(e:MouseEvent):void
        {
                rect.stopDrag();
        }       
 
        function Popup(e:MouseEvent):void
        {
                popupmenu.visible=true;
                popupmenu.rollright.addEventListener(MouseEvent.MOUSE_UP, RollR);
                popupmenu.rollleft.addEventListener(MouseEvent.MOUSE_UP, RollL);
                popupmenu.repaintTool.addEventListener(MouseEvent.MOUSE_UP, RepaintTool);
 
                function RollR(e:MouseEvent):void
                {
                        if (spriteVar != null)
                        {
                                trace (spriteVar);
                                spriteVar.rotation += 15; //крутим ссылку
                        }
                        else
                        {
                                trace ("Please, select rectangle first");
                        }
                        //rect.rotation += 15;
                        popupmenu.visible=false;
                }
                function RollL(e:MouseEvent):void
                {
                        if (spriteVar != null)
                        {
                                trace (spriteVar);
                                spriteVar.rotation -= 15; //крутим ссылку
                        }
                        else
                        {
                                trace ("Please, select rectangle first");
                        }
                        //rect.rotation -= 15;
                        popupmenu.visible=false;
                }
 
                function RepaintTool(e:MouseEvent):void
                {
                        var colorInfo:ColorTransform = rect.transform.colorTransform;
                        if (spriteVar != null)
                        {
                                trace (spriteVar);
                                colorInfo.color = 0x123456;
                                spriteVar.transform.colorTransform = colorInfo;// apply the change to the display object
                                popupmenu.visible=false;
                        }
                        else
                        {
                                trace ("Please, select rectangle first");
                        }
 
                }
        }
 
        function AcubeTool(e:MouseEvent):void
        {
                acube.visible=false;
                RemoveObject.remove(rect);
                addChild(rect);
                RemoveObject.remove(rect);               
        }
}

MAPUTO, дада, ссылки были здравым решением. Кстати объект acube - это квадраты с галочками на панели инструментов. Они в принципе не связаны с rect.

Спасибо ещё раз за помощь!


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

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