flash – AS3 – hitTestObject碰撞未正确注册
几天前我遇到了hitTestObject碰撞检测问题,这个问题已经在你们的帮助下修复了(
How can I solve my hitTestObject Collision Null Object Ref Error)(谢谢).
我现在的问题是这样的: 当我的“enemy.hit”与“player.hit”接触时,它会记录为热门 – 这很好. 当我的“building.collide”与“player.hit”接触时,它会注册为热门 – 这很好. 然而,当我的“building.collide”与我的“enemy.hit”接触时,它没有注册,但有时它会注册,即使屏幕上唯一的敌人离它很多像素 – 就像建筑物或敌人“hitBox”不是直接在图形上的某个地方(在这种情况下是MovieClip). 我不明白这是怎么回事. 我的代码由10个左右的.as文件组成.我不完全确定这些是导致问题的原因.我不想粗鲁,并发布了1000行我的业余代码供您挖掘 – 尽管如此,我会在需要的时候. 绿色部分是hitBoxes(这是特定MovieClip中的一个层) 我希望这个复杂的描述很容易理解. 我想我知道发生了什么,但我不知道如何纠正它. 这实际上创建了Cowboy和EnemyJoe的多个实例,这就是令人困惑的闪存.如何在不使用“new”的情况下引用Cowboy和EnemyJoe?(例如var targetCowboy:Cowboy = new Cowboy(stageRef);) ObjectPlacer代码: package com.gamecherry.gunslinger { import flash.display.MovieClip; import flash.display.Stage; import flash.events.Event; import flash.utils.Timer; import flash.events.TimerEvent; public class ObjectPlacer extends MovieClip { private var Build01Timer:Timer; private var Build02Timer:Timer; private var CactiSet01Timer:Timer; private var build01Place:Boolean = false;// if true - addChild starts at first frame private var build02Place:Boolean = false; private var cactiSet01Place:Boolean = false; private var stageRef:Stage; public function ObjectPlacer(stageRef:Stage) { this.stageRef = stageRef; var Build01Timer = new Timer(1000,1); var Build02Timer = new Timer(25000,1); var CactiSet01Timer = new Timer(0,1); Build01Timer.addEventListener(TimerEvent.TIMER,build01TimerHandler,false,true); Build02Timer.addEventListener(TimerEvent.TIMER,build02TimerHandler,true); CactiSet01Timer.addEventListener(TimerEvent.TIMER,cactiSet01TimerHandler,true); addEventListener(Event.ENTER_FRAME,loop,true); Build01Timer.start(); Build02Timer.start(); CactiSet01Timer.start(); } public function loop(e:Event): void { BuildSet01(); BuildSet02(); CactiSet01(); } private function BuildSet01(): void { if (build01Place) { var Buildings01Right:BuildingsLeft = new BuildingsLeft(stage,720,-624); Buildings01Right.scaleX = -1; stageRef.addChildAt((Buildings01Right),2); var targetCowboy:Cowboy = new Cowboy(stageRef); var enemyJoe:EnemyJoe = new EnemyJoe(stageRef,targetCowboy); var Buildings03Left:BuildingsLeft03 = new BuildingsLeft03(stage,enemyJoe); stageRef.addChildAt((Buildings03Left),2); build01Place = false; } } private function BuildSet02(): void { if (build02Place) { var Buildings04Left:BuildingsLeft04 = new BuildingsLeft04(stage,-800); stageRef.addChildAt((Buildings04Left),2); build02Place = false; } } private function CactiSet01(): void { if (cactiSet01Place) { var cactus01:GScactus01 = new GScactus01(stage,300); stageRef.addChildAt((cactus01),2); var cactus01b:GScactus01 = new GScactus01(stage,190,50); stageRef.addChildAt((cactus01b),2); var cactus01c:GScactus01 = new GScactus01(stage,660,-40); stageRef.addChildAt((cactus01c),2); cactus01c.scaleX = -1; var cactus01d:GScactus01 = new GScactus01(stage,710,340); stageRef.addChildAt((cactus01d),2); cactus01d.scaleX = -1; var cactus02:GScactus02 = new GScactus02(stage,420,-50); stageRef.addChildAt((cactus02),2); var cactus02b:GScactus02 = new GScactus02(stage,600,180); stageRef.addChildAt((cactus02b),2); var cactus02c:GScactus02 = new GScactus02(stage,300,240); stageRef.addChildAt((cactus02c),2); var cactus03:GScactus03 = new GScactus03(stage,540,100); stageRef.addChildAt((cactus03),2); var cactus03b:GScactus03 = new GScactus03(stage,30,5); stageRef.addChildAt((cactus03b),2); cactus03b.scaleX = -1; var cactus03c:GScactus03 = new GScactus03(stage,520,420); stageRef.addChildAt((cactus03c),2); cactiSet01Place = false; } } private function build01TimerHandler(e: TimerEvent) : void { build01Place = true; } private function build02TimerHandler(e: TimerEvent) : void { build02Place = true; } private function cactiSet01TimerHandler(e: TimerEvent) : void { cactiSet01Place = true; } private function removeSelf() : void { removeEventListener(Event.ENTER_FRAME,loop); if (stageRef.contains(this)) stageRef.removeChild(this); } } } 解决方法
需要注意的一件事是hitTestObject执行
AABB (axis-aligned bounding box) collision,这意味着它适合您对象周围的矩形,并使用它来测试碰撞.你的建筑似乎有复杂的凹形 – hitTestObject不会考虑这些,它只是在建筑物上方放置一个巨大的矩形并用它进行测试.另请注意,如果碰撞是一个包含其中所有建筑区域的单个MovieClip,则矩形将包裹在整个区域上,而不是为各个建筑物分别设置区域.您必须将碰撞区域分成单独的矩形并单独测试它们.这可能是您看到一些误报和不良行为的原因.
当shapeFlag参数设置为true时, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |