Форум 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)
-   -   Как правильно использовать getter и setter (http://www.flasher.ru/forum/showthread.php?t=137803)

NoCD 23.03.2010 09:49

Как правильно использовать getter и setter
 
Всем привет!
В классе создал мувиклип, прилепил к нему onEnterFrame, но свойства клипа в таком случае не доступны. Как я понял, такие свойства как _x, _y и т.д. нужно получать через get и set. Как правильно обратиться к ним, что бы получить свойства клипа?

udaaff 23.03.2010 11:32

Пример в студию.

NoCD 23.03.2010 11:41

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

грубый пример вот:
Код AS1/AS2:

class modegame{
 
public function createmode(){
 
mc = attachMovie("mc","mc",1000)
mc._x = 100;
mc._y = 100;
 
mc.onEnterFrame = engine_mc
}
 
public function engine_mc(){
 
trace(this._x)
 
 
 
}
 
}

Как получить в функции engine_mc у this._x свойство _x или любое другое свойство мувика this ??

in4core 23.03.2010 12:11

Вопрос простейший. Тока тут геттер и сеттер не причем.

Код AS1/AS2:

class modegame{
 var SMC;
public function createmode(smc){
 SMC = smc; // или smc = SMC; забыл уже если честно
 SMC._x = 100;
 SMC._y = 100;
 
 onEnterFrame = mx.utils.Delegate.create(this,engine_mc);
}
 
public function engine_mc(){
 
trace(SMC._x)
 
 
 
}
 
}

Вариант 2 с твоими сеттирами
Код AS1/AS2:

var someVar;
function setVar(x) {
    someVar._x = x; }
function getVar():Number {
    return someVar._x;
}
setVar(100);
trace(getVar();)


NoCD 23.03.2010 12:16

Спасибо большое, буду разбираться!
Для вас простейший, а я только начинаю писать в классах

in4core 23.03.2010 12:17

Обращайся)

udaaff 23.03.2010 12:26

Цитата:

Вариант 2 с твоими сеттирами
get/set — это несколько другое

NoCD 23.03.2010 13:19

Второй вариант вообще замороченный :(
думал мое решение на get/set подвязаны, извиняюсь за ошибку.

Первый вариант у меня не получилось реализовать.

Если рассматривать первый вариант, то SMC, мувиклип?

если так, то каким образом он влияет на onEnterFrame?
проверил функцию create_bpost_f на trace(this), выдает объект.
а у объектов нет onEnterFrame.
вот собственно сам код, который я хочу оживить.

Код AS1/AS2:

public function create_bpost_f(container,clip){
 
 
                trace("this= "+this)
        bpost = container.attachMovie("bpost_img","bpost",3900)
        bpost._x = 100;
        bpost._y = 100;
        bpost.container = container;
        bpost.clip = clip;
                trace("container= "+container)
                trace("bpost= "+bpost)
                trace("this._x= "+bpost._x)
 trace("this._y= "+bpost._y)
 
                //bpost.onEnterFrame = bp_engine;       
        bpost.onEnterFrame = mx.utils.Delegate.create(this,bp_engine);
 
        }       
 
public function bp_engine(){
        trace("this= "+this)
        }

container - мувиклип контейнер, который будет содержать созданные в нем мувиклипы

clip - это клип, который будет проверяться с созданным клипом на столкновение.
Почему так? потому чтоя не могу понять, как в классе сделать так, что бы мувиклипы были доступны всем function в текущем классе.

В итоге выдает ошибку.

Почему сам клип в функии bp_engine трайсится, а свойства его не доступны?

in4core 23.03.2010 14:52

Удав- несколько другое? Покажи пример раз так. На сколько я помню последний пример про гет и сет как раз я видел в ливдоках. Вот оттуда этот пример ( тока немного модернизированный под нужды человека).

То Автор : Вообще заведомо нехорошо так классы писать. Все отрибуты давать лучше сначала. А потом тока запускать функции с этимт атрибутами. Код я написал тебе правильный. Просто тебе надо подделать его под себя, и подумать насчет Delegate который как раз нужен в твоем случае.

Добавлено через 5 минут
вот простейший пример : а как его использовать в твоих нуждах стоит подумать тебе самому
Код AS1/AS2:

class чепочем { 
      var f;
      function чепочем(set) {
          f = set;
      }
      function получи() {
        return f;
        }
}
var n = new чепочем(333);
trace(n.получи()) // 333

И второй метод уже с делегатом
Код AS1/AS2:

class NNN {
      var f;
      function NNN(set) {
      f = set;
      setTimeout(mx.utils.Delegate.create(this,DDD),30);
 }
    function DDD() { trace(f); } 
}
var n = new NNN("555");
// 555


udaaff 23.03.2010 15:06

Код AS1/AS2:

import mx.utils.Delegate;
 
class Test
{
 
        /**
        * Смысл делегата для NoCD
        */

        public function Test(mc:MovieClip)
        {
                super();
 
                this.mc = mc;
 
                // тут обработчик будет вызывать в области видимости объекта mc
                this.mc.onEnterFrame = mc_onEnterFrameHandler;
 
                // тут в области видимости текущего объекта. Т.е. экземпляра Test
                this.mc.onEnterFrame = Delegate.create(this, mc_onEnterFrameHandler);
 
                // или что не понятно?
        }
 
        private var mc:MovieClip;
 
        private function mc_onEnterFrameHandler():Void
        {
                trace(this);
        }
 
        /**
        * Пример get/set для in4core
        */

        private var _width:Number;
 
        public function get width():Number
        {
                return _width;
        }
 
        public function set width(value:Number):Void
        {
                if (_width < 0)
                        return;
 
                _width = value;
        }
 
}

Цитата:

Сообщение от in4core
Код я написал тебе правильный.

Цитата:

Сообщение от NoCD
а у объектов нет onEnterFrame.


in4core 23.03.2010 15:26

Код я написал правильный - не с точки зрения верной работы, а с точки зрения механики всего лишь. И не надо меня обижать)))

