as3 - 使用计时器检测对象是否移动到另一个对象

时间:2017-10-03 16:16:21

标签: actionscript-3 flash timer

我创造了一个射击游戏,目标出现并在任何时间消失。我不知道如何使用代码,我不知道在使用if statement时如何检测对象的对象。

这是我的代码:

import flash.utils.Timer;

var dummySX: Number = dummyS.x;
var dummySY: Number = dummyS.y;


var targetTimeStart: Timer = new Timer(1000);
targetTimeStart.start();
targetTimeStart.addEventListener(TimerEvent.TIMER, targetTimeStartNow);

function targetTimeStartNow(e: TimerEvent): void {
    target.x = dummySX;
    target.y = dummySY;
    targetTimeStart.stop();
}

function detect(): void {
    if ((target.x == dummySX) && (target.y == dummySY)) {
        trace("DETECTED");
    }
}

function detect(): void {
    if (target.hitTestObject(dummyS)==true) {
        trace("DETECTED");
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

有几种方法可以检测对象之间的命中。 假设您有2个显示对象( do1 do2

首先是do1。 hitTestObject (do2)。这种方法非常快,适用于矩形物体。你可以在视觉上得到一些错误的#34;如果旋转矩形对象或使用矩形对象以外的结果,则会产生结果。

接下来是do1。 hitTestPoint (do2.x,do2.y,shapeFlag)。此方法较慢但更准确,尤其是在将shapeFlag设置为true时。它针对单个点(x& y坐标)测试命中。

第三种方法( hitTest )暗示您使用BitmapData对象,这更加精确并且特定于BitmapData类,但更难处理(能够忽略透明像素) )。

第四个选项是对命中检测进行自定义实现,但这里似乎有点细节。

查看代码,我看到你创建一个1秒的Timer对象并启动它,然后添加一个带有 targetTimeStartNow 功能的监听器。在该函数中,您将目标对象移动到 dummyS 对象的相同位置,然后停止 targetTimeStart Timer对象。这意味着您在该功能中只有一个条目。

检测功能似乎永远不会从您的代码中调用,但两个调用都应该跟踪已检测

您编写的第一个检测功能模仿hitTestPoint版本。

DECLARE @TestTable varchar(50) ='TableTest'

DECLARE @TestDatabase varchar(30) ='DatabaseTest'

DECLARE @TestIndex VARCHAR(150) ='NonClusteredIndex-20150617-075305'

DECLARE @TestSchema VARCHAR(20) ='SChemaTest'

EXEC sp_rename N'[' + @TestSchema + '].['+@TestTable+'].['+ @TestIndex +']'

, REPLACE( @TestIndex,'-','_')

, N'INDEX'

这与:

相同
function detect(): void {
    if ((target.x == dummySX) && (target.y == dummySY)) {
        trace("DETECTED");
    }
}

最好使用此变体(为了使用对象的形状,而不是它们的边界框):

function detect():void {
    if(target.hitTestPoint(dummySX, dummySY, false)) {
        trace("DETECTED");
    }
}

第二个检测功能使用hitTestObject,它没问题。您可以在没有显式== true的情况下使用它:

function detect():void {
    if(target.hitTestPoint(dummySX, dummySY, true)) {
        trace("DETECTED");
    }
}

唯一的事就是在代码中调用它以使其执行。所以在移动目标对象后的某处,只需添加:

function detect(): void {
    if(target.hitTestObject(dummyS)) {
        trace("DETECTED");
    }
}

根据您的需要,您可以将其添加到 targetTimeStartNow 方法(或添加EnterFrame侦听器,或创建另一个Timer对象):

detect();