Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Воздействие методов класса на объекты в Main (http://www.flasher.ru/forum/showthread.php?t=207723)

2misha 03.05.2014 21:41

Воздействие методов класса на объекты в Main
 
Как сделать так, чтоб методы класса могли воздействовать на объекты в Main. Вот такой код у мня получился ...

Класс Button
Код AS3:

package myClasses
{
        /**
        * ...
        * @author Scorpion
        */

        import flash.display.*;
        import flash.events.*;
 
        public class Button extends MovieClip
        {
                [Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
                public function addButton(x: int, y: int): Bitmap
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        button.addEventListener(MouseEvent.CLICK, funButton);
 
                        return button;
                }
 
                public function funButton(e:MouseEvent): void
                {
                        text1.text = "Hello";
                }
        }
}

Main
Код AS3:

package {
        /**
        * ...
        * @author Scorpion
        */

        import flash.events.*;
        import flash.display.*;
        import flash.text.*;
        import myClasses.*;
 
        public class Main extends Sprite {
                public function Main() {
                        if (stage)
                        init();
                        else
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(): void {
                        addChild(Image.addImage(0, 0, "background"));
                        addChild(Image.addImage(0, 0, "head"));
                        addChild(Image.addImage(0, 200, "menuline"));
 
                        var text1: TextF = new TextF;
                        addChild(text1.addText("Text", 100, 200));
 
                        var button: Button = new Button;
                        addChild(button.addButton(200, 200));
                }
        }
}

То есть в Main есть объект text1 пользовательского класса TextF, но когда хочу прописать в методе функции Button, чтоб оно меняло свойство text этого объекта, на строчке text1.text = "Hello"; ошибка выдает.

alexcon314 03.05.2014 21:55

Цитата:

Main есть объект text1
но в Button нет никакого text1. Класс Button ничего не знает о существовании text1 в Main, как и о существовании Main.
Нормальный выход из ситуации - заставить Main слушать события кнопки, и по событию клика выводить в text1 информацию.
Вы заставляете кнопку слушать саму себя. Это само по себе не может считаться ошибкой, но мэйн ничего не будет знать о том, что происходит с кнопкой, нафик она такая кнопка, спрашивается?
Тут как бы простая логика, Я, мэйн, даю пользователю кнопку, чтобы он на нее нажал, и слушаю, когда он это сделает. Чтобы отреагировать на клик соответственно логике, которую я, мэйн, знаю. Кнопка - это просто элемент интерфейса, ее задача в подавляющем большнстве случаев - уведомить родителя о том, что на нее нажали и все.
Замечу, что держать всю логику приложения в одном классе Main - не самая удачная идея, если приложение не "просто поиграться с классами".
Оу... кажись опять маячит на горизонте MVC :)

2misha 03.05.2014 22:06

Ну я попробовал перенести слушатель событие в Маин
Код AS3:

var button: Button = new Button;
addChild(button.addButton(200, 200));
button.addEventListener(MouseEvent.CLICK, funButton);
button.funButton(e:MouseEvent);

И забрал его с класса кнопки. Но в строке button.funButton(e:MouseEvent); ошибка.

Не держать всю логику программы в Main ... эт как?

ZackMercury 03.05.2014 22:45

PHP код:

button.addEventListener(MouseEvent.CLICKfunButton);
button.funButton(e:MouseEvent); 

Что это за такое?

Добавлено через 4 минуты
Если вы не поняли принципы ООП, которые я вам попытался объяснять из прошлой темы про текстовое поле, объясню на этом примере.

Есть у вас меню в игре. В нём содержится экземпляр класса кнопки, который вы написали для этой программы.
Это уже другое приложение, поэтому здесь нет никаких текстовых полей в классе Main.
А кнопка лезет в Main и пытается изменить там какое-то значение, которого даже нет.
К чему это? Кнопка должна выполнять функционал кнопки. Она должна нажиматься, отжиматься и быть DisplayObjectContainer'ом. Всё. Больше ей ничего не нужно знать.

Это класс Main должен знать, что должно произойти при нажатии на добавленную в него кнопку.

2misha 03.05.2014 22:57

Ну так тем кодом я и пытался сделать, чтоб класс знал, что должно произойти. Создал слушатель клика для объекта button из пользовательского класса Button ну и функцию, какую он вызывает, взял из того же класса. А как надо было это написать правильно?

caseyryan 03.05.2014 22:59

Никого вообще не смутило, что у него слушатель MouseEvent к битмапу добавляется?

ZackMercury 03.05.2014 23:03

Код AS3:

package com.ui
{
        /**
        * ...
        * @author Scorpion
        */

        import flash.display.*;
        import flash.events.*;
 
        public class Button
        {
                [Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
                public static function addButton(x: int, y: int): Sprite
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        button.addEventListener(MouseEvent.CLICK, funButton);
 
                        return (new Sprite()).addChild(button);
                }
        }
}

Код AS3:

package {
        /**
        * ...
        * @author Scorpion
        */

        import flash.events.*;
        import flash.display.*;
        import flash.text.*;
        import com.ui.*;
 
        public class Main extends Sprite {
                public function Main() {
                        if (stage)
                                init();
                        else
                                addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(): void {
                        addChild(Image.addImage(0, 0, "background"));
                        addChild(Image.addImage(0, 0, "head"));
                        addChild(Image.addImage(0, 200, "menuline"));
 
                        var text1: TextF = new TextF;
                        addChild(text1.addText("Text", 100, 200));
 
                        var button:Sprite = button.addButton(200,200);
                        addChild(button);
                        button.addEventListener(MouseEvent.CLICK, btnClickHandler);
                }
 
                private function btnClickHandler(e:MouseEvent):void
                {
                        ...
                }
        }
}


2misha 03.05.2014 23:12

То есть функция, которую вызывает слушатель, обязательно должна быть в Мейне (то есть в том же файле, что и сам слушатель). И нельзя из Мейна вызвать слушателем функцию из класса?

Добавлено через 43 минуты
Ну вот я переделал по вашему образцу

Код AS3:

package {
        /**
        * ...
        * @author Scorpion
        */

        import flash.events.*;
        import flash.display.*;
        import flash.text.*;
        import myClasses.*;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (stage)
                        init();
                        else
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(): void {
                        addChild(Image.addImage(0, 0, "background"));
                        addChild(Image.addImage(0, 0, "head"));
                        addChild(Image.addImage(0, 200, "menuline"));
 
                        var text1: TextF = new TextF;
                        addChild(text1.addText("Text", 100, 200));
 
                        var button: Sprite = Button.addButton(200, 200);
                        addChild(button);
                        button.addEventListener(MouseEvent.CLICK, funButton);
                }       
 
                private function funButton(e:MouseEvent): void
                {
                        text1.text = "Hello";
                }
        }
}

Код AS3:

package myClasses
{
        /**
        * ...
        * @author Scorpion
        */

        import flash.display.*;
        import flash.events.*;
 
        public class Button
        {
                [Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
                public static function addButton(x: int, y: int): Sprite
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        button.addEventListener(MouseEvent.CLICK, funButton);
 
                        return (new Sprite()).addChild(button);
                }
        }
}

И у меня ошибки в строчках button.addEventListener(MouseEvent.CLICK, funButton); и return (new Sprite()).addChild(button);

и что вообще значит это написание через точку в ретурне?

ZackMercury 04.05.2014 00:12

Ай, прокололся.
Код AS3:

var spr:Sprite = new Sprite();
spr.addChild(button);
return spr;

Замените на это.

2misha 04.05.2014 00:17

Где заменить?

ZackMercury 04.05.2014 00:23

Не позорьтесь. Где у вас функция возвращает кнопку?

2misha 04.05.2014 00:25

В классе ...

Но что именно на это заменить я не понял. Какие строки.

ZackMercury 04.05.2014 00:29

...
Функция возвращает кнопку после оператора return, в функции addButton.
Или вы издеваетесь, или для вас программирование оказывается слишком сложным...
Ну или у вас слишком мало опыта. Даже не знаю.
В таком случае ГО уже читать Мука и не суйтесь в эти дела пока не научились правильно это делать.

2misha 04.05.2014 14:55

А, все, понял. Извините, что затупил. Кнопка сама теперь отображается, когда я просто её на экран вывожу, но когда задаю слушатель события и функцию, которую он запускает, все равно text1 оно не видит.

Код AS3:

package {
        /**
        * ...
        * @author Scorpion
        */

        import flash.events.*;
        import flash.display.*;
        import flash.text.*;
        import myClasses.*;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (stage)
                        init();
                        else
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(): void
                {
                        addChild(Image.addImage(0, 0, "background"));
                        addChild(Image.addImage(0, 0, "head"));
                        addChild(Image.addImage(0, 200, "menuline"));
 
                        var text1: TextF = new TextF;
                        addChild(text1.addText("Text", 100, 200));
 
                        var button: Button = new Button;
                        addChild(button.addButton(200, 200));
                        button.addEventListener(MouseEvent.CLICK, funButton);                       
                }
 
                private function funButton(): void
                {
                        text1.text = "Hello";
                }
        }
}

