如何使用(调用)函数(AS3)中的变量?

时间:2013-02-02 13:39:20

标签: actionscript-3 flash

我正在尝试编写一个在地图中移动的角色(perso),并使用数组生成。 我的变量“t”调用了我的“Tuiles”MovieClip,在我的“map”数组上创建了一个网格(格栅),每个格子都为“1”。 我首先使用一个tile Child修复了碰撞功能,因此,我创建了“map”和“grid”函数。我需要世界创造的“t”变量和角色碰撞。 如果我将变量放在我的函数“creeDecor”上,Flash会生成它很好但是我的碰撞函数不存在变量“t”。 如果我将“t”变量放在我的代码之上作为一般变量,Flash会在舞台的右下方生成一个平铺,碰撞功能正常...

我怎么能把它们混合两次? 有可能吗?

我告诉你我的整个代码。如果你想要它工作,你只需创建一个MovieClip类名称“Tuiles”(方形:32 * 32)和第二个MC“Perso”。

//Creation of perso

var perso:Perso = new Perso();

var grille:MovieClip = new MovieClip();

var t:Tuiles = new Tuiles();

var T:int = 32;



var map:Array = [

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],

                 ]



// temporary stockage

var stock:Array = [

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],

                 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

                 ]



creeDecor()                                                                        

initHero();




stage.addEventListener(KeyboardEvent.KEY_DOWN, clavierDown);

stage.addEventListener(KeyboardEvent.KEY_UP, clavierUp);

stage.addEventListener(Event.ENTER_FRAME, animation);



// Stage collision

var minX = 0;

var minY = 0;

var maxX = stage.stageWidth - perso.width;

var maxY = stage.stageHeight - perso.height;

var speedHero = 5;



function clavierDown(e)

{

    switch(e.keyCode)

    {  

        case 37:

            perso.speedX = -speedHero;

            break;

        case 39:

            perso.speedX = speedHero;

            break;

        case 38:

            perso.speedY = -speedHero;

            break;

        case 40:

            perso.speedY = speedHero;

            break;

}

}



function clavierUp(e)

{

    switch(e.keyCode)

    {

        case 37:

            perso.speedX = 0;

            break; 



        case 39:

            perso.speedX = 0;

            break;



        case 38:

            perso.speedY = 0;

            break;



            case 40:

            perso.speedY = 0;

            break;

    }

}



function animation(e)

{

    animeHero();

}

   // Stage border collision function

function animeHero()

{       

       if(perso.x + perso.speedX >= minX && perso.x + perso.speedX <= maxX)

   {

       perso.x += perso.speedX;

   } else if (perso.speedX < 0)

   {

       perso.x -= Math.abs(perso.x-minX);

               //trace(Math.abs(perso.x-minX));

   } else {

       perso.x += Math.abs(perso.x-maxX) ;

   }



   if(perso.y + perso.speedY >= minY && perso.y + perso.speedY <= maxY)

   {

       perso.y += perso.speedY;

   }

  collision();

}



function initHero()

{

    perso.speedX = 0;

    perso.speedY = 0;



    perso.x = 200;

    perso.y = 300;


    addChild(perso);

}



function collision() {



    if (perso.hitTestObject(t))

    {

        if (perso.x >= t.x + t.width - speedHero && perso.x <= t.x +t.width + 2)

        {

            perso.x = t.x + t.width;

        }



        if (perso.x + perso.width >= t.x - 2 && perso.x + perso.width <= t.x + speedHero)

        {

            perso.x = t.x - perso.width;

        }

        if (perso.y >= t.y + t.height - speedHero && perso.y <= t.y +t.height + 2)

        {

            perso.y = t.y + t.height;

        }



        if (perso.y + perso.height >= t.y - 2 && perso.y + perso.height <= t.y + speedHero)

        {

            perso.y = t.y - perso.height;

        }

    }

}



// level creation

function creeDecor():void{

    for (var i:int=0; i<20; i++){                                // boucle sur les 20 colonnes

        for (var j:int=0; j<15; j++){                            // boucle sur les 15 lignes de chaque colonne

            var f:int = map[j][i] 



            if(f>0)  {     
                t.x= i*T;  

                t.y= j*T;  

                t.gotoAndStop(f)             

                grille.addChild(t)         


                // Specialisation

                if (f==1)

                stock[j][i] = t;

            }



            else

            {

                stock[j][i] = []                               

            }

        }

    }

}

addChild(grille)    

1 个答案:

答案 0 :(得分:1)

你想要制作许多不同的Tuiles,并检查每一个的碰撞。听起来你最初在Tuiles中制作了新的creeDecor(),但除非你将新的瓷砖存储在其中,否则只有creeDecor()知道它们。 (这就是为什么Flash说t collision()中不存在Tuiles。)This page about Function scope可能会有所帮助,如果你还没有阅读它,那么该文档的其余部分也是如此。< / p>

因此,您可以在顶层准备一份所有var tList:Vector.<Tuiles> = new Vector.<Tuiles>(); 的列表,例如:

creeDecor()

这意味着collision()tList都可以看到Tuiles。然后就像之前一样,每次需要时在creeDecor()中创建新if(f>0) { var newT:Tuiles = new Tuiles(); tList.push(newT); // Set up newT's position etc... ,然后将它们添加到列表中

Tuiles

然后,您可以使用"for each... in"

tList中的每个for each (var t:Tuiles in tList) { if (perso.hitTestObject(t)) // Your collision code... } } 运行您的点击测试
hitTestObject

如果你只有简单的方块,那么进行碰撞检测的方法可能比使用{{1}}多次更快,所以如果它很慢,那么调整它可能是一个很好的下一步。