我想編寫一個利用所有四個方向移動角色的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