Код AS3:

package myClasses
{
        /**
        * ...
        * @author Scorpion
        */

        import flash.display.*;
        import flash.events.*;
 
        public class Button extends Sprite
        {
                [Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
                public function addButton(x: int, y: int): Sprite
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        var sprite: Sprite = new Sprite();
                        sprite.addChild(button);
 
                        return sprite;
                }
        }
}


ZackMercury 04.05.2014 15:13

Цитата:

Код AS3:

package myClasses
{
        /**
        * ...
        * @author Scorpion
        */

        import flash.display.*;
        import flash.events.*;
 
        public class Button extends Sprite
        {
                [Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
                public function addButton(x: int, y: int): Sprite
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        var sprite: Sprite = new Sprite();
                        sprite.addChild(button);
 
                        return sprite;
                }
        }
}


А зачем вам создавать екземпляр класса, в котором даже ничего не рисуется?
Сделайте статический метод и уберите расширение Sprite.

Добавлено через 1 минуту
А, точно... Вы же не знаете, что такое статический метод ...

2misha 04.05.2014 15:21

А что там рисоваться то должно? Я думаю, свойства спрайта мне пригодятся по мере расширения функционала. Меня больше волнует, почему не хочет меняться значения text1 после нажатия кнопки ... вернее даже не запускается прога, когда я такое запрограммировать пытаюсь.

