动作脚本。当另一个人击中它时,从容器中移除对象

时间:2013-06-10 14:51:39

标签: actionscript-3 flash parent-child removechild

我正在制作一个横向侧滚动游戏,其中玩家的目标是尽可能地在游戏中获得。为了玩游戏,玩家必须跳过放在地面上的物体(岩石)。他还必须通过在这些冰上物体上射击一个物体(现在是一个球)来摧毁悬挂在舞台顶部的物体(冰)。我已经设法使游戏的跳跃部分工作,但我在设法让玩家破坏冰块时遇到了困难。

冰对象是将Movieclips放置在舞台上的容器中,使用for循环和一些数学randoms。玩家可以在这些冰块上射击物体来摧毁它们。我创建了一个在玩家的球击中冰块时激活的功能。两个对象在命中时都会消失,应该从容器中移除。此功能似乎确实移除了被击中的冰对象和玩家从舞台上射击的球。但是这两个对象仍然在容器中,你只是看不到它们。使玩家仍然可以击中冰块并死亡。玩家射击的球(不可见)也继续移动并摧毁正在容器中产生的所有冰对象,在玩家甚至看到它们之前摧毁所有冰对象。我已经尝试了几种方法来解决这个问题,但每当我解决问题时,似乎都会创建另一个。

这是我生成冰块并让它们移动的代码, 从右向左滚动:

/*placing ice objects in container cave*/

var k:int = 0;
var p:MovieClip;
for (k=0; k<=50; k++)
{
    var scalexwaarde = Math.random();
    if (scalexwaarde<0.4)
    {
        scalexwaarde = 0.4;
    }
    else if (scalexwaarde>0.8)
    {
        scalexwaarde = 0.8;
    }

    var scaleywaarde = Math.random();
    if (scaleywaarde<0.3)
    {
        scaleywaarde = 0.3;
    }
    else if (scaleywaarde>0.9)
    {
        scaleywaarde = 0.9;
    }
    var rndm:int = (Math.floor(Math.random()*100))+1;
    p = new ice();
    cave.addChild(p);
    p.y = 230;
    p.scaleX = scalexwaarde * 1.1;
    p.scaleY = scaleywaarde * 1.1;
    p.x = 800 + (220 * rndm);
    p.addEventListener(Event.ENTER_FRAME, move_ice);
    p.addEventListener(Event.ENTER_FRAME, raakSnot);
    p.addEventListener(Event.ENTER_FRAME, raken);
}

/*function for moving ice objects*/

var snelh:int = 9;
function move_ice(e:Event):void
{
    e.target.x -=  snelh;
}

用于创建玩家可以拍摄并使其移动的对象的代码:

/*creating the object*/
var s:MovieClip = new sneeze(); 

/*if the space is clicked, add to container cave*/
if (evt.keyCode == Keyboard.SPACE) // sneeze when pressed
    {
            cave.addChild(s);
            s.x = n.x;
            s.y = n.y;
            s.addEventListener(Event.ENTER_FRAME, niezen);
    }

/*making player object move and define speed*/
var snelhsneeze:int = 15;
function niezen(evt:Event):void
{
    evt.target.x +=  snelhsneeze;
}
用于处理任何对象命中的代码:

/*function that switches to game over screen when
the player hits an object.*/

function raken(evt:Event):void
{
    if (evt.target.hitTestPoint(n.x - 15,n.y,false) == true)
    {
        gotoAndStop(5);
        grondGeraakt = false;
        scrollSpeed = 0;
        speed = 0;
        snelh = 0;

        while (cave.numChildren)
        {
            cave.removeChildAt(0);
        }
    }
    else if (grondGeraakt == false)
    {

    }
}

用于处理最冰对象的代码(问题在这里):

/*FUNCTION THAT IS GIVING PROBLEMS*/
/*function activated when ball object hits ice object*/

function raakSnot(evt:Event)
{
    if (evt.target.hitTestPoint(s.x,s.y-15,false) == true) 
    {
        if(s.parent) // remove child s and its events (ball object)
        {
            s.parent.removeEventListener(Event.ENTER_FRAME, niezen);
            s.parent.removeChild(s);
        }
        if(MovieClip(evt.target).parent) // remove ice object and its events
        {
            MovieClip(evt.target).parent.removeEventListener(Event.ENTER_FRAME, raken);
            MovieClip(evt.target).parent.removeChild(MovieClip(evt.target));
        }
    }
}

对此问题的任何帮助都将受到高度赞赏,因为我真的不知道出了什么问题。提前谢谢!

1 个答案:

答案 0 :(得分:0)

即使你已经移除了这个物体,所有活跃的冰仍然会在指定的点上被击中(不是物体,它被移除但保留了它的x和y属性值)。如果像“sneezeActive”这样的布尔值为真,你应该做的只是检查碰撞。

if (evt.target.hitTestPoint(n.x - 15,n.y,false)&&sneezeActive)

如果检测到碰撞,则应将sneezeActive设置为false。每次玩家打喷嚏时,将sneezeActive设置为true。这样,基于该点可以检测到碰撞的唯一时间是喷嚏是否有效,之后它被停用直到执行另一个喷嚏。