0

我正在开发一个简单的 Flash 游戏,我的玩家将桶从船上推下以赢得比赛。我已经编写了移动代码并定义了大多数对象,但是当我添加碰撞属性时,我失去了用键盘移动玩家的能力。这是代码:

package
{
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;

public class Main_Character extends MovieClip
{
    var vx:int;
    var vy:int;

    public function Main_Character()
    {
        init();
    }
    function init():void{
        vx = 0;
        vy = 0;

        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    function onKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            vx = -5;
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            vx = 5;
        }
        else if (event.keyCode == Keyboard.UP)
        {
            vy = -5;
        }
        else if (event.keyCode == Keyboard.DOWN)
        {
            vy = 5;
        }
    }
    function onKeyUp(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT || 
            event.keyCode == Keyboard.RIGHT)
            {
                vx = 0;
            }
            if (event.keyCode == Keyboard.DOWN || 
                event.keyCode == Keyboard.UP)
            {
                vy = 0;
            }
    }
    function onEnterFrame(event:Event):void
    {
        player1.x += vx;
        player1.y += vy;

        if (player1.x > 530)
        {
            player1.x = 530;
        }
        else if (player1.x < 0)
        {
            player1.x = 0;
        }
        else if (player1.y < 0)
        {
            player1.y = 0;
        }
        else if (player1.y > 515)
        {
            player1.y = 515;
        }
        else if (player1.hitTestObject(water1))
        {
            player1.x -= vx;
            player1.y -= vy;
        }
             Collision.block(barrel1, player1);
    }
}

}

4

1 回答 1

1

所以你得到一个错误的原因possibly undefined method是你的Collision类很可能不存在。我想我找到了您从中复制代码的网站,但他们没有包含他们的Collision课程代码,所以您必须自己制作。

但是为了基本了解如何做到这一点,您可能首先想在您的player类中添加简单的碰撞功能。你可以通过onEnterFrame在你的类中创建另一个变量来修改你的关键事件处理程序和你的函数,player比如说,var speed:int = 5修改你的onKeyDown处理程序来使用它而不是5你的移动速度。

然后,在您的onEnterFrame处理程序中,您需要Collision.block(barrel1, player1);用以下内容替换该行:

// see if player hit a barrel.  If so, decrease movement speed slightly.
else if (player.hitTestObject(barrel1)) {
    speed = 3;
}
else {
    speed = 5;
}

但仅此一点还不够。在那之后,你需要确保你的barrel班级能够被玩家推来推去。您可能应该public在其类中创建一个变量,例如public var barrelSpeed:int = 0,以及 a public var barrelDirection:int = 1(以控制枪管运动的方向)。

这样,您就可以在玩家击中桶时 修改barrelSpeed和变量。barrelDirection




总而言之,您player.as应该在其构造函数之前具有以下内容:

var speed:int = 5;

barrel.as应该在它的构造函数之前有以下内容:

public var barrelSpeed:int = 0;
public var barrelDirection:int = 1;

修改barrel'onEnterFrame函数如下:

this.x += (barrelSpeed * barrelDirection);
// for realism, you can also tween barrel's y value to simulate a slight bounce.

然后,您player.as应该在其onEnterFrame功能结束时具有以下内容:

// see if player hit a barrel.  If so, decrease movement speed slightly.
else if (player.hitTestObject(barrel1)) {
    speed = 3;
    barrel1.barrelSpeed = 3;

    // if vx is positive, barrelDirection is positive; otherwise it's negative.
    barrel1.barrelDirection = (this.vx > 0) ? 1 : -1;
}
else {
    speed = 5;
    barrel1.barrelSpeed = 0;
}

playeronKeyDown函数应该是这样的:

function onKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.LEFT)
    {
        vx = -(speed);
    }
    else if (event.keyCode == Keyboard.RIGHT)
    {
        vx = (speed);
    }
    else if (event.keyCode == Keyboard.UP)
    {
        vy = -5;
    }
    else if (event.keyCode == Keyboard.DOWN)
    {
        vy = 5;
    }
}

现在,您还需要更改一些内容以使与多个桶的交互起作用。对于一个很好的教程,这里有一些代码,除了攻击敌人的塔外,基本相同:

http://www.flashgametuts.com/tutorials/as3/how-to-create-a-tower-defense-game-in-as3-part-4/

本质上,您需要在 main.fla 中创建一个包含所有桶的数组,并循环遍历它们以查看是否与它们发生碰撞。我建议先让一个桶开始工作,然后从那里开始。

祝你好运,让我知道它是否有效。

于 2013-06-15T15:45:45.727 回答