Moved our custom hit-testing here from MsoySprite.

I was hoping to have our nice transparent-pixels-don't-count hitting
for every media container, including any game icon decoration over
an avatar's head, but after moving this I remembered that it may
be pointless, as it *never matters*- flash simply doesn't use this
method to test mouse-overness. So it may be moot, unless we do mouse-over
polling like we do in the RoomView, which is too expensive to do everywhere..


git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@252 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Ray Greenwell
2007-05-18 20:40:24 +00:00
parent 95f14a3c03
commit 44d35eb9d3
+59 -3
View File
@@ -21,7 +21,7 @@
package com.threerings.flash {
//import flash.display.Bitmap;
import flash.display.Bitmap;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Loader;
@@ -136,6 +136,7 @@ public class MediaContainer extends Sprite
} else {
setupSwfOrImage(url);
}
didShowNewMedia();
}
/**
@@ -160,17 +161,25 @@ public class MediaContainer extends Sprite
addChildAt(disp, 0);
_media = disp;
updateContentDimensions(disp.width, disp.height);
didShowNewMedia();
}
/**
* A place where subclasses can initialize things prior to showing
* new media.
* A place where subclasses can initialize things prior to showing new media.
*/
protected function willShowNewMedia () :void
{
_initialized = false;
}
/**
* A place where subclasses can configure things after we've setup new media.
*/
protected function didShowNewMedia () :void
{
// nothing right now, but call super() you overriders.
}
/**
* Configure this sprite to show a video.
*/
@@ -363,6 +372,53 @@ public class MediaContainer extends Sprite
// do nothing in base MediaContainer
}
/**
* Note: This method is NOT used in normal mouseOver calculations.
* Normal mouseOver stuff seems to be completely broken for transparent
* images: the transparent portion is a 'hit'. I've (Ray) tried
* just about everything to fix this, more than once.
*
* But if someone *does* call this method (we do, in whirled), then
* attempt to do the right thing.
*/
override public function hitTestPoint (
x :Number, y :Number, shapeFlag :Boolean = false) :Boolean
{
// if we're holding a bitmap, do something smarter than the
// flash built-in and actually check for *GASP* transparent pixels!
try {
if (shapeFlag && _media is Loader &&
// the childAllowsParent check here causes a security
// violation if it doesn't. WHAT THE FLYING FUCK.
Loader(_media).contentLoaderInfo.childAllowsParent &&
(Loader(_media).content is Bitmap)) {
var b :Bitmap = Bitmap(Loader(_media).content);
var p :Point = b.globalToLocal(new Point(x, y));
// check that it's within the content bounds, and then check the bitmap directly
if (p.x >= 0 && p.x <= getMaxContentWidth() && p.y >= 0 &&
p.y <= getMaxContentHeight() &&
b.bitmapData.hitTest(new Point(0, 0), 0, p)) {
return true;
} else {
// the bitmap was not hit, see if other children were hit...
for (var ii :int = numChildren - 1; ii >= 0; ii--) {
var child :DisplayObject = getChildAt(ii);
if (child != _media && child.hitTestPoint(x, y, shapeFlag)) {
return true;
}
}
return false;
}
}
} catch (err :Error) {
// nada
}
// normal hit testing
return super.hitTestPoint(x, y, shapeFlag);
}
override public function toString () :String
{
return "MediaContainer[url=" + _url + "]";