【问题标题】:Collision with Bitmap AS3与位图 AS3 冲突
【发布时间】:2015-11-19 16:42:42
【问题描述】:

所以我创建了一个很好的碰撞系统,显示为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;
        }
    }

【问题讨论】:

    标签: actionscript-3 bitmap


    【解决方案1】:

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

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

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

    1. 您即将将对象移动 x 个像素。
    2. 测试对象 + x 像素是否会发生碰撞。
    3. 如果它会发生碰撞,计算你应该移动它的距离,然后将它移动 x 像素 - 校正像素。
    4. 如果它不会发生碰撞,则将其移动 x 个像素。

    如您所见,您的做法正好相反:

    1. 移动 x 个像素。
    2. 测试碰撞。

    结果是重叠的对象。

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

    【讨论】:

    • 我想你误解了我说的话。我希望它在底部和顶部重叠,就像 2D 游戏中的伪 3D 碰撞系统一样。我遇到的问题是它没有正确碰撞(碰撞离墙壁太远,与侧面重叠等)
    【解决方案2】:

    您可以尝试使用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多