Actionscript 3 乒乓球:如何将球在舞台上的位置传给cpu挡板-AS3
我是AS3的初学者,我正在尝试制作一个基本的玩家对CPU乒乓游戏(使用教程作为参考)。如果这听起来愚蠢或明显,我道歉。我有一个文档类和单独的类,用于Ball、Player和CPU。我的问题是,我不知道如何让CPU类使用舞台上电影剪辑球的坐标,以便它可以根据需要相对于球移动,从而形成AI。我提到的教程中只有document类中的ball、player和cpu的所有代码,但我已经为它们各自的类中的所有内容编写了代码 教程链接 我的代码版本。目前,球正在从墙上反弹,但HitTest尚未应用于任何对象。游戏者用箭头键移动球拍。没有显示任何警告或错误 MainActionscript 3 乒乓球:如何将球在舞台上的位置传给cpu挡板-AS3,actionscript-3,flash,pong,Actionscript 3,Flash,Pong,我是AS3的初学者,我正在尝试制作一个基本的玩家对CPU乒乓游戏(使用教程作为参考)。如果这听起来愚蠢或明显,我道歉。我有一个文档类和单独的类,用于Ball、Player和CPU。我的问题是,我不知道如何让CPU类使用舞台上电影剪辑球的坐标,以便它可以根据需要相对于球移动,从而形成AI。我提到的教程中只有document类中的ball、player和cpu的所有代码,但我已经为它们各自的类中的所有内容编写了代码 教程链接 我的代码版本。目前,球正在从墙上反弹,但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;
}
}
}
但现在它给出了错误
TypeError:Error#2007:参数子项必须为非null。
在flash.display::DisplayObjectContainer/addChild()处
在flash.display::Stage/addChild()中
在src::Main/addBall()处
在src::Main/onAddedStatage()处
如果我使用
var ball:Ball = new Ball();
var cpu:TheCpu = new TheCpu();
我明白了
TypeError:错误#1009:无法访问空对象引用的属性或方法。
在src::TheCpu()
在src::Main/addCPU()处
在src::Main/onAddedStatage()处
我想我现在真的很笨。作为一个更简单的解决方案
基本上,当您创建球时,您可以将球的实例传递给CPU,以便CPU只需检查球在每个更新/输入帧上的位置。大概是这样的:
var ball:Ball = new Ball();
var cpu:CPU = new CPU(ball);
我认为理想情况下,您应该有一个更新循环,它只告诉每个部分按顺序更新自己,并在对象之间传递任何重要信息,以便它们可以适当地更新自己(主更新循环可以跟踪球出区域/得分等)
编辑
如果我理解正确的话,您已经在Flash中的舞台上放置了符号,并为每个符号分配了这些代码块。因此,您的问题是您不知道如何引用每个实例。您可以使用此方法通过命名实例并按名称引用它们来检索放置在舞台上的实例:
或者,您也可以在added to Stage处理程序中的Main类中创建实例,方法是如上面的代码块所示创建实例,然后调用:
stage.addChild(cpu);
舞台。儿童(球)
请确保使用库中的MovieClip符号名称来代替CPU和Ball。在CPU类中注释掉的代码中,当我认为您的意思是“Ball.x”时,您添加了“Ball.y”。请仔细阅读。总之,您必须使用事件或引用。如果您刚刚开始,您可能还没有学会如何创建和调度自己的事件(或者使用引用)。因此,我建议您现在将所有代码放在document类中,并在您了解更多OOP以及如何在类之间通信后使用类。我不同意Garry的观点,除非您现在正处于时间紧迫的时期,请花时间学习如何使用事件和侦听器。要理解的主要事情是事件来自某个调度器,您可以侦听该调度器上的事件。当调度器分派事件时,将触发为该事件注册的任何函数。此外,如果你在舞台上使用的东西,事件会从一个孩子变成另一个家长。指出教程或显示代码以获取更多帮助。
var ball:Ball = new Ball();
var cpu:TheCpu = new TheCpu();
var ball:Ball = new Ball();
var cpu:CPU = new CPU(ball);