我刚刚开始在AS3中做一些编程,但仍有一些事情我不清楚。
我有3个不同文件的项目:twinrunner.fla
,twinrunner.as
和wall.as
。
我让墙从右到左滚动屏幕。当它击中玩家时我想让它识别它。我尝试使用hitTestObject
完成此操作。但不幸的是我只会遇到错误。
public class TwinRunner extends MovieClip
{
private var _timer:Timer;
public function TwinRunner()
{
//Timer initialize
_timer = new Timer(500, 1);
_timer.addEventListener(TimerEvent.TIMER_COMPLETE, onUpdateTime);
_timer.start();
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
//Add event listeners
button.addEventListener(MouseEvent.CLICK, onGuessButtonClick);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
}
private function onRemovedFromStage(event:Event):void
{
//Remove the onEnterFrame event if
//this object is removed from the stage
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
}
private function onGuessButtonClick(event:Event):void
{
addChild(new Wall());
}
private function onEnterFrame(event:Event):void
{
}
private function onUpdateTime(event:Event):void
{
addChild(new Wall());
_timer.reset();
_timer.start();
}
}
public class Wall extends MovieClip
{
private var _vx:int;
public function Wall()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
x = stage.width;
y = 300;
_vx = -5;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage)
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onRemovedFromStage(event:Event):void
{
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
trace("wall removed");
}
private function onKeyDown(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.RIGHT)
{
_vx = -20;
}
}
private function onEnterFrame(event:Event):void
{
x += _vx;
if(this.hitTestObject(Player))
{
trace("player hit");
}
if (x + width / 2 < 0)
{
parent.removeChild(this);
}
}
}
每当我尝试编译时,我都会收到错误1046:
未找到类型或不是编译常量:播放器
我想这是一个非常愚蠢的错误,但我完全迷失了,不知道在哪里搜索。
答案 0 :(得分:0)
我完全不理解这个游戏的概念,所以我会根据我已经理解的内容给你一个解决方案。
起初我觉得最好不要使用它,但实际上是墙的实例名称。
if(wall.hitTestObject(Player))
{
trace("player hit");
}
宽度无处可寻,这意味着你必须添加(可能你忘记了)。
var witdh:Number;
同样hitTestObject也不是那么精确的碰撞方法。您可以计算两个物体之间的距离,并检查它们是否发生碰撞。
这可以帮到你:
答案 1 :(得分:0)
你在哪里定义了玩家?
错误显示编译器不知道Player是什么..它是自己的类吗?如果是这样,这个hitTestObject测试将不起作用 - 您需要比较两个对象,而不是一个对象和一个类。
这可以通过声明Player类的实例(如果有的话)来修复,可能在Twinrunner.as文件中:
public static var player:Player = new Player();
player.x = whatever;
player.y = whatever;
addChild(player);
然后,执行hitTest:
if(this.hitTestObject(twinrunner.player))
{
trace("player hit");
}
如果你实际上没有Player类,那么你需要制作一个。
或者,Player
实际上是在舞台上吗?如果是这样,你需要稍微改变一下。评论并告诉我是否是这种情况。