该实例来源于《Making Things Move》一书,对于对象碰撞检测hitTestObject方法使用简单,不过对于不规则形状就显示“错误的碰撞“,所以对于矩形来说,hitTestObject检测碰撞的结果很好,(让我联想到俄罗斯方块的设计了),另外,你也可以尝试绘制出你喜欢的图形来看看效果!
代码如下:
NewGraphic.as
package org.luosijin.hit
{
import flash.display.Sprite;
public class NewGraphic extends Sprite
{
private var _w:Number; //定义矩形宽度
private var _h:Number; //定义矩形高度
private var _unit:uint //定义矩形颜色
public var vx:Number=0; //定义矩形X轴速度
public var vy:Number=0; //定义矩形Y轴速度
public function NewGraphic(width:Number=50,height:Number=50,color:uint=0xff0000)
{
this._w = width;
this._h = height;
this._unit = color;
init();
}
public function init():void
{
graphics.beginFill(_unit);
graphics.drawRect(_w/2,_h/2,_w,_h);
graphics.endFill();
}
}
}
package org.luosijin.hit
{
import flash.display.Sprite;
public class NewGraphic extends Sprite
{
private var _w:Number; //定义矩形宽度
private var _h:Number; //定义矩形高度
private var _unit:uint //定义矩形颜色
public var vx:Number=0; //定义矩形X轴速度
public var vy:Number=0; //定义矩形Y轴速度
public function NewGraphic(width:Number=50,height:Number=50,color:uint=0xff0000)
{
this._w = width;
this._h = height;
this._unit = color;
init();
}
public function init():void
{
graphics.beginFill(_unit);
graphics.drawRect(_w/2,_h/2,_w,_h);
graphics.endFill();
}
}
}
Graphics.as
package org.luosijin.hit
{
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.Timer;
public class Graphics extends Sprite
{
private var _graphic:NewGraphic;
private var _graphices:Array;
private var _gravity:Number = 0.3;
public function Graphics():void
{
init();
}
private function init():void
{
_graphices = new Array();
createGraphic();
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function createGraphic():void
{
if(_graphices.length>80)
{
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
//随机初始化宽高与颜色
_graphic = new NewGraphic(Math.random()*40+10,Math.random()*40+10,Math.random()*0XFFFFFF);
_graphic.x = Math.random()*stage.stageWidth; //随机初始化图形的x位置
addChild(_graphic);
_graphices.push(_graphic);
}
private function onEnterFrame(event:Event):void
{
//重力加速放到图形的y轴上
_graphic.vy += _gravity;
_graphic.y += _graphic.vy;
//判断是否到达屏幕底部
if(_graphic.y+_graphic.height/2>stage.stageHeight)
{
_graphic.y = stage.stageHeight-_graphic.height/2;
createGraphic();
}
//循环判断是否碰撞到其中一个图形
for(var i:int=0;i<_graphices.length;i++)
{
if(_graphic!=_graphices[i]&&_graphic.hitTestObject(_graphices[i]))//确定图形是否与 显示图形的边框重叠或相交。
{
_graphic.y = _graphices[i].y-_graphices[i].height/2-_graphic.height/2;
createGraphic();
}
}
}
}
}