2012-04-08 110 views
0

我想编写一个利用所有四个方向移动角色的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。但我不确定。另外,如果我按住按钮,角色遇到阻力,但如果按住足够长的时间,角色就会完全穿过墙壁。我如何阻止角色穿过墙壁?

回答

1

你可以保持所有对象的集合进行测试,并迭代循环:

var walls:Array = [ northWall, southWall, westWall, eastWall ]; 

for each (var wall:DisplayObject in walls) 
{ 
    if (hero.hitTestObject(wall)) 
    { 
     // hit wall 
    } 
} 

或者,你可以应用逆,通过点击测试的特点和路径就必然要:

if(!hero.hitTestObject(path)) 
{ 
    // left path 
} 

否则,你可以测试预定范围的坐标:

var bounds:Rectangle = new Rectangle(0, 0, 400, 400); 

if ((hero.x < bounds.x) || 
    (hero.x > (bounds.x + bounds.width)) || 
    (hero.y < bounds.y) || 
    (hero.y > (bounds.y + bounds.height))) 
{ 
    // left path 
} 

更新:根据你的新的例子,这里有一个例子实现你的功能要求:

示例设置在Flash Pro中:

Flash Pro setup

你可以从我的网站下载此项目:

Flash Pro中CS5.5:http://www.jasonsturges.com/labs/stack-overflow/examples/hero/Hero-cs5.5.fla
的Flash Pro CS5中:http://www.jasonsturges.com/labs/stack-overflow/examples/hero/Hero-cs5.fla
SWF:http://www.jasonsturges.com/labs/stack-overflow/examples/hero/Hero.swf

随着墙壁的影片剪辑每一个实例名称,你可以实现你的行动如下:

import flash.ui.Keyboard; 
import flash.events.Event; 
import flash.events.KeyboardEvent; 
import flash.display.DisplayObject; 

// put walls in collection 
var walls:Array = [ northWall, southWall, eastWall, westWall ]; 

// animtion listener 
addEventListener(Event.ENTER_FRAME, frameHandler); 

// key listeners 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keydownHandler); 


// keyboard handling 
function keydownHandler(event:KeyboardEvent):void 
{ 
    switch (event.keyCode) 
    { 
     case Keyboard.RIGHT: 
      moveWalls(-5, 0); 
      break; 
     case Keyboard.LEFT: 
      moveWalls(5, 0); 
      break; 
     case Keyboard.UP: 
      moveWalls(0, -5); 
      break; 
     case Keyboard.DOWN: 
      moveWalls(0, 5); 
      break; 
    } 
} 

// utility to move all walls 
function moveWalls(x:Number, y:Number):void 
{ 
    for each (var wall:DisplayObject in walls) 
    { 
     wall.x += x; 
     wall.y += y; 
    } 
} 

// animation handler 
function frameHandler(event:Event):void 
{ 
    for each (var wall:DisplayObject in walls) 
    { 
     if (hero.hitTestObject(wall)) 
     { 
      switch (wall) 
      { 
       case northWall: 
        moveWalls(0, -5); 
        break; 
       case southWall: 
        moveWalls(0, 5); 
        break; 
       case westWall: 
        moveWalls(-5, 0); 
        break; 
       case eastWall: 
        moveWalls(5, 0); 
        break; 
      } 
     } 
    } 
} 
+0

谢谢您的回答杰森。如果你不介意帮我解决我发布的更新,那就太好了。 – 2012-04-10 22:27:00

+0

不是一个问题,泰国 - 答案更新,我已经链接了一个示例FLA。 – 2012-04-11 04:14:26

+0

再次感谢你,杰森。这真的帮助我。但是,我又遇到了另一个问题。如果你能继续保持美好的话,我会把它写进更新中。 – 2012-04-16 19:58:18