Actionscript 3 使用AS3中的所有场景对象检查角色命中测试
好的,这是我的问题,需要解释一下 我们班在AS3中开发了一个街机游戏。这所大学有一台arcade机器,机器上的操作系统由我们的老师开发,并提供软件开发工具包。这没什么疯狂的,所以大部分都相当简单。我只是想指出这一点,主要是因为我没有使用ENTER_FRAME事件和循环函数,而是使用了一个名为update()的重写函数,SDK提供了该函数来执行每一帧的更新 好吧,别挡道,这是我的问题。我有一个名为GameState的文档类,它基本上在处于该状态时处理游戏。在这门课上,我设置了世界和角色。现在它只有两座山,两座城堡,三个岛屿和角色Actionscript 3 使用AS3中的所有场景对象检查角色命中测试,actionscript-3,collision-detection,hittest,Actionscript 3,Collision Detection,Hittest,好的,这是我的问题,需要解释一下 我们班在AS3中开发了一个街机游戏。这所大学有一台arcade机器,机器上的操作系统由我们的老师开发,并提供软件开发工具包。这没什么疯狂的,所以大部分都相当简单。我只是想指出这一点,主要是因为我没有使用ENTER_FRAME事件和循环函数,而是使用了一个名为update()的重写函数,SDK提供了该函数来执行每一帧的更新 好吧,别挡道,这是我的问题。我有一个名为GameState的文档类,它基本上在处于该状态时处理游戏。在这门课上,我设置了世界和角色。现在它只有
private function initWorld():void
{
trace("World has initiated");
addChild(hazardArea)
positionElement(hazardArea, 0, 560);
addChild(mountainSideRight);
positionElement(mountainSideRight, 730, 200)
addChild(mountainSideLeft);
positionElement(mountainSideLeft, 0, 200);
addChild(castleOne);
positionElement(castleOne, 5, 160);
addChild(castleTwo);
positionElement(castleTwo, 765, 160);
addIslands();
}
position元素只是一个函数,用于设置添加到stage的mci的x和y坐标。现在,我还在AddChild上创建了一个覆盖,这样每当我将一个子元素添加到stage时,它都会将其保存到一个数组中,我以后可以访问该数组:
override public function addChild(object:*):void
{
super.addChild(object);
worldObjects.push(object);
}
好的,这三个岛是通过addIsland添加的,看起来像这样:
private function addIslands():void
{
var island:Array = Islands.getIslandCords();
for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++)
{
addChild(island[x].mc);
positionElement(island[x].mc, island[x].x, island[x].y);
}
}
var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{
OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
if(worldObjects[i] is Player){
var objOne:MovieClip = worldObjects[i];
for (var j:int = 0; j < worldObjects.length; j++){
if (j == i){
// elimates self comparisons.
}
else{
var objTwo:MovieClip = worldObjects[j];
player.ySpeed = checkIntersect(objOne, objTwo )
if (player.ySpeed == -1)
break OuterLoop;
}
}
}
}
}
private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
if(player.hitTestObject(objTwo)){
return -1;
}
else{
return 2;
}
}
然后,我提到的update()函数的工作原理类似于EVENT_FRAME循环,其中包含以下内容:
public function update():void
{
xSpeed *= friction;
moveX += xSpeed;
moveY += ySpeed
theDwarf.y += gravity;
this.x = moveX;
this.y = moveY;
updateControls();
}
theDwarf是我的侏儒电影剪辑的实例,UpdateControl为我的侏儒提供了移动的功能
好的。。。。最后,在update()函数下的GameState类中,我调用了碰撞类,并将包含场景中所有对象的数组传递给它。在这个类中,我检查碰撞:
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{
for (var i:int = 0; i < worldObjects.length; i++) {
if(worldObjects[i] is Player){
var objOne:MovieClip = worldObjects[i];
for (var j:int = 0; j < worldObjects.length; j++){
if (j == i){
// elimates self comparisons.
}
else{
var objTwo:MovieClip = worldObjects[j];
checkIntersect(objOne, objTwo )
}
}
}
}
}
private function checkIntersect(player:MovieClip, objTwo:MovieClip):void
{
if(player.hitTestObject(objTwo)){
player.ySpeed = -1;
}
else{
player.ySpeed = 2;
}
}
公共函数checkCollision(ListofObject:Vector.):void
{
for(var i:int=0;i
我的问题是:这个函数检查我的玩家在舞台上的每一个物体。所以,即使我的矮人降落在1个岛上,他也没有撞到其他2个岛,所以Y速度一直重置为2。如果我去掉else语句,我的矮人引力永远不会回到2,他也不会再摔倒。我找不到解决这个问题的办法。。。我非常努力地想找到一种方法来解决这个问题,但我很困惑。。。我想让我的侏儒倒下,除非他在我的岛上或山上。我希望我已经足够清楚地解释了我的问题,这已经成为一个巨大的帖子D谢谢你 为了更好地解释我之前的评论,您必须更改最后两个函数,如下所示:
private function addIslands():void
{
var island:Array = Islands.getIslandCords();
for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++)
{
addChild(island[x].mc);
positionElement(island[x].mc, island[x].x, island[x].y);
}
}
var gravity:Number = 2;
public var moveX:Number = 300;
public var moveY:Number = 50;
public var xSpeed:Number = 0;
public var ySpeed:Number = 2;
public static const playerSpeed:Number = 3;
public var friction:Number = .75;
public function checkCollision(listOfObjects:Vector.<MovieClip>):void
{
OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) {
if(worldObjects[i] is Player){
var objOne:MovieClip = worldObjects[i];
for (var j:int = 0; j < worldObjects.length; j++){
if (j == i){
// elimates self comparisons.
}
else{
var objTwo:MovieClip = worldObjects[j];
player.ySpeed = checkIntersect(objOne, objTwo )
if (player.ySpeed == -1)
break OuterLoop;
}
}
}
}
}
private function checkIntersect(player:MovieClip, objTwo:MovieClip):int
{
if(player.hitTestObject(objTwo)){
return -1;
}
else{
return 2;
}
}
公共函数checkCollision(ListofObject:Vector.):void
{
OuterLoop:for(变量i:int=0;i
这也可以通过更好的方式来实现。但这是解决您问题的最快方法。如果您击中目标,您必须断开循环,这样它就不会进行进一步检查,也不会重置玩家速度。谢谢!!你的例子对我来说不太管用。玩家是checkIntersect的私有财产,在checkCollision中不存在,尽管它可以改成objOne,但即使如此,我测试了它,我的侏儒一点也没有倒下。然而!多亏了您的逻辑,我只是用一种不同的方式实现了它,其中checkIntersect返回一个布尔值,如果没有命中则返回false,如果命中则返回true。然后在checkCollision中,我创建一个名为hit的布尔变量,然后将checkIntersect返回赋值给它,并创建一个类似的if条件,如果为TRUE,我只返回函数。到目前为止似乎还有效!!另外,如果你有时间,我真的很想知道如何以更好的方式完成。