AS3:快速悬停不执行 rollOut
AS3: Fast hovering doesn't execute rollOut
我遇到了一个让我紧张的严重问题:
我制作了一个按钮 _btn,其中包括带有编码的 ROLLOVER 和 ROLLOUT 动画(一个名为 barra 的嵌套动画片段实例增加到将鼠标悬停在上方时减半 alpha,将鼠标悬停在外时减少)。
[这里应该是一张描述性图片,但我是新手,需要 10 个声望。我会感谢你的帮助]
这非常有效,但是 当我将光标从一个点快速移动到另一个点时,问题就出现了,按钮在中间 。好像没有检测到ROLLOUT函数,所以ROLLOVER动画一直在工作(仔细看,动画停了几秒又继续)。
[这里也应该放一张描述性的图片]
这是 Actions 层中的代码:
//Funciones ROLL OVER
function _btnOver(event:MouseEvent):void {
_btn.buttonMode = true;
_btn.addEventListener(Event.ENTER_FRAME,_btnFadeIn);
}
function _btnFadeIn(event:Event):void {
_btn.barra.alpha += 0.1;
if (_btn.barra.alpha >= 0.5)
{
_btn.removeEventListener(Event.ENTER_FRAME,_btnFadeIn);
}
}
_btn.addEventListener(MouseEvent.ROLL_OVER,_btnOver);
//Funciones ROLL OUT
function _btnOut(event:MouseEvent):void {
_btn.addEventListener(Event.ENTER_FRAME,_btnFadeOut);
}
function _btnFadeOut(event:Event):void {
_btn.barra.alpha -= 0.1;
if (_btn.barra.alpha <= 0.2)
{
_btn.removeEventListener(Event.ENTER_FRAME,_btnFadeOut);
}
}
_btn.addEventListener(MouseEvent.ROLL_OUT,_btnOut);
Click here if you want to download the FLA and SWF files,这样问题就看的清楚了
我几乎不知道如何使用ActionScript 3(我唯一的编程知识是Processing)而且我现在没有时间从头到脚学习它,但我已经研究过这个问题,但仍然不清楚.
通过教程和指南,我学会了如何创建和理解这段代码,我认为问题可能出在事件的函数中 ROLL_OVER 和 ROLL_OUT,其中分别包含 ENTER_FRAME 个事件(动画实际所在的位置)的 addEventListener 。但我不确切知道我必须做些什么来修复它,我应该添加或更改什么。
如果有人可以帮助我,我会很高兴,我很沮丧!你建议我做什么?
提前致谢
(PD:大部分编程语言我都不懂,如果你能说得清楚直接一点,我会很感激的)
显然,您的问题在于使用输入帧侦听器时动画序列不连贯。你是 运行 两个独立的侦听器,都改变了单个对象的 alpha
,这会产生冲突,只有一个会起作用(你可以确定如果你同时添加两个并触发事件,则结果 alpha value 将指示哪个侦听器最后更改它)并且您显然希望一个人淡入而另一个人淡出。相反,您应该使用一个侦听器(甚至可能是持久的)并为您的对象提供 "target alpha" 属性 以及 delta 以更改每帧的 alpha。一个例子:
var bbta:Number=0.2; // btn.barra's target alpha
_btn.addEventListener(Event.ENTER_FRAME,_btnFade);
function _btnFade(e:Event):void {
var a:Number=_btn.barra.alpha;
if (Math.abs(a-bbta)<1e-8) return;
// no sense of setting alpha with minuscule difference
const delta:Number=0.1; // how fast to change per frame
if (a>bbta) {
a-=delta;
if (a<=bbta) a=bbta;
} else {
a+=delta;
if (a>=bbta) a=bbta;
}
_btn.barra.alpha=a;
}
function _btnOver(event:MouseEvent):void {
_btn.buttonMode = true; // move this elsewhere, if you don't cancel buttonMode
bbta=0.5; // set target alpha, the listener will do a fade-in
}
function _btnOut(event:MouseEvent):void {
bbta=0.2; // set target alpha, the listener will do a fade-out
}
我在这里编辑了一些代码,基本上我正在检查悬停状态 onLoop 函数,所以你可以在这里更改你的设置
import flash.events.Event;
var isRolledOver:Boolean = false;
//Funciones ROLL OVER
function _btnOver(event:MouseEvent):void {
isRolledOver = true;
}
function _btnOut(event:MouseEvent):void {
isRolledOver = false;
}
_btn.addEventListener(MouseEvent.ROLL_OVER,_btnOver);
_btn.addEventListener(MouseEvent.ROLL_OUT,_btnOut);
this.addEventListener(Event.ENTER_FRAME,onLoop);
function onLoop(e){
if(this.isRolledOver){
if(_btn.barra.alpha < 0.5) _btn.barra.alpha += 0.1;
}
else{
if(_btn.barra.alpha > 0.5 || _btn.barra.alpha > 0) _btn.barra.alpha -= 0.1;
}
}
我添加了示例 fla 以防万一
我遇到了一个让我紧张的严重问题:
我制作了一个按钮 _btn,其中包括带有编码的 ROLLOVER 和 ROLLOUT 动画(一个名为 barra 的嵌套动画片段实例增加到将鼠标悬停在上方时减半 alpha,将鼠标悬停在外时减少)。
[这里应该是一张描述性图片,但我是新手,需要 10 个声望。我会感谢你的帮助]
这非常有效,但是 当我将光标从一个点快速移动到另一个点时,问题就出现了,按钮在中间 。好像没有检测到ROLLOUT函数,所以ROLLOVER动画一直在工作(仔细看,动画停了几秒又继续)。
[这里也应该放一张描述性的图片]
这是 Actions 层中的代码:
//Funciones ROLL OVER
function _btnOver(event:MouseEvent):void {
_btn.buttonMode = true;
_btn.addEventListener(Event.ENTER_FRAME,_btnFadeIn);
}
function _btnFadeIn(event:Event):void {
_btn.barra.alpha += 0.1;
if (_btn.barra.alpha >= 0.5)
{
_btn.removeEventListener(Event.ENTER_FRAME,_btnFadeIn);
}
}
_btn.addEventListener(MouseEvent.ROLL_OVER,_btnOver);
//Funciones ROLL OUT
function _btnOut(event:MouseEvent):void {
_btn.addEventListener(Event.ENTER_FRAME,_btnFadeOut);
}
function _btnFadeOut(event:Event):void {
_btn.barra.alpha -= 0.1;
if (_btn.barra.alpha <= 0.2)
{
_btn.removeEventListener(Event.ENTER_FRAME,_btnFadeOut);
}
}
_btn.addEventListener(MouseEvent.ROLL_OUT,_btnOut);
Click here if you want to download the FLA and SWF files,这样问题就看的清楚了
我几乎不知道如何使用ActionScript 3(我唯一的编程知识是Processing)而且我现在没有时间从头到脚学习它,但我已经研究过这个问题,但仍然不清楚.
通过教程和指南,我学会了如何创建和理解这段代码,我认为问题可能出在事件的函数中 ROLL_OVER 和 ROLL_OUT,其中分别包含 ENTER_FRAME 个事件(动画实际所在的位置)的 addEventListener 。但我不确切知道我必须做些什么来修复它,我应该添加或更改什么。
如果有人可以帮助我,我会很高兴,我很沮丧!你建议我做什么?
提前致谢
(PD:大部分编程语言我都不懂,如果你能说得清楚直接一点,我会很感激的)
显然,您的问题在于使用输入帧侦听器时动画序列不连贯。你是 运行 两个独立的侦听器,都改变了单个对象的 alpha
,这会产生冲突,只有一个会起作用(你可以确定如果你同时添加两个并触发事件,则结果 alpha value 将指示哪个侦听器最后更改它)并且您显然希望一个人淡入而另一个人淡出。相反,您应该使用一个侦听器(甚至可能是持久的)并为您的对象提供 "target alpha" 属性 以及 delta 以更改每帧的 alpha。一个例子:
var bbta:Number=0.2; // btn.barra's target alpha
_btn.addEventListener(Event.ENTER_FRAME,_btnFade);
function _btnFade(e:Event):void {
var a:Number=_btn.barra.alpha;
if (Math.abs(a-bbta)<1e-8) return;
// no sense of setting alpha with minuscule difference
const delta:Number=0.1; // how fast to change per frame
if (a>bbta) {
a-=delta;
if (a<=bbta) a=bbta;
} else {
a+=delta;
if (a>=bbta) a=bbta;
}
_btn.barra.alpha=a;
}
function _btnOver(event:MouseEvent):void {
_btn.buttonMode = true; // move this elsewhere, if you don't cancel buttonMode
bbta=0.5; // set target alpha, the listener will do a fade-in
}
function _btnOut(event:MouseEvent):void {
bbta=0.2; // set target alpha, the listener will do a fade-out
}
我在这里编辑了一些代码,基本上我正在检查悬停状态 onLoop 函数,所以你可以在这里更改你的设置
import flash.events.Event;
var isRolledOver:Boolean = false;
//Funciones ROLL OVER
function _btnOver(event:MouseEvent):void {
isRolledOver = true;
}
function _btnOut(event:MouseEvent):void {
isRolledOver = false;
}
_btn.addEventListener(MouseEvent.ROLL_OVER,_btnOver);
_btn.addEventListener(MouseEvent.ROLL_OUT,_btnOut);
this.addEventListener(Event.ENTER_FRAME,onLoop);
function onLoop(e){
if(this.isRolledOver){
if(_btn.barra.alpha < 0.5) _btn.barra.alpha += 0.1;
}
else{
if(_btn.barra.alpha > 0.5 || _btn.barra.alpha > 0) _btn.barra.alpha -= 0.1;
}
}
我添加了示例 fla 以防万一