Форум 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=199703)

Nastia_22 22.05.2013 23:55

Динамическое изменение длины линии
 
Здравствуйте уважаемые гуру AS3

уже неделю бьюсь над вроде бы простой задачей.
Имеется пользовательский класс Nit (с параметром h), которые создает линию(нить). В этом классе есть метод, который должен увеличивать или уменьшать размер нити по оси y.

В главном классе два объекта класса Nit, и при нажатии на кнопку они должны плавно "растягиваться" или сужаться до определенного момента.

Проблема в том, что длину нити код меняет, а перерисовывать объект с новыми координатами не перерисовыет.
толку у меня не хватет.

Класс:
Код AS3:

package atv{
        import flash.geom.*;
        import flash.display.*;
        public class Nit extends Sprite{
 
                        public var nit:Sprite=new Sprite();
                        public var h:int;
                        public var hh:int;
 
                public function Nit(h){
                                nit.graphics.lineStyle(2,0x000000);
                                nit.graphics.moveTo(x,y);
                                nit.graphics.lineTo(x,h);
                                addChild(nit);
                }
 
                public function uv(){
                        hh+=15;
                }
 
                public function unUv(){
                        hh-=15;
                }
 
                public function Sd(k:Boolean){
                                if (k==true){
                                        uv();
                                        nit.graphics.lineTo(x,hh);
                                }else{
                                        unUv();
                                        nit.graphics.lineTo(x,hh);
                                }
 
                }
 
        }
}

задание и вызов: Фрагменты кода.

Код AS3:

private var nitL:Nit=new Nit(100);
private var nitP:Nit=new Nit(50);
 
public function btnClick(e:MouseEvent):void{
        timer.addEventListener(TimerEvent.TIMER,per);
        timer.start();
}
 
public function per(e:TimerEvent):void{
        УСЛОВИЕ{
                nitP.Sd(true);
                nitL.Sd(false);
 
        }else{
                timer.stop();
        }
}


Wolsh 23.05.2013 00:32

Nastia_22, для оформления своего кода надо использовать теги [as3][/as3]

ProcXel.A 23.05.2013 00:38

Nastia_22, непонятно, что должно происходить с твоей нитью после клика. Нить должна длину менять? Может, вот так надо?
Код AS3:

package {
        import flash.display.DisplayObjectContainer;
        import flash.display.Sprite;
 
        public class Rope extends Sprite {
 
                private var _rope_length:Number;
 
                public function Rope( container:DisplayObjectContainer, rope_length:Number, pos_x:Number = 0, pos_y:Number = 0 ) {
                        container.addChild( this );
                        this.x = pos_x;
                        this.y = pos_y;
                        _rope_length = rope_length;
                        DrawRope( 0 );
                }
 
                public function DrawRope( cut:Number ):void {
                        _rope_length += cut;
                        this.graphics.clear();
                        this.graphics.lineStyle( 2, 0x000000 );
                        this.graphics.moveTo( this.x, this.y );
                        this.graphics.lineTo( this.x, this.y + _rope_length );
                }
 
                public function get rope_length():Number {
                        return _rope_length;
                }
 
        }
 
}

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class Main extends Sprite {
 
                private var rope_1:Rope;
                private var rope_2:Rope;
                private var btn:Sprite;
 
                public function Main():void {
                        if ( stage )
                                init();
                        else
                                addEventListener( Event.ADDED_TO_STAGE , init );
                }
 
                private function init( e:Event = null ):void {
                        removeEventListener( Event.ADDED_TO_STAGE , init );
 
                        btn = new Sprite();
                        btn.graphics.beginFill( 0x000000 );
                        btn.graphics.drawRect( 0, 0, 70, 20 );
                        this.addChild( btn );
 
                        rope_1 = new Rope( this, 200, 100, 20 );
                        rope_2 = new Rope( this, 200, 200, 20 );
 
                        btn.addEventListener( MouseEvent.CLICK, Click );
                }
 
                private function Click( e:MouseEvent ):void {
                        btn.visible = false;
                        var timer:Timer = new Timer( 25, 400 );
                        timer.addEventListener( TimerEvent.TIMER, RedrawRopes );
                        timer.addEventListener( TimerEvent.TIMER_COMPLETE, RedrawRopesStop );
                        timer.start();
                }
 
                private function RedrawRopes( e:TimerEvent ):void {
                        var timer:Timer = e.target as Timer;
                        rope_1.DrawRope( Math.sin( timer.currentCount / 50 ) );
                        rope_2.DrawRope( Math.cos( timer.currentCount / 50 ) );
                        trace( "длина первой нити: ", rope_1.rope_length, " | длина второй нити: ", rope_2.rope_length );
                }
 
                private function RedrawRopesStop( e:TimerEvent ):void {
                        e.target.removeEventListener( TimerEvent.TIMER, RedrawRopes );
                        e.target.removeEventListener( TimerEvent.TIMER_COMPLETE, RedrawRopesStop );
                        btn.visible = true;
                }
 
        }
 
}


Nastia_22 23.05.2013 00:47

да нить должна длину менять, щас посмотрим, спасибо

Добавлено через 28 минут
мне нужно чтобы при одном нажатии на кнопку таймером менялось значение до определенного момента, а потом останавливалось.

а здесь пока что при одном щелчке прибавление одного значения к длине, а мне надо чтобы в цикле как бы это было

Добавлено через 1 час 31 минуту
Спасибо! длина изменяется, а вот чтобы при нажатии кнопки вернуть в исходное состояние - тоже не получается.

ProcXel.A 28.05.2013 02:00

Ну, подумай логически. Есть веревка. У нее есть свойство rope_length, которое возвращает длину. И есть метод, который отрезает кусок. Значит, чтобы установить длину веревки, например, в 100, нужно написать
Код AS3:

DrawRope( 100 - rope.rope_length );

Либо допиши класс, чтобы он умел восстанавливать длину.


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

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