PDA

Просмотр полной версии : обработка событий измененного объекта


rain_heart
27.04.2010, 13:44
Вобщем есть вот такой скрип, для примера:

Класс MyButton просто создает статичный квадрат

package {
import flash.display.*
import flash.events.*

public class MyButton extends Sprite {

private var container:Sprite = new Sprite();
private var button:Shape = new Shape();

public function MyButton() {
Build();
addChild(container);
container.addChild(button);
}

private function Build() {
button.graphics.beginFill(0xFF0000, 1);
button.graphics.drawRect(0, 0, 100, 100);
button.graphics.endFill();
}//end function menuBox
}
}



А вот в этом классе загвоздка.

package {

import flash.display.*
import flash.events.*
import MyButton;

public class Test extends Sprite {

private var newButton:MyButton;

public function Test() {
newButton = new MyButton();
addChild(newButton);
newButton.addEventListener(MouseEvent.MOUSE_OVER, onOver);
newButton.addEventListener(MouseEvent.MOUSE_OUT, onOut);
}
private function onOver(e:Event):void {
var but:MyButton = new MyButton();
but.y = 100;
newButton.addChild(but);
trace('over');
}
private function onOut(e:Event):void {
trace('out')
}
}
}

Когда мышка наводится на квадрат, внизу создается 2 квадрат, добавляем его в переменную newButton, но если мышку опустить вниз (ниже первого исходного квадрата), то цыклично вызываются события OnOver и OnOut
Вопрос: Откуда взялось событие OnOut ???

mickfallout
27.04.2010, 14:38
Вопрос в том, почему Вы считали что оно не должно взятся?

Добавлено через 2 минуты
var but:MyButton = new MyButton();
but.y = 100;
newButton.addChild(but);//новая кнопка перекрывает старую, у старой возникает событие MOUSE_OUT, оно всплывает до newButton, и успешно обрабатывается(что вызывает добавления новой кнопки поверх старой и т.д.)
что не так?

rain_heart
27.04.2010, 16:42
Вопрос в том, почему Вы считали что оно не должно взятся?

эээ. уточняю вопрос.
вот код:

package {

import flash.display.*
import flash.events.*
import MyButton;

public class Test extends Sprite {

private var newButton1:MyButton;
private var newButton2:MyButton;
private var newContainer:Sprite = new Sprite();

public function Test() {
newButton1 = new MyButton();
newButton2 = new MyButton();
newButton2.alpha = 0.5;
newButton2.x = 100;

newContainer.addChild(newButton1);//добавить 1 кнопку в контейнер
newContainer.addChild(newButton2);//добавить 2 кнопку в контейнер
addChild(newContainer);//добавляем контейнер на страницу
newContainer.addEventListener(MouseEvent.MOUSE_OVER, onOver);//мыш над контейнером
newContainer.addEventListener(MouseEvent.MOUSE_OUT, onOut);//мыш в стороне
}
private function onOver(e:Event):void {
trace('over');
}
private function onOut(e:Event):void {
trace('out')
}
}
}

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

BlooDHounD
27.04.2010, 16:49
ROLL_OVER

mickfallout
27.04.2010, 16:51
Вопрос, я слушаю события контейнера, а получаю как бы события от его потомков ???
ну да. почитайте про всплытие событий...

Добавлено через 1 минуту
package {

import flash.display.*
import flash.events.*
import MyButton;

public class Main extends Sprite {

private var newButton1:MyButton;
private var newButton2:MyButton;
private var newContainer:Sprite = new Sprite();
private var mouseOnButton1:Boolean;
private var mouseOnButton2:Boolean;
public function Main() {
super();
newButton1 = new MyButton();
newButton2 = new MyButton();
newButton2.alpha = 0.5;
newButton2.x = 100;

newContainer.addChild(newButton1);//добавить 1 кнопку в контейнер
newContainer.addChild(newButton2);//добавить 2 кнопку в контейнер
addChild(newContainer);//добавляем контейнер на страницу
newContainer.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);//мыш над контейнером
newContainer.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);//мыш в стороне
}
private function rollOverHandler(e:Event):void {
trace('over');
}
private function rollOutHandler(e:Event):void {
trace('out')
}
}
}

rain_heart
27.04.2010, 16:55
ООО...
это уже называется старческий маразм :))) (у меня всмысле)
я за ROLL_OVER и ROLL_OUT совсем и забыл то :(

Спасибо!!! :)