ZackMercury 04.05.2014 15:49

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

Я вас уже 4 раза отправлял читать Мука и не возвращаться, почему вы не хотите взять, сесть и прочитать обо всём, что вы сейчас делаете и не имеете представления, что именно вы делаете?

2misha 04.05.2014 16:02

Да мне проект надо делать, сроки поджимают. Я был создал основу сайта в Adobe Flash CS6 в кадрах, теперь надо как можно быстрее переделать все это в классах.

ZackMercury 04.05.2014 16:31

Если вы планируете в будущем с ним ещё работать, то не советовал бы сейчас вам писать какой-либо код для проекта.

2misha 04.05.2014 16:35

Ну так я по ходу создания проекта и планирую язык освоить. Так быстрее будет.

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

ZackMercury 04.05.2014 17:31

Сделайте класс, который будет раздавать битмапы всем, а в кнопке напишите следующее:
Код AS3:

package com.ui
{
        import flash.display.Bitmap;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.ColorTransform;
 
        public class Button extends Sprite
        {
                private var _bitmap:Bitmap;
                private var _originalColorTransform:ColorTransform;
                private var _onClick:Function;
 
                public function Button(onClick:Function)
                {
                        this._onClick = onClick;
 
                        if (super.stage)
                                this.init();
                        else
                                super.addEventListener(Event.ADDED_TO_STAGE, this.init);
                }
 
                private function init(e:Event = null):void
                {
                        _bitmap = Images.getImage(Images.BUTTON);
                        super.addChild(_bitmap);
 
                        super.addEventListener(MouseEvent.ROLL_OVER, colorTransformEnable);
                        super.addEventListener(MouseEvent.CLICK, clickHandler);
                }
 
                private function clickHandler(e:MouseEvent):void
                {
                        _onClick();
                }
 
                private function colorTransformEnable(e:MouseEvent):void
                {
                        _originalColorTransform = super.transform.colorTransform;
                        var colorTransform:ColorTransform = new ColorTransform(_originalColorTransform.redMultiplier + 0.2, _originalColorTransform.greenMultiplier + 0.2, _originalColorTransform.blueMultiplier + 0.2);
                        super.transform.colorTransform = colorTransform;
 
                        super.removeEventListener(MouseEvent.ROLL_OVER, colorTransformEnable);
                        super.addEventListener(MouseEvent.ROLL_OUT, colorTransformDisable);
                }
 
                private function colorTransformDisable(e:MouseEvent):void
                {
                        super.transform.colorTransform = _originalColorTransform;
 
                        super.removeEventListener(MouseEvent.ROLL_OUT, colorTransformDisable);
                        super.addEventListener(MouseEvent.ROLL_OVER, colorTransformEnable);
                }
        }
}

