与位图AS3发生冲突

时间:2015-11-19 16:42:42

标签: actionscript-3 bitmap

所以我创建了一个很好的碰撞系统here。现在我有了自己的角色精灵,它已经搞砸了所有方面的碰撞。

编辑:因为人们误解了我想要的东西,我希望它在底部和顶部重叠,它给它一个3D效果。我的问题是它与位图错误地碰撞

我尝试使用像素完美碰撞系统,但我遇到了问题:

它只检测边缘处的碰撞,正如你在视频中看到的那样,球可以在前面和后面略微移动,就像它不是一个平面一样。

负责当前碰撞的代码(它确实有一些其他的东西,但已被删除):

    for each (var wall in Walls)
    {
        if (wall.hitTestPoint(Character.x, Character.y, true)) //col right
        {
            Character.x+=CharacterSpeed;
        }
        if (wall.hitTestPoint(Character.x, Character.y, true)) //col left
        {
            Character.x-=CharacterSpeed;
        }
        if (wall.hitTestPoint(Character.x , Character.y, true)) //col bottom
        {
            Character.y+=CharacterSpeed;
        }
        if (wall.hitTestPoint(Character.x, Character.y, true)) //col top
        {
            Character.y -= CharacterSpeed;
        }
    }

2 个答案:

答案 0 :(得分:0)

这是正确的(我的意思是代码所做的),这种效果也取决于帧率。

原则很容易理解。例如:您将对象移动5个像素,碰撞对象距离3个像素,当您测试碰撞时,您有2个像素的重叠。要纠正这个问题,您需要所谓的TOI(影响时间)算法。

到目前为止,没有修复你的代码,因为你应用一个动作是它应该工作的相反方式。先移动然后测试,而正确的方法是测试然后移动。例如:

  1. 您将要按x像素移动对象。
  2. 测试对象+ x像素是否会发生碰撞。
  3. 如果它会碰撞计算你应该移动多少,然后移动x像素 - 校正像素。
  4. 如果它不会碰撞,则将其移动x像素。
  5. 如你所见,你做了相反的事情:

    1. 按x像素移动。
    2. 测试碰撞。
    3. 结果是重叠的对象。

      在不更改代码的情况下,您可以做什么,计算重叠,然后更正对象位置。

答案 1 :(得分:0)

您可以尝试使用BitmapData.draw方法将对象绘制到BitmapData,然后使用BitmapData.hittest,这里有一个示例:

import flash.display.BitmapData;
import flash.geom.Point;

var myBitmapData:BitmapData = new BitmapData(100, 80, false, 0x00CCCCCC);

var mc_1:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth());

var mc_2:MovieClip = createRectangle(20, 20, 0xFF0000);

var destPoint:Point = new Point(myBitmapData.rectangle.x, myBitmapData.rectangle.y);
var currPoint:Point = new Point();

mc_1.onEnterFrame = function() {
    currPoint.x = mc_2._x;
    currPoint.y = mc_2._y;
    if(myBitmapData.hitTest(destPoint, 255, currPoint)) {
        trace(">> Collision at x:" + currPoint.x + " and y:" + currPoint.y);
    }
}

mc_2.startDrag(true);

function createRectangle(width:Number, height:Number, color:Number):MovieClip {
    var depth:Number = this.getNextHighestDepth();
    var mc:MovieClip = this.createEmptyMovieClip("mc_" + depth, depth);
    mc.beginFill(color);
    mc.lineTo(0, height);
    mc.lineTo(width, height);
    mc.lineTo(width, 0);
    mc.lineTo(0, 0);
    return mc;
}