This repository has been archived on 2026-05-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
wilysays/net/aklabs/demo/simonsays/SimonButton.as

124 lines
3.6 KiB
ActionScript
Raw Normal View History

package net.aklabs.demo.simonsays {
import flash.events.MouseEvent;
import flash.display.Bitmap;
import flash.display.Sprite;
/*
* class SimonButton
*
* This is just a custom button class that is pixel-accurate, because the Mastermin/Simon Says
* buttons are an extremely odd shape, so I needed something that could detect mouse hits in/
* outside of the alpha color areas.
*
* Most of this class is really self explanatory, so I'm not going to bother documenting all of it. Only the parts that don't make immediate sense.
*/
public class SimonButton extends Sprite
{
protected var imgDown:Bitmap; // bitmap for when the button is pressed
protected var imgUp:Bitmap; // bitmap for when the button is released
protected var curImg:Bitmap; // the bitmap currently being displayed on the button
protected var magicColor:Number; // the magic color (e.g. "magic pink"), if any (otherwise alpha is used for hit detection)
public function SimonButton(imgDown:Bitmap = null, imgUp:Bitmap = null, magicColor = 0x00000000)
{
super();
this.imgDown = imgDown;
this.imgUp = imgUp;
this.curImg = null;
this.magicColor = magicColor;
this.addEventListener(MouseEvent.MOUSE_DOWN, this.onMouseDown);
this.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUp);
this.addEventListener(MouseEvent.CLICK, this.onMouseClick);
}
public function setMagicColor(color:Number)
{
this.magicColor = color;
}
public function setBtnDown(obj:Bitmap)
{
if ( obj ) {
this.imgDown = obj;
}
}
public function setBtnUp(obj:Bitmap)
{
if ( obj ) {
this.imgUp = obj;
}
}
public function onMouseDown(obj:MouseEvent)
{
if ( (obj) && (! this.hitTestPoint(obj.localX, obj.localY)) ) {
obj.stopImmediatePropagation();
return;
}
if ( this.curImg ) {
this.removeChild(this.curImg);
}
if ( this.imgDown ) {
this.addChild(this.imgDown);
this.curImg = this.imgDown;
}
}
public function onMouseUp(obj:MouseEvent)
{
if ( (obj) && (!this.hitTestPoint(obj.localX, obj.localY)) ) {
obj.stopImmediatePropagation();
return;
}
if ( this.curImg ) {
this.removeChild(this.curImg);
}
if ( this.imgUp ) {
this.addChild(this.imgUp);
this.curImg = this.imgUp;
}
}
public function onMouseClick(obj:MouseEvent)
{
if ( ! this.hitTestPoint(obj.localX, obj.localY) ) {
obj.stopImmediatePropagation();
}
}
/*
* hitTestPoint(x, y, shapeFlag)
*
* An overriden version of hitTestPoint that is pixel-accurate. If the value at (x, y) is either A: of the value
* in the "magic color", or B: containing an alpha value of zero, then the hit is POSITIVE. Otherwise it is false.
*
* arguments:
* @x:Number, the X location of the hit relative to the origin of the object
* @y:Number, the Y location of the hit relative to the origin of the object
* @shapeFlag:Boolean, not used, just here for compatibility
*
* returns: Boolean (true if the hit is positive, false if it's negative)
*/
public override function hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean
{
var color:uint;
var rgb:uint;
var a:uint;
if ( this.curImg && this.curImg.bitmapData ) {
color = this.curImg.bitmapData.getPixel32(x, y);
a = ((color >> 24) & 0xFF);
rgb = (color & 0xFFFFFF00);
//trace("Alpha : " + a + " RGB " + rgb + " magic color " + this.magicColor);
if ( this.magicColor == rgb || a == 0 ) {
return false;
}
return true;
}
return false;
}
}
}