【问题标题】:Stack overflow error with hitTest in AS3AS3 中的 hitTest 堆栈溢出错误
【发布时间】:2013-06-14 14:18:15
【问题描述】:

所以,我有一个小行星的类文件,在其中,我使用了以下代码:

public var ourAsteroid:Asteroid = new Asteroid(stage);

为了让小行星成为一个变量,但是当我添加这个块时:

public function hitTest(e:Event) : void {
        if (ourAsteroid.hitTestObject(ourAsteroid))
            speed = -speed;


    }

我在 Asteroid.As 文件中收到 #1023 堆栈溢出错误。

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    ourAsteroid.hitTestObject(ourAsteroid) 在对自身执行命中测试时导致错误。

    hitTestObject 应该只针对其他对象执行,因为如果对象重叠,它将返回 true。鉴于您评论中的speed = -speed 行,我可以猜到您实际上想要做的是让小行星从某些东西上反弹。如果您希望它从屏幕边缘反弹,您只需要测试对象的边界何时到达边缘,例如在水平方向:

    if(ourAsteroid.x < 0) {
        ourAsteroid.x = 0;
        speed = -speed;
    }
    else if(ourAsteroid.x > stage.width - ourAsteroid.width) {
        ourAsteroid.x = stage.width - ourAsteroid.width;
        speed = -speed;
    }
    

    如果您希望它从另一个对象反弹,只需像以前一样使用命中测试:ourAsteroid.hitTestObject(someOtherObject)。请注意,这是一个非常简单的实现,您可能会看到对象相互卡住等问题,但它至少可以帮助您入门。

    【讨论】:

    • 嗯,我正在使用一个数组将多个小行星随机添加到屏幕上,并且我正在尝试将其设置为如果这些小行星接触,它们就会相互反弹。
    • 那么我的回答中的最后一段仍然有效:您只需要确保您没有针对自身测试对象。但是,总体而言,这将不起作用:即使对于基本的边界框碰撞,您也需要检查小行星是否在顶部/底部/左侧/右侧碰到了另一个小行星并相应地更改 x 或 y 速度(即,您需要两个速度变量并使用类似于我提供的代码来测试与屏幕侧面的碰撞)。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2019-02-16
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多