2012-04-08 111 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