Yes, the collission here happens because the laser image is rotated and have a large axis-aligned bounding box in the global coordinate space. Like the red square that I added on your image here:
Since I am one of the contributors to the Starling Graphics Extension, and I have just pushed in some very nifty collission detection methods, I would like to explain how the Graphics Extension can make your life a lot easier.
One way to solve this is to use the brand spanking new API in the Starling Graphics Extension, that uses Geometry Based hit tests.
Basically, what you could do here, is to create a Stroke for each of the bounding boxes you wish to do collision detection against. So, for each of your "creeps", create a corresponding creepStroke, like this:
#import starling.display.graphics.Stroke // Import
protected var creepStroke:Stroke = new Stroke(); // one per "creep"
creepStroke = new Stroke(); // Create the bounding box for the creep
var bounds:Rectangle = creep.bounds(creep);
then, whenever you move each creep in x and y, you move the creepStroke the same way.
That means that the creepStroke will match the bounding box of the creep at all times.
then, you create a Stroke for the Laser, but this time you only add the start and the end point to the Stroke (since the Laser is a line)
laserStroke = new Stroke();
(The moveTo and lineTo is fairly quick, so if you do this repeatedly, just call laserStroke.clear(), then the moveTo and LineTo, which will not have a noticeable performance hit)
Then, whenever you do your collision test, you do:
var collidePt:Point = new Point(); // allocate these once, not every frame
var collisionPointsInGlobalCoords:Vector.<Point> = new Vector.<Point>(4, true); // max 4 collide points per creep
for ( var i:int = 0; i < creepStrokes.length; i++ ) // assume the creepStrokes are in a vector
if ( Stroke.strokeCollideTest(laserStroke, creepStroke[i], collidePt, collisionPointsInGlobalCoords) == true )
// if true, we have a hit, and the impact points are stored in the collisionPointsInGlobalCoords vector
If you dont care where the laser and the creep collides, you can ignore the content of the collisionPointsInGlobalCoords and just use the boolean return value to indicate that the collision has occured.
This method has only been around for a few days, so you need to pull down the latest src, not the SWC, as I haven't been able to update that yet.
BUT, this is a new, very fast and efficient way to do any type of collision detection, and the strokes are not limited to boxes like in this case. Any Stroke shape will do.
If you wish to visually verify that the Strokes are in the correct place, just add them to the same parent as the laser and the creeps, and they will pop up (lineTo also take a color etc, so you can play with that if you want) visually.
I have added Example 10 to the Examples section of the Starling Graphics Extension, to show how this can be used.