首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一些球涌到地板上。

一些球涌到地板上。
EN

Stack Overflow用户
提问于 2016-08-19 00:40:09
回答 1查看 30关注 0票数 0

问题是,当我在舞台上有两个或更多的球时,一些球弹得很好,另一些球在地板上下沉。舞台上的地板已经在舞台上了。这是绘图问题还是别的什么问题?

代码语言:javascript
复制
    stop();
//ARRAYS
var ballArray:Array = new Array();

//ADD BALLS
var mediumBall1f2:Ball = new Ball  ;
ballArray.push(mediumBall1f2);
this.addChild(mediumBall1f2);
mediumBall1f2.ballX = 3;
mediumBall1f2.ballY = 8;
mediumBall1f2.x = 300;
mediumBall1f2.y = 250;
mediumBall1f2.width = 120;
mediumBall1f2.height = 120;

var mediumBall1f3:Ball = new Ball  ;
ballArray.push(mediumBall1f3);
this.addChild(mediumBall1f3);
mediumBall1f3.ballX = -3;
mediumBall1f3.ballY = 8;
mediumBall1f3.x = 200;
mediumBall1f3.y = 350;
mediumBall1f3.width = 140;
mediumBall1f3.height = 140;

var mediumBall1f4:Ball = new Ball  ;
ballArray.push(mediumBall1f4);
this.addChild(mediumBall1f4);
mediumBall1f4.ballX = -3;
mediumBall1f4.ballY = 8;
mediumBall1f4.x = 300;
mediumBall1f4.y = 250;
mediumBall1f4.width = 50;
mediumBall1f4.height = 50;

var mediumBall1f5:Ball = new Ball  ;
ballArray.push(mediumBall1f5);
this.addChild(mediumBall1f5);
mediumBall1f5.ballX = -3;
mediumBall1f5.ballY = 8;
mediumBall1f5.x = 400;
mediumBall1f5.y = 350;
mediumBall1f5.width = 80;
mediumBall1f5.height = 80;

var mediumBall1f6:Ball = new Ball  ;
ballArray.push(mediumBall1f6);
this.addChild(mediumBall1f6);
mediumBall1f6.ballX = 3;
mediumBall1f6.ballY = 8;
mediumBall1f6.x = 400;
mediumBall1f6.y = 320;
mediumBall1f6.width = 30;
mediumBall1f6.height = 30;

var mediumBall1f7:Ball = new Ball  ;
ballArray.push(mediumBall1f7);
this.addChild(mediumBall1f7);
mediumBall1f7.ballX = 3;
mediumBall1f7.ballY = 8;
mediumBall1f7.x = 400;
mediumBall1f7.y = 230;

var mediumBall1f8:Ball = new Ball  ;
ballArray.push(mediumBall1f8);
this.addChild(mediumBall1f8);
mediumBall1f8.ballX = 3;
mediumBall1f8.ballY = 8;
mediumBall1f8.x = 400;
mediumBall1f8.y = 240;

var mediumBall1f9:Ball = new Ball  ;
ballArray.push(mediumBall1f9);
this.addChild(mediumBall1f9);
mediumBall1f9.ballX = 3;
mediumBall1f9.ballY = 8;
mediumBall1f9.x = 400;
mediumBall1f9.y = 110;


//FLOOR
var downArray:Array = new Array();

for (var dA:int = numChildren - 1; dA>= 0; dA--)
{
    var childdA:DisplayObject = getChildAt(dA);
    if (childdA.name == "downfloor")
    {
        downArray.push(MovieClip(childdA));
    }
}

var upArray:Array = new Array();

for (var uA:int = numChildren - 1; uA>= 0; uA--)
{
    var childuA:DisplayObject = getChildAt(uA);
    if (childuA.name == "upfloor")
    {
        upArray.push(MovieClip(childuA));
    }
}

var rightArray:Array = new Array();

for (var rA:int = numChildren - 1; rA>= 0; rA--)
{
    var childrA:DisplayObject = getChildAt(rA);
    if (childrA.name == "rightfloor")
    {
        rightArray.push(MovieClip(childrA));
    }
}

var leftArray:Array = new Array();

for (var lA:int = numChildren - 1; lA>= 0; lA--)
{
    var childlA:DisplayObject = getChildAt(lA);
    if (childlA.name == "leftfloor")
    {
        leftArray.push(MovieClip(childlA));
    }
}

//USE ONCE
stageclear.visible = false;
stageclear.gotoAndStop(1);

stage.addEventListener(Event.ENTER_FRAME,ballLoop);
function ballLoop(evt:Event)
{
    //BALL
    for (var j = 0; j<ballArray.length; j++)
    {

        var ball:Ball = ballArray[j] as Ball;
        ball.ballY--;
        ball.y -=  ball.ballY;
        ball.x -=  ball.ballX;
        if (player.hitTestObject(ball))
        {

            ball.y = 600;
        }
        if(ball.x - ball.width/2 < 0)
        {
            ball.ballX = -3;
        }
        if(ball.x + ball.width/2 > 800)
        {
            ball.ballX = 3;
        }
        if(ball.y + ball.height/2 > 384.45)
        {
            ball.ballY = 20;
        }
        if(ball.y - ball.height/2 < 0)
        {
            ball.ballY = -2;
        }
            for (var d = 0; d<downArray.length; d++)
            {
                var down:DownFloor = downArray[d] as DownFloor;
                if (ball.hitTestObject(down))
                {
                    ball.ballY = 20;
                }
            }
            for (var r = 0; r<rightArray.length; r++)
            {
                    var right:RightFloor = rightArray[r] as RightFloor;
                    if (ball.hitTestObject(right))
                    {
                        ball.ballX = 3;
                    }
            }
            for (var l = 0; l<leftArray.length; l++)
            {
                var left:LeftFloor = leftArray[l] as LeftFloor;
                if (ball.hitTestObject(left))
                {
                    ball.ballX = -3;
                }
            }
            for (var u = 0; u<upArray.length; u++)
            {
                var up:UpFloor = upArray[u] as UpFloor;
                if (ball.hitTestObject(up))
                {
                    ball.ballY = -2;
                }
            }
        if (ball.y >= 600)
        {
            ball.parent.removeChild(ball);
            ballArray.splice(j,1);
        }
        if (ballArray.length <= 0)
        {
            stageclear.visible = true;
            stageclear.gotoAndPlay(1);
        }
    }
    if(stageclear.currentFrame == stageclear.totalFrames)
    {
        stage.removeEventListener(Event.ENTER_FRAME,ballLoop);
        MovieClip(this.root).gotoAndPlay(1, "Scene 2");
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-08-19 04:19:44

发生这种情况的原因是

之所以会发生这种情况,是因为只有当MC重叠时,hitTest才为真。如果你能更仔细地观察,你会发现这发生在所有的球上(只是有些球比另一些球更明显)。

据我所知唯一的解决办法

进行您自己的碰撞检测。

它可能看起来像这样:

代码语言:javascript
复制
function collisionTest (mc1:MovieClip,mc2:MovieClip){
    // test if mc1 is going to hit mc2's left side *on the next frame*
    if (mc1.x + mc1._xSpeed + mc1.width>= mc2.x){
        mc1.x = mc2.x; // this may cause a momentary pause... The ball may seem to stick to the wall for a frame... If this is a problem let me know and I'll show you how to fix that
        mc1._xSpeed *= -1;
    }
    // test if mc1 is going to hit top edge of mc2 *on the next frame*
    if (mc1.y + mc1._ySpeed + mc1.height >= mc2.y){
         mc1.y = mc2.y; // same possible sticking here
         mc1._ySpeed *= -1;
    }
}

备注

  • 要使用此功能,MC的注册点应位于左上角(这是默认设置)。此外,我的代码只适用于object 1向下移动,与object2顶部碰撞,或者object 1向右移动与object 2.
  • _xSpeed_ySpeed的左侧碰撞,这些都是您需要添加到您的ball类的属性,并使用该属性来指示球的运动。这是关键的:它允许你向前看,展望未来,看看球是否会在下一帧中撞到墙上,如果是,现在运行碰撞结果,而不是在它们重叠后运行。

如果球正在向左移动,并且希望它检测与墙的右边缘的碰撞,则需要添加类似的代码。此外,如果球正在向上移动,并且您想要检测与墙底部的碰撞,也可以使用

不要忘记包括调整墙的宽度或球的宽度(因为我们使用的是边界框左上角的注册点)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39023445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档