2016-03-16 2 views
0

Мне было интересно узнать, удалось ли проверить столкновение по имени экземпляра, а не отдельные имена mc. У меня около 150-200 объектов (точек для игры pacman), которые мне нужно проверить на столкновение и хотите сделать это эффективно. Благодаря!Как проверить столкновение для нескольких символов

+0

Да, конечно, возможно. Надеюсь, вы не назовете каждую точку 'dot1' ... и т. Д. Вплоть до' dot200'. Как вы добавляете их на сцену? –

+0

У меня есть mc с экземпляром экземпляра в моей библиотеке. @TaylorSwift – user2580555

ответ

2

Если у вас есть экземпляр с именем точка, и игрок, вы могли бы сделать что-то вроде этого:

//a var to hold each loop iteration's dot for convenience 
var tmpDot:DisplayObject; 

//loop 200 times from 1 - 200 
for(var i:int=1;i<= 200;i++){ 
    //getChildByName gets an instance from a string, in this case dot plus i (i is the current iteration number) 
    tmpDot = getChildByName("dot" + i); 

    //check if the dot exists and is hitting the player 
    if(tmpDot && tmpDot.hitTestObject(player)){ 
     //hit a dot, do something here like remove the dot 
     removeChild(tmpDot); 
     //increment points etc. 

     //if there's no possibility of the player hitting more than one dot at a time, then for efficiency you should break out of this loop 
     break; 
    } 
} 

Теперь, как уже упоминались в комментариях к вашему вопросу, что дает 200 точек имя экземпляра является утомительным. Более простым способом было бы взять вашу точку MovieClip в вашей библиотеке, перейти к ее свойствам и экспортировать ее для ActionScript (скажем, вы дали ей имя класса Dot). Тогда то, что вы могли бы сделать, это в самом начале уровня найти все объекты, точечные, что вы имеете на временной шкале (без имен экземпляров не требуются) и добавить их в массив:

//DO THIS ONLY WHEN THE LEVEL STARTS 

//create a vector/array to store all your dots for better speed 
var allDots:Vector.<Dot> = new Vector.<Dot>(); 

//iterate over all the children of this timeline frame 
for(var i:int=0;i<numChildren;i++){ 
    //if the item is a Dot, add it to the array 
    if(getChildAt(i) is Dot){ 
     allDots.push(getChildAt(i) as Dot); 
    } 
} 

Теперь вы можете сделать такие как:

//YOU PROBABLY WANT TO DO THIS EITHER EVERY FRAME, OR WHENEVER THE PLAYER MOVES 

//flag to see if all dots are eaten 
var allEaten:Boolean = true; 
var tmpDot:Dot; 

for(var i:int=0;i<allDots.length;i++){ 
    tmpDot = allDots[i]; 

    //.... same as the top code example at this point 
    if(tmpDot && tmpDot.hitTestObject(player)){ 
     removeChild(tmpDot); 
     //do anything else you need to do when a dot is eaten 

     //if we've already determined that we haven't eaten all the dots, then break the loop 
     if(!allEaten) break; 
    } 

    //if a dot has a parent, then they haven't been all eaten 
    if(tmpDot.parent){ 
     allEaten = false; 
    } 
} 
+0

Это действительно помогло, спасибо вам большое, +1, но у меня возникают проблемы, обертывающие мою голову вокруг того, как добавить их в массив, в любом случае спасибо! – user2580555

Смежные вопросы