2015-07-16 2 views
0

Я только недавно начал использовать Looping в AS3, и мне есть чему поучиться. вот вопрос. Ниже находится петля, которая ставит 5 шаров один поверх другого на сцене. Все идет нормально. однако, я бы хотел создать ситуацию, когда нажимаю на кнопку, нижний шар удаляется, а затем каждый шар заменяет мяч под ним один за другим, продолжайте это за каждый клик, пока все шары не исчезнут. , Я создал эту ситуацию с добавлением/удалением дочернего элемента, и я подумал, что это может быть более эффективным с циклом. Я просто не знаю, как получить доступ к шарам, так как у меня нет имени экземпляра или имени класса, на которое я могу ссылаться.ActionScript 3 Looping

var ball: gBall4M; 
var i: Number; 

for (i = 0; i < 5; i++) { 

    ball = new gBall4M(); 
    ball.x = 331.30; 
    ball.y = 25 + i * 17 
    addChild(ball); 
} 
function release2Ball2(event: MouseEvent): void { 

Это эффект, который я хочу, чтобы получить https://youtu.be/B4GLolw8QVA

ответ

3

Как уже упоминалось в ответе @ DANIEL-Мессер, вы можете использовать Array для хранения шаров, а во второй части вашего вопроса, при снятии последний мяч и передвигая другие из них, вы можете использовать array.pop(), чтобы удалить последний элемент массива, а затем вы можете использовать array.map(), чтобы переместить другие шары:

function release2Ball2(event:MouseEvent): void 
{ 
    if(balls.length > 0){ 
     ball = balls.pop();    // remove and get the last element of the array 
     ball.parent.removeChild(ball); // remove that element from the DisplayObjectContainer 
     function move_ball(item:Ball, index:int, array:Array):void { 
      item.y += 17; 
     } 
     // move the rest of elements 
     balls.map(move_ball, this); 
    } 
} 

EDIT:

Посмотрите на код работы, я добавил номера, чтобы понять, как шары движутся:

enter image description here

Ваш полный код может быть таким:

var balls:Array = [], 
    ball:gBall4M; 

for (var i:int = 0; i < 5; i++) { 
    ball = new gBall4M(); 
    ball.x = 331.30; 
    ball.y = 25 + i * 17; 
    balls.push(ball); 
    addChild(ball); 
} 

btn.addEventListener(MouseEvent.CLICK, release2Ball2); 
function release2Ball2(event:MouseEvent):void { 
    if (balls.length > 0) { 
     ball = balls.pop(); 
     ball.parent.removeChild(ball); 
     function move_ball(item:gBall4M, index:int, array:Array):void { 
      item.y += 17; 
     } 
     balls.map(move_ball, this); 
    } 
} 

EDIT 2 :

Чтобы сделать такую ​​анимацию, вы можете использовать Timer, как это:

var balls:Array = [], 
    ball:gBall4M; 

for (var i:int = 0; i < 5; i++) { 
    ball = new gBall4M(); 
    ball.x = 30; 
    ball.y = 25 + i * 17; 
    balls.push(ball); 
    addChild(ball); 
} 

btn.addEventListener(MouseEvent.CLICK, release2Ball2); 
function release2Ball2(event:MouseEvent):void { 
    if (balls.length > 0) { 
     ball = balls.pop(); 
     ball.parent.removeChild(ball); 
     if(balls.length > 0){ 
      timer.start(); 
     } 
    } 
} 

var timer:Timer = new Timer(150); 
    timer.addEventListener(TimerEvent.TIMER, function(e:TimerEvent){ 
     if(balls.length >= timer.currentCount){ 
      balls[balls.length - timer.currentCount].y += 17; 
     } else { 
      timer.reset(); 
     } 
    }) 

Который даст вам что-то вроде этого:

enter image description here

Надежда, которая может помочь.

+0

Я не работаю с кодом файла. Это то, что работает с удалением нижних шариков по одному. Все еще нужно кодировать шары, бросая какую-нибудь идею? 'var ball: gBall4M; var i: Number; var ballA: Array = []; buttonA.addEventListener (MouseEvent.CLICK, release2Ball2); для (i = 0; i <5; i ++) { \t ball = new gBall4M(); \t ball.x = 331.30; \t ball.y = 100 + i * 17 \t addChild (ball); \t ballA.push (мяч); } функция release2Ball2 (событие: MouseEvent): пустота { \t, если (ballA.length> 0) { \t \t шар = ballA.pop(); \t \t removeChild (ball); \t \t мяч = нуль \t \t для (I = 0; я SBA

+0

@SBA Что ваша проблема именно? Вы пробовали мой код? – akmozo

+0

Да, пробовал ваш код. это не сработало. приведенный выше код работает, но не полностью. Я хочу, чтобы после каждого щелчка после того, как нижний шар был удален, оставшиеся шары упадут на один шаг вниз. – SBA

0

Просто сохраните экземпляры внутри массива или подобное, которые вы можете использовать в дальнейшем.

Надеюсь, вы используете файл кода и не записываете код непосредственно внутри фрейма внутри флэш-редактора. В противном случае у вас могут возникнуть проблемы.

Нечто похожее на это должно работать

package { 
    class Main { 
    var balls:Array = []; 

    function createBalls() { 
     var ball: gBall4M; 
     var i: Number; 

     for (i = 0; i < 5; i++) { 

     ball = new gBall4M(); 
     ball.x = 331.30; 
     ball.y = 25 + i * 17; 
     balls.push(ball); //Save them to array 
     addChild(ball); 
     } 
    } 

    function release2Ball2(event: MouseEvent): void { 
     var clickedBall:gBall4M = event.currentTarget as gBall4M; //this might be wrong depending on what you are listening for, and what type of object gBall4M is... 
     for(var i=0; i<balls.length; ++i) { 
     if(balls[i] == clickedBall) { 
      balls[i].splice(i, 1); //remove instance from array 
      removeChild(clickedBall); //remove instance from display list 
      break; 
     } 
     } 
    } 
    } 
} 
+1

могли бы хотеть удалить что подчеркивания в переменной декларации – Karmacon

0

OK Я понял это. используя этот код на раме 1

function release2Ball2(event: MouseEvent): void { 
    if (ballA.length > 0) { 
    ball = ballA.pop(); 
    removeChild(ball); 
    ball = null 
    gotoAndPlay(2); 

    } 
} 
stop(); 

, используя этот код на раме 10:

for (i = 0; i < ballA.length; i++) { 
    ballA[i].y += 17; 
stop(); 

Это делает трюк.

Большое вам спасибо за вашу помощь