乒乓球:如何将舞台上的球位置传递给cpu球拍? -as3

时间:2013-06-06 19:56:33

标签: actionscript-3 flash pong

我是AS3的初学者,我正在尝试制作基本的Player vs CPU pong游戏(使用教程作为参考)。如果这听起来很愚蠢或明显,我道歉。我有一个文档类和Ball,Player和CPU的单独类。我的问题是我不知道如何让CPU类使用舞台上的影片剪辑球的坐标,以便它可以根据需要相对于球移动以形成AI。我所引用的教程仅包含文档类中的ball,player和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;
        }
    }
}

TheCpu

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:错误#2007:参数child必须为非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()

我想我现在真的很蠢。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

修改

如果我理解正确,你已经在Flash的舞台上放置了符号,并为每个符号分配了这些代码块。所以你的问题是你不知道如何引用每个实例。您可以使用此方法通过命名它们并按名称引用它们来检索放在舞台上的实例: How do I access a movieClip on the stage using as3 class?

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

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

答案 1 :(得分:0)

在TheCpu类的注释掉的代码中,当我认为你的意思是“ball.x”时,你会把“ball.y”。