Flash 在Actionscript 3中优化碰撞检测。
我正试图在ActionScript3中制作我的第一个游戏。这是一个简单的炮兵游戏,你在左下角有一把枪,AIs在屏幕上飞过,你必须击落它。现在,在一个分级射击游戏中,这是如何实现的,要么是从枪中发射一颗子弹,然后用AI movieClip对该子弹进行命中测试,要么就是简单地移除(或播放死亡动画)AI movieClip。但问题是。我两个都不想做。我想展示一支射速很快的枪,因此没有子弹。我也不希望玩家点击AI电影剪辑来摧毁它们(只要枪/炮塔指向正确的方向就足够了)。这就是我试过的 这张图片应该有助于描绘整个事情Flash 在Actionscript 3中优化碰撞检测。,flash,actionscript-3,collision-detection,Flash,Actionscript 3,Collision Detection,我正试图在ActionScript3中制作我的第一个游戏。这是一个简单的炮兵游戏,你在左下角有一把枪,AIs在屏幕上飞过,你必须击落它。现在,在一个分级射击游戏中,这是如何实现的,要么是从枪中发射一颗子弹,然后用AI movieClip对该子弹进行命中测试,要么就是简单地移除(或播放死亡动画)AI movieClip。但问题是。我两个都不想做。我想展示一支射速很快的枪,因此没有子弹。我也不希望玩家点击AI电影剪辑来摧毁它们(只要枪/炮塔指向正确的方向就足够了)。这就是我试过的 这张图片应该有助于
var baseAI:BaseAI;
var AIList:Array= new Array;
public function shipGame():void{
trace("still connected!!");
/*
irrelevant code..
*/
stage.addEventListener(Event.ENTER_FRAME, updateGame);
var a:MovieClip = new MovieClip;
aiTimer = setInterval(StartAI, 2000);
}
public function StartAI():void {
baseAI = new BaseAI(this);
AIList.push(baseAI);
}
public function updateGame(event:Event):void {
/*
code to rotate the turret here..
*/
for (var i:int = 0; i < AIList.length; i++)
{
if (AIList[i].myx < 100) {
AIList[i].basicAI.parent.removeChild(AIList[i].basicAI);
AIList.splice(i, 1);
}
}
if (mouseDn) {
basicTurret.gotoAndPlay(2);// Fire animation
for (var j:int = 0; j < AIList.length; j++)
{
if ( intersection(AIList[j])) // intersection(bai:BaseAI) returns boolean. Works fine.
{
AIList[j].shot = true;
}
}
}
}
所有当前的方法基本上都依赖于Flash的渲染器来知道舰船和子弹线的位置。但是在你的例子中,因为你在运动部件之间有一个相对简单的几何关系,用解析的方法处理这个问题会快得多 考虑一下这样的情况,一艘船正好停在你的枪口上。在这种情况下,枪、船和屏幕底部形成一个直角三角形。如果我们将
theta
定义为枪与屏幕底部之间的角度,则以下内容适用:
tangent(theta) = ship.y / ship.x
其中,x
和y
从枪的右侧和上方测量。现在,您可以对其进行概括,并将其用于命中测试。当枪开火时,首先找到theta
。然后,对于每艘飞船,您可以通过如下操作轻松确定飞船与火线的垂直或水平距离:
var theta = /*determine theta based on where the mouse was clicked*/
var tanTheta = tangent(theta);
for each (ship) {
var gunX = ship.y / tanTheta;
if ( abs(gunX - ship.x) < ship.width/2 ) {
// a hit occurred
}
}
var theta=/*根据鼠标单击的位置确定θ*/
var tanTheta=切线(θ);
每艘(船){
var gunX=船舶y/tanTheta;
如果(abs(gunX-ship.x)
这只是伪代码,希望你能理解。不管怎样,这就是我要做的——这将比使用真实命中测试进行的任何操作都要快得多,而且对于所描述的情况,它也应该工作得很好
var theta = /*determine theta based on where the mouse was clicked*/
var tanTheta = tangent(theta);
for each (ship) {
var gunX = ship.y / tanTheta;
if ( abs(gunX - ship.x) < ship.width/2 ) {
// a hit occurred
}
}