А в классе-раздатчике битмапов просто сделайте простой метод, отдающий изображение по свитчу и по константе на каждое изображение(константы с числовым индексом, так красивее).
Естественно, в коде
Код AS3:

_bitmap = Images.getImage(Images.BUTTON);

- Пример получения битмапы.

A Main типа такого:
Код AS3:

package 
{
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.events.Event;
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (super.stage)
                                this.init();
                        else
                                super.addEventListener(Event.ADDED_TO_STAGE, this.init);
                }
 
                private function init(e:Event = null):void
                {
                        var button:Button = new Button(clickHandler);
                        button.x = (stage.stageWidth - button.width) / 2;
                        button.y = (stage.stageHeight - button.height) / 2;
                        addChild(button);
                }
 
                private function clickHandler():void
                {
                        trace("button is clicked");
                }
        }
}

Насчёт ColorTransform, то вышеприведённый код должен делать кнопку светлее при наведении(Однако сейчас он никак не отреагирует при нажатии, и дальше пилите сами)

samana 04.05.2014 17:34

2misha, cмотрите, у вас логическая ошибка получилась, там где вы создаёте кнопку. В вашу кнопку не добавляется ничего. Как и сказали выше, она у вас пустая. Почему же?
Код AS3:

var button: Button = new Button;
addChild(button.addButton(200, 200));
button.addEventListener(MouseEvent.CLICK, funButton);

----------------------
Код AS3:

addChild(button.addButton(200, 200));

Здесь вы добавляете на сцену (а не в кнопку button) некий спрайт с картинкой. Ведь в методе addButton ясно видно, что он создаёт спрайт и возвращает его
Код AS3:

public function addButton(x: int, y: int): Sprite
                {
                        var button: Bitmap;
 
                        button = new Embed();
 
                        button.x = x;
                        button.y = y;
 
                        var sprite: Sprite = new Sprite();
                        sprite.addChild(button);
 
                        return sprite;
                }

Здесь нет ни намёка на то, что этот спрайт добавляется в кнопку.
------------------------
Вам нужно либо добавить при создании кнопки на сцене
Код AS3:

button.addChild(button.addButton(200, 200));

либо в методе addButton не возвращать спрайт, а просто добавить его в кнопку там же
Код AS3:

var sprite: Sprite = new Sprite();
sprite.addChild(button);
addChild(sprite);

------------------------
Но вся эта схема получается запутанной. Вам действительно лучше использовать фабрику для создания кнопок (с помощью статических методов).

2misha 04.05.2014 17:49

samaha
Код AS3:

button.addChild(button.addButton(200, 200));

Когда так сделал, вообще кнопка перестала отображаться.


Код AS3:

var sprite: Sprite = new Sprite();
sprite.addChild(button);
addChild(sprite);

А когда так, то жалуется что функция не возвращается значение, ибо нет ретурна.

ZackMercury 04.05.2014 17:49

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

Добавлено через 5 минут
2misha, да хватит уже всякую фигню писать!
Пора бы уже задуматься над тем, что вам пишут и над тем, что пишите вы.

Добавлено через 11 минут
Код AS3:

Когда так сделал, вообще кнопка перестала отображаться.

Скорее всего потому, что вы не добавляете в Main екземпляр класса Button(addChild(button));

Добавлено через 12 минут
PHP код:

А когда такто жалуется что функция не возвращается значениеибо нет ретурна

Ну естественно, у вас наверное тип возвращаемого значения установлен Sprite?

2misha 04.05.2014 18:11

Да, Спрайт. Когда void поставил, тогда не работало тоже.

Добавлено через 2 минуты
Код AS3:

var button: Button = new Button;
addChild(button.addButton(200, 200));
button.addChild(button.addButton(200, 200));
button.addEventListener(MouseEvent.CLICK, funButton);

Добавляю.


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

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