所以我不确定如何说出这个问题 - 如果有人有更好的想法,请随意:)
但基本上,我的sidescroller碰撞表现得很奇怪。我有一个边界'开始位置左侧的框(_boundaries
),以防止字符在开始时向左移动。以前,它工作正常(但其他事情都破了)。在解决了许多其他碰撞问题(IE落在地板上,陷入地板,重力表现奇怪)之后,左碰撞大部分时间都停止了工作。
如果你从5-10像素进入墙壁,你将会,而不是被阻挡/阻止移动,你会传送'到了墙的顶部并继续前进。如果您的距离小于5-10像素,并开始移动,则会被阻止。我已经提供了一个图像(通过链接)到布局是什么。
但是如何修复我的sidescroller代码,以便墙总是阻塞(没有一个可笑的巨大碰撞盒/区域)。或者,是否有更好的方法来处理我的所有碰撞?
http://i.imgur.com/orvErfQ.png
碰撞代码:
private function processCollisions():void
{
//Respawn if fell off stage
if(_player.y > stage.stageHeight)
{
_player.x = _startMarker.x;
_player.y = _startMarker.y;
_boundaries.x = 0;
_boundaries.y = 0;
_vy = 0;
}
//Otherwise process collisions with boundaries
else
{
var testX = _player.x
var testY = _player.y - (_player.height / 2);
var vCollision:Boolean = false;
if(moveLeft){
testX -= horizMove;
if(_boundaries.hitTestPoint((testX - _player.width / 2), _player.y-5, true))
{
moveLeft = false;
trace("PING");
}
}
if(moveRight){
testX += horizMove;
if(_boundaries.hitTestPoint((testX + _player.width / 2), _player.y-5, true))
{
moveRight = false;
trace("PONG");
}
}
if(jump){
testY += vertMove;
if(_boundaries.hitTestPoint(_player.x, (testY - _player.height / 2), true))
{
jump = false;
trace("PANG");
}
}
//if(_vy > 0){
testY += _vy;
if(_boundaries.hitTestPoint(_player.x, (testY + _player.height / 2), true))
{
vCollision = true;
}
if(vCollision)
{
while(vCollision)
{
_player.y -= 0.1;
vCollision = false;
if(_boundaries.hitTestPoint(_player.x, _player.y, true))
{
vCollision = true;
}
}
_vy = 0;
}
}
movement();
}
运动代码:
private function movement():void
{
if(moveLeft)
{
_vx = -5;
faceLeft = true;
faceRight = false;
}
else if(moveRight)
{
_vx = 5;
faceLeft = false;
faceRight = true;
}
else if(jump)
{
//_player.y += vertMove;
_vy = -15;
}
}
使用它的地方:
private function enterFrameHandler(e:Event):void
{
//Upon entering a frame;
//Gravitate Player
_vy += 1.75;
//Move Player
_player.x += _vx;
_player.y += _vy;
//Process Collisions for Player
processCollisions();
//Scroll map
scrollStage();
}