-1

ランダムに生成された床を作成していますが、ムービークリップがその上を歩くと、床の巨大なブロックのように動作するように見えます。MovieClipは、画像をたどるのではなく、その上を歩きます。コードは次のとおりです。

import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;

//variables

var h:Number = 360;
var floor:MovieClip=new MovieClip;
var guy:MovieClip=new MovieClip;
var gravity=10;

guy.graphics.beginFill(000000);
guy.graphics.drawRect(100,100,15,25);
guy.graphics.endFill();
addChild(guy);//guy creation


//floor generation
for (var i:int=0; i<600; i++)
{

    if (h==360)
    {
        if (Math.random() <= 0.75)
        {
            floor.graphics.beginFill(000000);
            floor.graphics.drawRect(i,h,40,40);
            floor.graphics.endFill();
            addChild(floor);
            i +=  39;
        }
        else
        {
            i +=  39;
        }
        if (i>550)
        {
            h = 320;
            i = 0;
        }
    }
    if (h==320)
    {
        if (Math.random() <= 0.75)
        {
            floor.graphics.beginFill(000000);
            floor.graphics.drawRect(i,h,40,40);
            floor.graphics.endFill();
            addChild(floor);
            i +=  39;
        }
        else
        {
            i +=  39;
        }
    }
}


//listeners doesnt matter
addEventListener(Event.ENTER_FRAME,misc);
addEventListener(KeyboardEvent.KEY_UP,checkup);
addEventListener(KeyboardEvent.KEY_DOWN,checkdown);


//functions

var leftarrow:Boolean=false;
var rightarrow:Boolean=false;

function checkdown(a:KeyboardEvent)
{
    if(a.keyCode==37)leftarrow=true;
    if(a.keyCode==39)rightarrow=true;
}

function checkup(a:KeyboardEvent)
{
    if(a.keyCode==37)leftarrow=false;
    if(a.keyCode==39)rightarrow=false;
}

function misc(a:Event)
{
    guy.y+=gravity;

    if(guy.hitTestObject(floor))
    {
        gravity=0;
    }else{gravity=10;}

    if(leftarrow)guy.x-=5;
    if(rightarrow)guy.x+=5;
}

前もって感謝します。

4

1 に答える 1

1

この関数は、 2 つのインスタンスの境界ボックスhitTestObjectを評価します。バウンディング ボックスがこれらの穴やくぼみをカプセル化するため、キャラクターは床の穴やくぼみを滑空します。DisplayObject

凹面形状での衝突の検出は困難です。(単一の凹型ではなく) いくつかの凸型から床を構築しhitTestObject、それぞれに使用する方が簡単な場合があります。

var blocks:Array = [ ];

for (var i:int = 0; i < 10; i++)
{
    // Add a convex floor block to blocks.
}

...

gravity = 10

for each (var block:DisplayObject in blocks)
{
    if (guy.hitTestObject(block))
    {
        gravity = 0;
        break;
    }
}
于 2012-10-23T22:10:35.593 に答える