Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 迷宫状物体内的HitTest错误movieclip_Actionscript 3_Flash_Movieclip_Hittest - Fatal编程技术网

Actionscript 3 迷宫状物体内的HitTest错误movieclip

Actionscript 3 迷宫状物体内的HitTest错误movieclip,actionscript-3,flash,movieclip,hittest,Actionscript 3,Flash,Movieclip,Hittest,我最近在flash上做了一些游戏测试,主要是为了提高我的as3技能 我制作了一个鼠标控制的角色,一个圆圈,它朝着鼠标点击的方向移动。字符固定在屏幕的中间,它是另一个移动的环境,就像滚动,但具有重力。 无论如何,除了角色和墙壁之间的碰撞检测之外,一切都很好,这会杀死他。墙是一个矩形,里面有隧道(主要是一个“迷宫”),英雄在这些隧道中,在墙的边界框内,因此传统的边界框命中测试将不起作用。使用flash提供的每一种方法,hitTest检测都是恒定的,因此英雄会一次又一次地死亡,压缩值,使其无法移动。所

我最近在flash上做了一些游戏测试,主要是为了提高我的as3技能

我制作了一个鼠标控制的角色,一个圆圈,它朝着鼠标点击的方向移动。字符固定在屏幕的中间,它是另一个移动的环境,就像滚动,但具有重力。

无论如何,除了角色和墙壁之间的碰撞检测之外,一切都很好,这会杀死他。墙是一个矩形,里面有隧道(主要是一个“迷宫”),英雄在这些隧道中,在墙的边界框内,因此传统的边界框命中测试将不起作用。使用flash提供的每一种方法,hitTest检测都是恒定的,因此英雄会一次又一次地死亡,压缩值,使其无法移动。所以我使用了Carey O'Neil CDK库,但结果也是失败的:无论用什么方法,我都会得到相同的结果

我已经调试了代码,函数正常工作,所以我认为这只是测试的问题。尽管我已经寻找了几个小时的答案,但我什么也没找到,除了嵌套movieclips中的hitTest检测和类似的东西没有多大帮助

下面是我在Circle_mc类(英雄)中的部分代码:

包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.display.Sprite;
导入flash.ui.Keyboard;
导入flash.events.KeyboardEvent;
导入flash.display.Stage;
导入com.greensock.*;
导入com.greensock.com;
导入com.coreyoneil.collision.CollisionList;
公共类圈(mc)扩展MovieClip{
/*各种变量声明*/
var myCollisionList:CollisionList;
var冲突:数组;
公共功能圈(mc){
/*各种变量值分配*/
addEventListener(Event.ENTER_FRAME,action);
addEventListener(Event.ADDED_TO_STAGE,init);
}
函数初始化(e:事件){
myCollisionList=新的碰撞列表(此);
myCollisionList.addItem(Game.walls1);
collisions=myCollisionList.checkCollisions();
mySprite=新精灵;
}
公共职能行动(e:事件){
this.rotation+=标高x标高a;
trailRestraint++;
如果(trailRestraint>5&((Level_walls.x_vel_a>1.1 | Level_walls.x_vel_a<-1.1)| |(Level_walls.y_a>1.1 | Level_walls.y_a<-1.1))){
rotation_now=this.rotation;
重复的trail();
}
如果(碰撞长度>0){
模具();
}
}
函数duplicateTrail(){
var xPosition:Number=this.x;
变量yPosition:Number=this.y;
变量scaleFactor:Number=1;
变量trail_单位:trail=新trail();
阶段。addChildAt(小道单元,儿童-1);
trail_unit.x=xPosition;
trail_unit.y=位置;
trail_unit.scaleX=scaleFactor;
trail_unit.scaleY=scaleFactor;
trail\u unit.rotation=现在旋转;
}
函数die(){
标高x标高a=0;
标高0.y标高a=0;
Game.walls1.x=stage.stageWidth/2;
Game.walls1.y=stage.stageHeight/2;
}
}
}
嗯,Game.as是Document类,我在flash中调用大多数addChild,所以walls1和circle或其他只是实例名

那么,有人遇到过类似的问题吗?任何帮助/提示/信息都将不胜感激


提前谢谢

好的,我已经解决了!我使用CollisionList()测试了CDK方法、hitTestObject方法和具有规则形状(本例中为矩形)的hitTestPoint方法,结果都很好(可能CDK工作得更好)

所以,问题在于代码。这实际上是一个相当明显的错误,但直到现在才意识到。我对代码做了一些修改,现在一切都很顺利。在操作函数中,我添加了:

collisions = myCollisionList.checkCollisions();

if(collisions.length > 0){
    collisions = 0 as Array;
    die();
}

谢谢你的帮助。

另一种让我头疼的方法是在内存中通过编程将迷宫变成一个由块组成的网格。然后,虽然您可以通过编程方式对每个块进行测试,但更快的方法可能是根据玩家在迷宫中的位置,仅计算需要检查的块,这可能会将测试数量减少到所需块的一小部分


我还假设你的迷宫将整齐地嵌入某种网格(即:如果你在顶部覆盖一个“n”正方形大小的网格,你将不会得到任何半填充的正方形)。如果这不是真的,它仍然可以工作,只是网格将由矩形组成。

您可以使用
hitTestPoint
方法,该方法有一个额外的参数指定此对象是一个形状。你只需要测试几点,这取决于你英雄的形状。谢谢你的回答。我还尝试了hitTestPoint方法,将ShapeFlag设置为true,但仍然不起作用。但是,您是否建议使用各种命中测试点?也许它会起作用,但我担心如果我必须在每一个层面上都这样做的话,工作量会太大。还有另一种方法,我也一直在考虑,但它似乎非常“脏”:它是把电影剪辑墙分成更小的嵌套电影剪辑(迷宫的碎片),并把它们放在检测列表上。这是一个共同的资源,还是更确切地说是非丙酸盐?再次感谢你的意见。这要视情况而定。如果你有一些
MovieClip
s,那么划分它们是可以的,但是要注意,你必须检查每一面墙,这不是grea
collisions = myCollisionList.checkCollisions();

if(collisions.length > 0){
    collisions = 0 as Array;
    die();
}