动态增加mousedown上按钮的hitbox,并在鼠标上恢复?

时间:2012-08-13 08:28:47

标签: actionscript-3 flash actionscript

我试图这样做,当你按下一个按钮时,按钮的命中框变大,所以如果用户将鼠标从已按下按钮的边缘滑出,则需要它进一步移动在它不再计算点击之前。

这将用于触摸屏设备,用户将在其中点击,但在释放前滑动手指,这将无法完成点击事件。

我正在使用标准的flash按钮(flash.display.SimpleButton),所以理想情况下会喜欢与它们一起工作的东西 - 我一直在看hitTestState作为解决方案,但我正在努力的工作。

假设按钮的大小为50,50

当用户触发mouse_down事件时,我希望它变为100乘100,以hitbox为中心(不是实际按钮,只是命中) - 然后在点击或释放时,它会淡化为50,50尺寸。

有什么想法吗?

由于 约翰

2 个答案:

答案 0 :(得分:2)

用影片剪辑替换您的按钮。有很多方法可以做到,但这里有一个有效的结构。

上方和上方的较小命中区域:

Up Frame

在下框中有一个更大的区域:

Down Frame

(显然你会将命中区域设为零alpha,但我已将其着色,以便您可以看到正在发生的事情。)

然后您只需要一个非常简单的代码。给定一个名为MyButton的舞台实例:

import flash.display.MovieClip;
import flash.events.MouseEvent;

var MyButton:MovieClip;
MyButton.buttonMode = MyButton.useHandCursor = true;

function handleMouseOver($e:MouseEvent):void
{
    MyButton.gotoAndStop("Over");
}

function handleMouseDown($e:MouseEvent):void
{
    MyButton.gotoAndStop("Down");
}

function handleMouseUp($e:MouseEvent):void
{
    MyButton.gotoAndStop("Up");
}

MyButton.addEventListener(MouseEvent.MOUSE_OVER, handleMouseOver);
MyButton.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
MyButton.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);

如果您想多次重复使用,可以轻松地将其重构为您的MovieClip可以扩展的类。

希望这有帮助。

答案 1 :(得分:1)

好吧,放弃hitbox并转到hitTestPoint会更容易。

所以你可以加上这个:

var hitObject:Sprite = new Sprite();
//Create a new Sprite
hitObject.graphics.beginFill(0);
hitObject.graphics.drawRect(0,0,50,50);
hitObject.endFill();
//Draw a rectangle on the sprite, this is your hitbox

hitObject.alpha = 0;
//Make it invisible
hitObject.x = button.x;
hitObject.y = button.y;

addChild(hitObject);

addEventListener(MouseEvent.MOUSE_DOWN, mDownEvent);
addEventListener(Event.ENTER_FRAME, enterFrameEvent);

function mDownEvent(e:MouseEvent){
     hitObject.scaleX = hitObject.scaleY = 2;
     //When the mouse is down the object gets 2 times as big (100 pixels)

     if(hitObject.hitTestPoint(mouseX,mouseY, true)){
         //You have clicked your hitbox
     }
}

function enterFrameEvent(e:Event){
     if(hitObject.scaleX > 1){
           hitObject.scaleX -= 0.1;
           hitObject.scaleY -= 0.1;
           //Decrease the hitbox his size when you have pressed the mouse, 0.1 is the speed the hitbox gets smaller
     }
}