几个星期以来,我一直在努力打造自上而下的比赛。它已经进行了一段时间,但在某些时候我想创建一个到处都有墙的滚动地图。现在,为了便于创建地图(并在以后添加更多内容),我创建了一个名为“Wall”的类,我将对其进行测试。这有效,当它击中时,地图必须停止滚动。它到目前为止确实很好。
现在,当玩家离开物体时,我希望地图能够再次滚动,这也有效,但现在玩家无法移动到玩家来自的一侧。我知道这是因为我需要定义玩家进入的边,以便告诉游戏当时必须将哪个动作设置为零。
您可以在此处查看代码:
public function AddWalls(player:MovieClip)
{
WallObjects = new Array();
for (var i:int = 0; i < this.numChildren; i++)
{
var mc = this.getChildAt(i);
if (mc is Wall)
{
var wallobj:Object = new Object();
wallobj.mc = mc;
wallobj.leftside = mc.x;
wallobj.rightside = mc.x + mc.width;
wallobj.topside = mc.y;
wallobj.bottomside = mc.y + mc.height;
wallobj.width = mc.width;
wallobj.height = mc.height;
WallObjects.push(wallobj);
}
}
}
public function EnableCollisionWithWalls():void
{
for (var k:int = 0; k < WallObjects.length; k++)
{
//if (player.y > WallObjects[k].topside && player.y < WallObjects[k].bottomside && player.x > WallObjects[k].leftside && player.x < WallObjects[k].rightside)
if (player.hitTestObject(WallObjects[k].mc))
{
if (player.x > WallObjects[k].leftside && player.x < WallObjects[k].leftside+15)
{
Lefthit = true;
trace(DebugVar);
DebugVar++;
player.x = WallObjects[k].leftside;
Scroll_x = 0;
}
else
if ( player.x < WallObjects[k].leftside -1 || (player.y > WallObjects[k].leftside ))
{
Lefthit = false;
}
if (player.hitTestObject(derp))
{
Lefthit = false;
}
}
}
}
public function EnableMovement():void
{
map.x += Scroll_x;
map.y += Scroll_y;
for (var i:int = 0; i < this.numChildren; i++)
{
var mc = this.getChildAt(i);
if (mc is Wall)
{
mc.x += Scroll_x;
mc.y += Scroll_y;
}
}
}
public function MovementKeysDown(move:KeyboardEvent):void
{
var Speed:int = -5;
switch (move.keyCode)
{
case 37: // venstre knap
Scroll_x = -Speed;
break;
case 38: // op
Scroll_y = -Speed;
break;
case 39: // højre knap
Scroll_x = Speed;
if (Lefthit)
{
Scroll_x = 0;
}
break;
case 40: // ned
Scroll_y = Speed;
break;
default:
}
}
public function MovementKeysUp(move:KeyboardEvent):void
{
switch (move.keyCode)
{
case 37:
Scroll_x = 0;
break;
case 38:
Scroll_y = 0;
break;
case 39:
Scroll_x = 0;
break;
case 40:
Scroll_y = 0;
break;
default:
}
}
可能会出现一些语法错误(因为我在此编辑器中删除了一些代码)。 您可以看到current version here。
在这个版本中,滚动继续。我确实为它做了一个“修复”,通过检查玩家是否距离动画片段1个像素,在命中测试中(由于某种原因可以工作,我想它不应该因为它不再命中了)然后将Lefthit设置为false。然而,这不是一个好的解决方案,如果你继续向上或向下离开动画片段,你仍然无法再向右走......
很长一段时间以来,我一直对此感到困惑,所以我认为这是我寻求帮助的时候了。我无法找到关于如何在自上而下的游戏中控制运动的任何内容,使用滚动地图+墙:/答案 0 :(得分:0)
最简单(但不是最资源友好)的解决方案(如果你总是有一个墙壁存储)是在墙上迭代而不是使用Flash默认hitTest
(我不喜欢它的方式自ActionScript 2开始工作 - 只需检查坐标,如果您发现下一个模拟步骤会发生碰撞 - 根据游戏逻辑处理它。
此算法最有用的优化是创建一个过滤器/数据结构,仅用于获取靠近播放器的墙壁,因此可能会受到碰撞测试的影响。