我正在尝试编写一个利用所有四个方向移动角色的 Flash 游戏。(即按下向上移动角色向北、向下向南等) 游戏中的角色实际上并没有移动,而是背景移动以模拟移动。不过,我需要弄清楚如何对墙壁进行编程。我有识别碰撞的代码,但最好的方法是什么?这是我的代码:
stage.addEventListener(Event.ENTER_FRAME,handleCollision);
function handleCollision( e:Event ):void{
if(hero.hitTestObject(wall))
{
wall.x-=5;
Background.x-=5;
}
}
这会识别碰撞并阻止背景和墙壁移动,但这仅适用于角色从右侧撞到墙壁时。我是否必须将此代码插入每一面墙并根据情况进行调整?或者有没有一种更简化的方式来处理墙壁,这样我就可以将编码保持在最低限度?
更新:我尝试使用 Jason 使用数组来跟踪墙壁的想法,但现在我遇到了另一个问题。到目前为止,这是我的代码:
stage.addEventListener(Event.ENTER_FRAME,onenter);
var wall:Array = [北墙,南墙,东墙,西墙];
函数 onenter(e:Event):void {
if(Key.isDown(Key.RIGHT))
{
Background.x-=5;
hero.scaleX=1;
for each(var wall:MovieClip in walls)
{
Northwall.x-=5;
Southwall.x-=5;
Eastwall.x-=5;
Westwall.x-=5;
}
hero.gotoAndStop('walking sideways');
}
else if(Key.isDown(Key.LEFT))
{
Background.x+=5;
hero.scaleX=-1;
for each(var walls0:MovieClip in walls)
{
Northwall.x+=5;
Southwall.x+=5;
Eastwall.x+=5;
Westwall.x+=5;
}
hero.gotoAndStop('walking sideways');
}
else if(Key.isDown(Key.DOWN))
{
Background.y-=5;
for each(var walls1:MovieClip in walls)
{
Northwall.y-=5;
Southwall.y-=5;
Eastwall.y-=5;
Westwall.y-=5;
}
hero.gotoAndStop('walking down');
}
else if(Key.isDown(Key.UP))
{
Background.y+=5;
for each(var walls2:MovieClip in walls)
{
Northwall.y+=5;
Southwall.y+=5;
Eastwall.y+=5;
Westwall.y+=5;
}
hero.gotoAndStop('walking up');
}
else
{
hero.gotoAndStop('still 1');
}
for each (var walls:MovieClip in walls) {
if (hero.hitTestObject(Northwall))
{
Background.y-=5;
}
else if (hero.hitTestObject(Southwall))
{
Background.y+=5;
}
else if (hero.hitTestObject(Westwall))
{
Background.x-=5;
}
else if (hero.hitTestObject(Eastwall))
{
Background.x+=5;
}
代码编译,一切运行,但墙没有注册。我认为这与 if/else 语句中的移动代码有关。我认为墙壁是随着角色移动,而不是随着背景移动,这意味着我的角色永远不会到达墙壁来注册热门。我怎样才能编写代码让墙壁随着背景移动,这样我就可以实际测试我是否可以击中它们?
更新 2:我尝试使用 Jason 在我自己的程序中提供的代码,并且效果很好。角色移动并且可以撞墙,并且大多数移动代码按预期运行。但是,似乎只有东墙功能正常。南墙似乎从侧面注册,当我试图从北方击中它时表现得很奇怪。当然,我希望它从北方而不是从侧面注册,并具有与我撞到东墙时相同的效果。Northwall 和 Westwall 似乎也根本没有注册。这是完全实现的代码:
var walls:Array = [Northwall, Southwall, Eastwall, Westwall];
stage.addEventListener(KeyboardEvent.KEY_DOWN,keydownHandler);
function keydownHandler(event:KeyboardEvent):void
{
switch (event.keyCode)
{
case Keyboard.RIGHT:
moveWalls(-5, 0);
Background.x-=5;
hero.scaleX=1;
hero.gotoAndStop('walking sideways');
break;
case Keyboard.LEFT:
moveWalls(5, 0);
Background.x+=5;
hero.scaleX=-1;
hero.gotoAndStop('walking sideways');
break;
case Keyboard.UP:
moveWalls(0, -5);
Background.y+=5;
hero.gotoAndStop('walking up');
break;
case Keyboard.DOWN:
moveWalls(0, 5);
Background.y-=5;
hero.gotoAndStop('walking down');
break;
}
}
function moveWalls(x:Number, y:Number):void
{
for each (var wall:DisplayObject in walls)
{
wall.x += x;
wall.y += y;
}
}
stage.addEventListener(Event.ENTER_FRAME,frameHandler);
function frameHandler(event:Event):void
{
for each (var wall:DisplayObject in walls)
{
if (hero.hitTestObject(wall))
{
switch (wall)
{
case Northwall:
moveWalls(0, -5);
Background.y-=5;
break;
case Southwall:
moveWalls(0, 5);
Background.y+=5;
break;
case Westwall:
moveWalls(-5, 0);
Background.x-=5;
break;
case Eastwall:
moveWalls(5, 0);
Background.x+=5;
break;
}
}
}
}
我认为问题可能出在 hitTest 中。但我不确定。此外,如果我按住按钮,角色会遇到阻力,但如果按住足够长的时间,角色最终会完全穿过墙壁。如何阻止角色穿墙?