我想编写一个利用所有四个方向移动角色的Flash游戏。 (即向上移动角色向北,向下 - 向南等)。游戏中的角色实际上并没有移动,但背景移动来模拟移动。不过,我需要弄清楚如何编程墙。我有识别碰撞的代码,但是最好的方法是什么?这是我的代码:在Flash CS5/Actionscript 3中为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 walls:Array = [Northwall,Southwall,Eastwall,Westwall];
功能的OnEnter(E:事件):无效 {
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。但我不确定。另外,如果我按住按钮,角色遇到阻力,但如果按住足够长的时间,角色就会完全穿过墙壁。我如何阻止角色穿过墙壁?
谢谢您的回答杰森。如果你不介意帮我解决我发布的更新,那就太好了。 – 2012-04-10 22:27:00
不是一个问题,泰国 - 答案更新,我已经链接了一个示例FLA。 – 2012-04-11 04:14:26
再次感谢你,杰森。这真的帮助我。但是,我又遇到了另一个问题。如果你能继续保持美好的话,我会把它写进更新中。 – 2012-04-16 19:58:18