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

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


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

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