如何在Actionscript 3中推送对象

时间:2013-06-14 20:34:34

标签: flash actionscript adobe collision

我正在开发一个简单的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);
    }
}

}

1 个答案:

答案 0 :(得分: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,以及public var barrelDirection:int = 1(以控制桶运动的方向)。

这样,只要玩家击中枪管,您就可以修改barrelSpeedbarrelDirection变量。




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

var speed:int = 5;

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

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

修改barrel的{​​{1}}函数,如下所示:

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; } player函数应如下所示:

onKeyDown

现在,您还需要更改一些内容,以便与多个桶进行交互。对于一个很好的教程,这里有一些代码显示基本相同的东西,除了塔攻击敌人:

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

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

祝你好运,如果有问题,请告诉我。