Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   lineStyle и this - взаимовдействие между функциями класса (http://www.flasher.ru/forum/showthread.php?t=105092)

Thanx7 07.12.2007 14:31

lineStyle и this - взаимовдействие между функциями класса
 
Почему вот так вот линия рисуется:
(хоть lineStyle и задаётся однажды)

Код:

public function constr ():void
{
        graphics.moveTo (x0+amp, y0);                       
        graphics.lineStyle (2, color, 1);
        i.addEventListener (Event.ENTER_FRAME,ii);
        addChild (i);
}

public function ii (evt:Event):void
{
        with (evt.currentTarget)
        {
                        this.graphics.lineTo (x_coord, y_coord);

и так рисуется (ну, это понятно, в каждом фрейме прописываем lineStyle):

Код:

public function constr ():void
{
        graphics.moveTo (x0+amp, y0);                       
        i.addEventListener (Event.ENTER_FRAME,ii);
        addChild (i);
}

public function ii (evt:Event):void
{
        with (evt.currentTarget)
        {
        graphics.lineStyle (2, color, 1);
        graphics.lineTo (x_coord, y_coord);

а вот так не рисуется:

(this не присутствует в коде)

Код:

public function constr ():void
{
        graphics.moveTo (x0+amp, y0);                       
        graphics.lineStyle (2, color, 1);
        i.addEventListener (Event.ENTER_FRAME,ii);
        addChild (i);
}

public function ii (evt:Event):void
{
        with (evt.currentTarget)
        {
                        graphics.lineTo (x_coord, y_coord);


dimpiax 07.12.2007 15:01

потому что область видимости неправильная...
Код:

graphics.lineStyle (2, color, 1); // вот это к чему привязывается?
есстественно, что не к evt.currentTarget

dimpiax 07.12.2007 15:33

о чем я и говорил:
Код:

package com.dimpiax{

        // *** IMPORT
          import flash.display.Sprite;

        import flash.events.Event;
       
       
        // *** CLASS
        public class Draw extends Sprite {
               
                // *** CONSTRUCTOR
                public function Draw () {
                        var s:Sprite = new Sprite();
                        s.graphics.moveTo (0, 0);
                        s.graphics.lineStyle (2);
                        s.addEventListener (Event.ENTER_FRAME,ii);
                        addChild (s);
                }
               
                // *** METHODS
                public function ii (evt:Event):void {
                        with (evt.currentTarget) {
                                graphics.lineTo (10, 10);
                        }
                }               
        }
}

UPD:
Код:

package com.dimpiax{

        // *** IMPORT
        import flash.display.Sprite;

        import flash.events.Event;
        import flash.events.MouseEvent;


        // *** CLASS
        public class Draw extends Sprite {

                // *** CONSTRUCTOR
                public function Draw () {
                        var s:Sprite = new Sprite();
                        s.graphics.moveTo (0, 0);
                        s.graphics.lineStyle (1);
                        s.addEventListener (MouseEvent.MOUSE_MOVE, generate);
                        s.addEventListener (Event.ENTER_FRAME, drawLines);
                        addChild (s);
                }
                // *** METHODS
                private function generate (evt:Event):void {
                        var ran:Number = Math.floor(Math.random()*0xFFFFFF);
                        with (evt.currentTarget) {
                                graphics.lineStyle (1, ran);
                        }
                }
                private function drawLines (evt:Event):void {
                        var ranX:Number = Math.random()*2;
                        var ranY:Number = Math.random()*4;
                       
                        with (evt.currentTarget) {
                                graphics.lineTo (mouseX/ranX, mouseY/ranY);
                        }
                }
        }
}

зы: вопрос к более опытным: почему иногда рисуются непонятные квадраты, при рисовании линии, это как назвать и почему оно возникает? :)

Thanx7 07.12.2007 18:19

Огромное спасибо. Благодаря Вашему совету разобрался и переписал код, убрав всё лишнее:

(например, убрал создание внутреннего спрайта i, т.к. это совершенно лишнее, ведь сам класс у нас спрайт и addChild делается в вызывающем классе)

Код:

public function constr ():void
{
        graphics.moveTo (x0+amp, y0);                       
        graphics.lineStyle (2, color, 1);
        addEventListener (Event.ENTER_FRAME,ii);
}

public function ii (evt:Event):void
{
        with (evt.currentTarget)
        {
                        graphics.lineTo (x_coord, y_coord);

Просто песня! Никаких лишних this. И не нужен внутренний спрайт! Всё работает.

BlooDHounD 07.12.2007 19:08

мдя ... нужно не избавляться от this, а писать его везде где можно :)

etc 07.12.2007 23:40

this обязателен всегда и везде. И точка.

Thanx7 08.12.2007 00:35

Цитата:

Сообщение от __etc
this обязателен всегда и везде. И точка.

Ага. Тогда я завтра перепишу код так:

Код:

public function constr ():void
{
        this.graphics.moveTo (x0+amp, y0);                       
        this.graphics.lineStyle (2, color, 1);
        this.addEventListener (Event.ENTER_FRAME,ii);
}

public function ii (evt:Event):void
{
        with (evt.currentTarget)
        {
                        this.graphics.lineTo (x_coord, y_coord);

Кстати, там, где this помечен красным, его тоже нужно ставить? Просто так и хочется написать this.evt.currentTarget.graphics.lineTo. Это не строчка, а ужас, конечно, но у меня пока всё не укладывается в голове.

BlooDHounD 08.12.2007 01:19

не нужно использовать with, он только сбивает с толку и портит читабельность.

а вместо этого можно сделать так:
Код:

var g:Graphics = ( evt.currentTarget as Sprite ).graphics
g.lineTo (x_coord, y_coord);


Thanx7 10.12.2007 13:35

Цитата:

Сообщение от BlooDHounD
не нужно использовать with...

Спасибо, with убрал - код переписал. Теперь код понятнее смотрится.:)


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

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