簡體   English   中英

與位圖AS3的碰撞

[英]Collision with Bitmap AS3

因此,我創建出一個漂亮的碰撞系統在這里 現在我有了我自己的角色精靈,它使各個方面的碰撞變得混亂。

編輯:因為人們誤解了我想要的東西,所以我希望它在底部和頂部重疊,從而為它提供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;
        }
    }

沒錯(我是說代碼就是這樣做的),而且效果也取決於幀速率。

原理很容易理解。 例如:將一個對象移動5個像素,碰撞的對象距離3個像素,當測試碰撞時,您有2個像素的重疊。 要糾正此問題,您需要一種所謂的TOI(影響時間)算法。

截至目前,您還無法修復您的代碼,因為應用運動是它應該工作的相反方式。 您先移動然后測試,而正確的方法是先測試然后移動。 例如:

  1. 您將要移動對象x像素。
  2. 測試對象+ x像素是否會碰撞。
  3. 如果它會發生碰撞,請計算您應將其移動多少,然后再將其移動x像素-校正后的像素。
  4. 如果它不會碰撞,則將其移動x個像素。

如您所見,您做相反的事情:

  1. 移動x像素。
  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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM