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

asterion 28.03.2011 20:56

Разные кнопки (экземпляры) при вызове функции с разными параметрами
 
Расплывчатое название темы, но вот суть:
при вызове функции в спрайте отрисовываются прямоугольники.
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.Graphics;
        import flash.events.MouseEvent;
 
        public class drRecMenu_lines extends Sprite {
 
                private var container:Sprite;
                private var itemXpos:uint;
                private var contPositionY:uint;
/*                private var it1:*;
                private var it2:*;
                private var it3:*;
                private var it4:*;
                private var it5:*;*/

 
 
                public function drRecMenu_lines(contPositionY:uint=580) {
                        container=new Sprite();
                        this.contPositionY=contPositionY;
                        container.y=contPositionY;
                        drawItem(1,0xFFFF00,1);
                        drawItem(2);
                        drawItem(3);
                        drawItem(4);
                        drawItem(5);
                        this.addChild(container);
                        container.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                        //it3.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                        //it4.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                }
                private function drawItem(itemCount:uint,fillColor:uint=0x000000, itemAlpha:Number=.8):void {
                        if (itemCount<5) {
                                itemXpos=(itemCount-1)*180;
                                container.graphics.beginFill(fillColor, itemAlpha);
                                container.graphics.drawRect(itemXpos,0,180,60);
                                container.graphics.endFill();
 
                                container.graphics.moveTo(itemXpos,contPositionY);
                                container.graphics.lineStyle(1,0xCCCCCC, .2);
                                container.graphics.lineTo(itemXpos,contPositionY+60);
                        } else {
                                itemXpos=(itemCount-1)*180;
                                container.graphics.beginFill(fillColor, itemAlpha);
                                container.graphics.drawRect(itemXpos,0,1000,60);
                                container.graphics.endFill();
                        }
                }
                private function runDebug(evt:MouseEvent):void {
                        trace("Mouse is over the "+evt.target.name+" item");//Mouse is over the instance1 item
                }
        }
}

Как сделать так, чтобы каждый прямоугольник был как кнопка и реагировал на наведение? У меня не хватате опыта, но мне кажется как раз что это потому что прямоугольники отрисованы в одном спрайте?
Пробовал так:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.display.Graphics;
        import flash.events.MouseEvent;
 
        public class drRecMenu_lines extends Sprite {
 
                private var container:Sprite;
                private var itemXpos:uint;
                private var contPositionY:uint;
                private var it1:*;
                private var it2:*;
                private var it3:*;
                private var it4:*;
                private var it5:*;
 
 
                public function drRecMenu_lines(contPositionY:uint=580) {
                        container=new Sprite();
                        this.contPositionY=contPositionY;
                        container.y=contPositionY;
                        it1=drawItem(1,0xFFFF00,1);
                        it2=drawItem(2);
                        it3=drawItem(3);
                        it4=drawItem(4);
                        it5=drawItem(5);
                        this.addChild(container);
                        //container.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                        it3.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                        it4.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
                }
                private function drawItem(itemCount:uint,fillColor:uint=0x000000, itemAlpha:Number=.8):void {
                        if (itemCount<5) {
                                itemXpos=(itemCount-1)*180;
                                container.graphics.beginFill(fillColor, itemAlpha);
                                container.graphics.drawRect(itemXpos,0,180,60);
                                container.graphics.endFill();
 
                                container.graphics.moveTo(itemXpos,contPositionY);
                                container.graphics.lineStyle(1,0xCCCCCC, .2);
                                container.graphics.lineTo(itemXpos,contPositionY+60);
                        } else {
                                itemXpos=(itemCount-1)*180;
                                container.graphics.beginFill(fillColor, itemAlpha);
                                container.graphics.drawRect(itemXpos,0,1000,60);
                                container.graphics.endFill();
                        }
                }
                private function runDebug(evt:MouseEvent):void {
                        trace("Mouse is over the "+evt.target.name+" item");//Mouse is over the instance1 item
                }
        }
}

Выдает ошибку
Цитата:

TypeError: Error #1010: Термин не определен и не имеет свойств.
at drRecMenu_lines()

Wolsh 28.03.2011 21:12

Цитата:

это потому что прямоугольники отрисованы в одном спрайте?
1. Да.
2. Что значит запись
Код AS3:

it3=drawItem(3);

если drawItem возвращает void?
3. Звездочки при объявлении типа переменной - чтобы обмануть компилятор? Ну поздравляю, вы его обманули))) Никогда больше так не делайте. Компилятор - ваш лучший друг и советник.
4. Названия классов пишутся с большой буквы.
5. Создавайте столько спрайтов, сколько будет "кнопок". Рисуйте в них прямоугольники. Добавляйте спрайты на сцену, назначайте им слушатели. Воспользуйтесь циклом.

carrotoff 28.03.2011 21:21

Цитата:

TypeError: Error #1010: Термин не определен и не имеет свойств.
at drRecMenu_lines()
Реагирует на
Код AS3:

it1=drawItem(1,0xFFFF00,1);
it2=drawItem(2);
it3=drawItem(3);
it4=drawItem(4);
it5=drawItem(5);

так как drawItem ничего не возвращает.

чтобы прослушать события, рисуйте кнопки в разных спрайтах

Добавлено через 42 секунды
Вот до меня уже всё в принципе сказали)

asterion 29.03.2011 02:57

В конце концов я это вымучал и сделал во фла-файле. Почему у меня не компилировалось когда я пытался в классе применить Твин лайт?
Код AS3:

import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.MouseEvent;
import flash.display.Shape;
import com.greensock.TweenLite;
 
