0

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

4

1 回答 1

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 设置

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

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;
            }
        }
    }
}
于 2012-04-08T02:27:36.590 回答