[英]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(影響時間)算法。
截至目前,您還無法修復您的代碼,因為應用運動是它應該工作的相反方式。 您先移動然后測試,而正確的方法是先測試然后移動。 例如:
如您所見,您做相反的事情:
結果是對象重疊。
您可以在不更改代碼的情況下做為黑客,是計算重疊部分,然后更正對象位置。
您可以嘗試使用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.