var container:Sprite;
var itemXpos:uint;
var contPositionY:uint;
var VerPromo:Shape;
var Gallery:Shape;
var Info:Shape;
var Blog:Shape;
var FreeSpace:Shape;
var LinesDev:Shape;
var btnWidth:uint=200;
var btnHeight:uint=60;
drRecMenu_lines();
 
function drRecMenu_lines(contPositionY:uint=450) {
        container=new Sprite();
        VerPromo=new Shape();
        Gallery=new Shape();
        Info=new Shape();
        Blog=new Shape();
        FreeSpace=new Shape();
        this.contPositionY=contPositionY;
        container.y=contPositionY;
        this.addChild(container);
        container.addChild(VerPromo);
        container.addChild(Gallery);
        container.addChild(Info);
        container.addChild(Blog);
        container.addChild(FreeSpace);
        drawItem(VerPromo,1,0xFFFFFF,1);
        drawItem(Gallery,2);
        drawItem(Info,3);
        drawItem(Blog,4);
        drawItem(FreeSpace,5);
        drawLines();
        container.scaleX=.1;
        TweenLite.to(container, .9, {scaleX:1});
}
function drawItem(ShapeName:Shape,itemCount:uint,fillColor:uint=0x000000, itemAlpha:Number=.8):void {
        if (itemCount<5) {
                itemXpos=(itemCount-1)*btnWidth;
                ShapeName.graphics.beginFill(fillColor, itemAlpha);
                ShapeName.graphics.drawRect(itemXpos,0,btnWidth,btnHeight);
                ShapeName.graphics.endFill();
        } else {
                itemXpos=(itemCount-1)*btnWidth;
                ShapeName.graphics.beginFill(fillColor, itemAlpha);
                ShapeName.graphics.drawRect(itemXpos,0,19000,btnHeight);
                ShapeName.graphics.endFill();
        }
}
function drawLines():void {
        LinesDev=new Shape();
        addChild(LinesDev);
        LinesDev.scaleX=.1;
        for (var i:uint=0; i<5; i++) {
                LinesDev.graphics.moveTo(i*btnWidth,contPositionY);
                LinesDev.graphics.lineStyle(1,0xCCCCCC, .3);
                LinesDev.graphics.lineTo(i*btnWidth,contPositionY+btnHeight);
        }
        TweenLite.to(LinesDev, .9, {scaleX:1});
}

Добавлено через 10 минут
К стати, есть ли какие-то преимущества того, чтобы писать классы если делаешь флеш-сайт???

stweet 29.03.2011 06:27

Предполагаю почему в этой теме больше ни кто ни стал отвечать. Автор, знаете такую операцию: "вопрос-ответ"? Что касается кнопок, суть ясна. Не ясен вопрос:
Цитата:

К стати, есть ли какие-то преимущества того, чтобы писать классы если делаешь флеш-сайт???
А как вы собрались писать сайт? Вам бы почитать малость про ООП и ... хотя бы слегка познать терминологию. А после браться за распределение задач(на листочке, ручкой) и только потом уже делать чертёж своего будущего проекта, и только после личного удовлетворения от написанного в листке и разложенного по полочкам открывать девелоп или в какой среде вы там пишите. И приниматься за реализацию поставленных себе задач. Поверьте, метод тыка вам не помощник.

Добавлено через 16 минут
добавлю малость ответов.
Цитата:

Как сделать так, чтобы каждый прямоугольник был как кнопка и реагировал на наведение?
легко =)
Код AS3:

button.buttonMode = true;

далее:
Цитата:

У меня не хватате опыта, но мне кажется как раз что это потому что прямоугольники отрисованы в одном спрайте?
не обязательно.
Код AS3:

button.addEventListener(MouseEvent.MOUSE_OVER, runDebug);
button.addEventListener(MouseEvent.MOUSE_OUT, runDebug);
button.addEventListener(MouseEvent.MOUSE_DOWN, runDebug);

Цитата:

TypeError: Error #1010: Термин не определен и не имеет свойств.
at drRecMenu_lines()
если вы пытаетесь скомпилировать именно этот документ: "drRecMenu_lines()"
тогда какого .... вы в конструктор основного класса пытаетесь передать параметры?

asterion 29.03.2011 10:17

Цитата:

легко =)
Код AS3:

button.buttonMode = true;


Отдельно отрисованный прямоугольник - это экземпляр чего? Все того же одного спрайта. Волш правильно подсказал.

ООП читал, хотел сдалать по модели MVC - обработчики событий в отдельном классе.

Цитата:

если вы пытаетесь скомпилировать именно этот документ: "drRecMenu_lines()"
тогда какого .... вы в конструктор основного класса пытаетесь передать параметры?
Конструктор может принимать параметры. Что вы понимаете под основным классом? Я его компилирую через фла-файл прописывая в инстансе этот класс.

IDE Flash CS5.

gloomyBrain 29.03.2011 10:29

Цитата:

хотел сдалать по модели MVC - обработчики событий в отдельном классе
Это не имеет отношения к реализации MVC. Может, еще про ООП почитать? =) В конечном итоге, Вам же будет проще и понятнее.

stweet 29.03.2011 21:06

Цитата:

ООП читал
тогда к чему такие вопросы:
Цитата:

К стати, есть ли какие-то преимущества того, чтобы писать классы если делаешь флеш-сайт???
Добавлено через 1 минуту
Цитата:

Конструктор может принимать параметры. Что вы понимаете под основным классом?
Прочтите хотя бы первую главу у К.Мука.


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

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