Насчет примера ) покажи какон будет работать - как ты будешь их вызывать. Это меня интересовало , а не как ты написал. Как пишется я вкурсе

И кстати немного некорректно написал ты

Код AS1/AS2:

import mx.utils.Delegate;
this.mc.onEnterFrame = Delegate.create(this, mc_onEnterFrameHandler);

в чем видишь?

должно быть
Код AS1/AS2:

this.mc.onEnterFrame = create(this, mc_onEnterFrameHandler);


NoCD 23.03.2010 15:39

Спасибо вам двоим, что объяснили, что как работает, не думал, что все так запутано здесь. Теперь понял, что к чему нужно прикручивать, что бы передать свойства из одной функции в другую

Переделал код Удава для своих нужд.
Вот конечный результат

Код AS1/AS2:

import mx.utils.Delegate;
class Test{
 
public var mc:MovieClip;
public var x:MovieClip;
public var y:MovieClip;
 
public var container:MovieClip;
 
public function a(container)
        {
                super();
 
 trace("container= "+container);
 
 
 
                this.mc = container;
        this.x = container._x;
                this.y = container._y;
                // тут обработчик будет вызывать в области видимости объекта mc
                //this.mc.onEnterFrame = mc_onEnterFrameHandler;
 
                // тут в области видимости текущего объекта. Т.е. экземпляра Test
                this.mc.onEnterFrame = Delegate.create(this, mc_onEnterFrameHandler);
 
                // или что не понятно?
        }
 
        //private var mc:MovieClip;
 
        private function mc_onEnterFrameHandler():Void
        {
                //trace(this);
                trace(this.mc);
 
                trace(this.mc._x)
        }
 
        }

для меня не было понятным, то, почему не доходили свойства самого клипа mc в функцию mc_onEnterFrameHandler()

То есть я ожидал изначально получить вот так результат trace(this._x) // равно 200
Так как trace(this) у меня показывал имя передаваемого клипа, то для меня было ОЧЕВИДНЫМ и передача вместе с ним все его свойства. Но оказывается просто так свойства клипа нельзя перенести в другую функцию. Надо использовать Delegate.

В итоге пришлось объявлять их специально. Так как для меня это еще не топаная тропа, не буду говорить, хорошо или плохо вот такой вид передачи свойств, будущее покажет.

udaaff 23.03.2010 15:46

Цитата:

Сообщение от in4core (Сообщение 895078)
Код AS1/AS2:

import mx.utils.Delegate;
this.mc.onEnterFrame = Delegate.create(this, mc_onEnterFrameHandler);

в чем видишь?

должно быть
Код AS1/AS2:

this.mc.onEnterFrame = create(this, mc_onEnterFrameHandler);


У класса Test нету метода create. Есть статический метод create у класса Delegate.

in4core 23.03.2010 17:11

Да накосячил , забыл об этом))) Ты про гет и сет не ответил) покажи как ты свой код встроешь в фрейм и запустишь - вот что интересно в первую очередь )))

udaaff 23.03.2010 17:25

Цитата:

Сообщение от in4core (Сообщение 895120)
и что ? ты его уже импортировал! причем тут это? Т

Да боже ж мой. Импорт означает лишь то, что нам не нужно будет писать полное имя класса.
Цитата:

ы про гет и сет не ответил) покажи как ты свой код встроешь в фрейм и запустишь )))
Что вам непонятно? Как свойству значение присвоить?

in4core 23.03.2010 17:31

Я исправился - перечитай ))) да про делегату ошибся. бывает.

Про сеттеры :

Код AS1/AS2:

var n = new Class();

и дальше как ты вызовешь сеттеры и геттеры свои - вот что интересно. покажи

udaaff 23.03.2010 17:32

Код AS1/AS2:

n.width = 1234;
var a:Number = n.width;


in4core 23.03.2010 17:34

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

udaaff 23.03.2010 17:55

Цитата:

а гет когда произойдет?
Во второй строчке кода.
Цитата:

И интересно чем оно отличалось от моего кода ? смысл один и тот же, тока пишется подругому а работает так же. Или я не прав? Поправь тогда - буду знать на будущее
http://help.adobe.com/ru_RU/ActionSc...8a9b90204-7fcb

in4core 23.03.2010 18:18

спасибо дарагой


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

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