-1

我是 AS3 的初学者,我正在尝试制作一个基本的 Player vs CPU pong 游戏(使用教程作为参考)。如果这听起来很愚蠢或显而易见,我深表歉意。我有一个用于 Ball、Player 和 CPU 的文档类和单独的类。我的问题是我不知道如何让 CPU 类使用舞台上影片剪辑球的坐标,以便它可以根据需要相对于球移动以形成 AI。我一直在参考的教程仅在文档类中包含球、球员和 cpu 的所有代码,但我已经为它们各自类中的所有内容编写了代码。

教程链接http://as3gametuts.com/2011/03/19/pong-1/

我的代码版本。目前球正在从墙上反弹,但 HitTest 尚未应用于任何东西。玩家桨正在使用箭头键移动。没有显示警告或错误。

主要的

public class  Main extends MovieClip
{

    public function Main()
    {
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        trace("Initialized");
    }
}

    public class  Ball extends MovieClip
{
    public var ballSpeedX:int = 5;
    public var ballSpeedY:int = 6;


    public function Ball()
    {
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage)
    }

    public function onAddedToStage(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage)

        this.x = stage.stageWidth / 2;
        this.y = stage.stageHeight / 2;

        this.addEventListener(Event.ENTER_FRAME, loop)
    }

    public function loop(e:Event):void 
    {

        this.y += ballSpeedY;
        this.x += ballSpeedX;

        if ((this.y <= 0 + this.height/2) || (this.y >= stage.stageHeight - this.height/2))
        {
            ballSpeedY *= -1;
        }
        else if ((this.x <= 0 + this.width/2) || (this.x >= stage.stageWidth - this.width/2))
        {
            ballSpeedX *= -1;
        }
    }
}

中央处理器

public class TheCpu extends MovieClip
{
    public var cpu:TheCpu;
    public var ball:Ball;
    private var vx:Number = 5;

    public function TheCpu()
    {
        this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }
    private function onAddedToStage(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        this.x = 240;
        this.y = 10;

        this.addEventListener(Event.ENTER_FRAME, loop);
    }

    private function loop(e:Event):void 
    {
        /*if (this.x < ball.x - 10)
        {
            this.x += vx;
        } 
        else if (this.x > ball.x + 10)
        {
            this.x -= vx;
        }*/
    }
}

我将此添加到我的主要课程中

    private function onAddedToStage(e:Event):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        trace("It's Alive!");
        addBall();
        addCPU();
    }

    public function addBall():void 
    {
        var ball:MovieClip = stage.getChildByName("ball") as MovieClip
        stage.addChild(ball);

    }

    public function addCPU():void 
    {
        var cpu:MovieClip = stage.getChildByName("cpu") as MovieClip
        stage.addChild(cpu);
    }
}

但现在它给出错误 TypeError: Error #2007: Parameter child must be non-null。在 flash.display::DisplayObjectContainer/addChild() 在 flash.display::Stage/addChild() 在 src::Main/addBall() 在 src::Main/onAddedToStage()

如果我使用

    var ball:Ball = new Ball();
    var cpu:TheCpu = new TheCpu();

我收到 TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 src::TheCpu() 在 src::Main/addCPU() 在 src::Main/onAddedToStage()

我觉得我现在真的很笨。

4

2 回答 2

0

在 TheCpu 类中注释掉的代码中,当我认为您的意思是“ball.x”时,您输入了“ball.y”。

于 2013-06-07T20:59:37.977 回答
0

作为一个更简单的解决方案。

基本上,当您创建球时,您可以将球的实例传递给 CPU,以便 CPU 可以检查球在每个更新/输入帧上的位置。像这样的东西:

var ball:Ball = new Ball();
var cpu:CPU = new CPU(ball);

我认为理想情况下,您将有一个更新循环,它只告诉每个部分按顺序更新自己,并在对象之间传递任何重要信息,以便它们可以适当地更新自己(并且主更新循环可以跟踪诸如球超出区域/点之类的东西得分等)

编辑

如果我理解正确,您已经在 Flash 中的舞台上放置了符号,并将这些代码块分配给它们中的每一个。所以你的问题是你不知道如何引用每个实例。您可以使用此方法通过命名并按名称引用它们来检索放置在舞台上的实例: 如何使用 as3 类访问舞台上的电影剪辑?

或者,您可以在添加到 Stage 处理程序的 Main 类中创建实例,方法是创建实例,如上面的代码块所示,然后调用:stage.addChild(cpu); stage.addChild(球);

请务必使用库中的 MovieClip 符号名称代替 CPU 和 Ball。

于 2013-06-06T20:30:25.397 回答