所以我创建了一个很好的碰撞系统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;
}
}
答案 0 :(得分:0)
这是正确的(我的意思是代码所做的),这种效果也取决于帧率。
原则很容易理解。例如:您将对象移动5个像素,碰撞对象距离3个像素,当您测试碰撞时,您有2个像素的重叠。要纠正这个问题,您需要所谓的TOI(影响时间)算法。
到目前为止,没有修复你的代码,因为你应用一个动作是它应该工作的相反方式。先移动然后测试,而正确的方法是测试然后移动。例如:
如你所见,你做了相反的事情:
结果是重叠的对象。
在不更改代码的情况下,您可以做什么,计算重叠,然后更正对象位置。
答案 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;
}