2015-05-29 4 views
0

В настоящее время я работаю над игрой с другом, и мне нужна помощь с некоторым кодом ... В моей игре я хочу, чтобы шары отображались на экране, но в определенном порядке, поэтому я создали списки, которые решат, где икрой шары, и какой цвет. Пример:AS3 Game spawn mechanics

var a:Array = [["green", "red", "blue", "purple"], 
       ["orange", "red", "yellow", "black"], 
       ["green", "green", "blue", "pink"]] 

В интер массивы из-за того, я хочу, чтобы они появляются в (начиная от дна). Я выяснил, как порождать все яйца, но когда они появляются, они появляются друг на друга. Может кто-нибудь, пожалуйста, помогите мне с этим? Благодаря! (Я делаю это вспышки кстати)

код у меня есть:

import flash.events.Event; 

stage.addEventListener(Event.ENTER_FRAME, main); 


// Variabels 

var row1:Number = 92.25; 
var row2:Number = 243.30; 
var row3:Number = 394.30; 
var row4:Number = 547.35; 

var pattern:Array = pattern1; 
/* 
var array:Array = pattern.reverse(); 
var rows:Number = pattern1.length; 
*/ 

//trace(pattern.reverse()); 

//Frame counter 
var frame:Number = 0; 

function main(e:Event):void { 
    make(pattern.reverse(), pattern.length); 
    trace(pattern); 
} 

function make(array:Array, rows):void { 
    //Count frames 
    frame += 1; 
    //trace(frame); 


    if (frame % 30 == 0) { 
     //Go thrugh the rows 
     for (var r = 0; r<rows; r+=1) { 
      //trace(array[r]); 

      //Go thrugh the lists 
      for (var i = 0; i <= 3; i+= 1) { 
       spawnBall(array[r][i], i); 
      } 

     } 
    } 
    /* 
    // Go through each row 
    for (var r = 0; r <= rows; r += 1) { 

    } 
    // Go through the list and spawn; 
    for (var i = 0; i <= 3; i+=1) { 
     spawnBall(array[i], i); 
    } 
    */ 
} 

// Spawn the ball 
function spawnBall(color:String, pos:Number):void { 

    if (color == "###") { 

     trace("Not a color"); 

    } else { 

     switch (color) { 
      case "lil": 
       var purple_ball:PurpleBall = new PurpleBall; 
       addChild(purple_ball); 
       purple_ball.x = setX(pos); 
       purple_ball.y = 0; 
      break; 

      case "gul": 
       var yellow_ball:YellowBall = new YellowBall; 
       addChild(yellow_ball);  
       yellow_ball.x = setX(pos); 
       yellow_ball.y = 0; 
      break; 

      case "grø": 
       var green_ball:GreenBall = new GreenBall; 
       addChild(green_ball); 
       green_ball.x = setX(pos); 
       green_ball.y = 0; 
      break; 

      case "rød": 
       var red_ball:RedBall = new RedBall; 
       addChild(red_ball); 
       red_ball.x = setX(pos); 
       red_ball.y = 0; 
      break; 

      case "blå": 
       var blue_ball:BlueBall = new BlueBall; 
       addChild(blue_ball); 
       blue_ball.x = setX(pos); 
       blue_ball.y = 0; 
      break; 

      case "ros": 
       var pink_ball:PinkBall = new PinkBall; 
       addChild(pink_ball); 
       pink_ball.x = setX(pos); 
       pink_ball.y = 0; 
      break; 

      case "ora": 
       var orange_ball:OrangeBall = new OrangeBall; 
       addChild(orange_ball); 
       orange_ball.x = setX(pos); 
       orange_ball.y = 0; 
      break; 
     } 
     this.addEventListener(Event.ENTER_FRAME, moveBall) 
    } 

    function setX(pos):Number { 
     var xpos:Number; 

     switch (pos) { 
      case 0: 
       xpos = row1; 
      break; 

      case 1: 
       xpos = row2; 
      break; 

      case 2: 
       xpos = row3; 
      break; 

      case 3: 
       xpos = row4; 
      break; 
     } 

     return xpos; 
    } 

} 


//Move the balls 
function moveBall(e:Event) { 
    e.currentTarget.y += 5; 
} 

The Balls are on top of each other

+0

Отправьте код, который вы хотите сделать для нереста, пожалуйста. Трудно понять, что случилось без этого. –

+0

Похоже, что ваши заявления о случаях не совпадают с вашими данными (это датский?). Я бы начал с добавления случаев «по умолчанию» и выяснения того, попадают ли они. –

+0

Норвежский на самом деле ... Можете ли вы привести мне пример? im очень новичок в этом –

ответ

1

Это будет легче исправить, если мы делаем некоторые рефакторинга первым. setX() неудобен, например. Там многое может пойти не так. Если ничего другого, он может быть значительно сокращено:

//      0  1  2  3 
var xPositions:Array = [92.25, 243.30, 394.30, 547.35]; 

function setX(pos:Number):Number { 
    return xPositions[pos]; 
} 

spawnBall может быть также упрощена.

var ballColors:Object = { 
    "lil": PurpleBall, 
    "gul": YellowBall, 
    "grø": GreenBall, 
    "rød": RedBall, 
    "blå": BlueBall, 
    "ros": PinkBall, 
    "ora": OrangeBall 
}; 

function spawnBall(color:String, pos:Number):void { 
    var Ball = ballColors[color]; 
    if (Ball == undefined) { 
     trace("Not a color: " + color); 
     return 
    } 
    var ball = new Ball(); 
    addChild(ball); 
    ball.x = setX(pos); 
    ball.y = 0; 

    this.addEventListener(Event.ENTER_FRAME, moveBall); 
} 

//Move the balls 
function moveBall(e:Event):void { 
    e.currentTarget.y += 5; 
} 

Теперь, когда spawnBall более управляемым, мы можем увидеть проблему более четко. Вы присоединяете обработчик событий moveBall к сцене, а затем перемещаете сцену вместо шаров. Поскольку вы хотите переместить все шары одновременно, наличие одного обработчика событий, прикрепленного к сцене, имеет смысл, но вам нужно сохранить набор порожденных шаров в массиве, чтобы вы могли обновить их все.

Переместим addEventListener() на логику инициализации и добавим глобальный массив для хранения списка шаров.

spawnBall становится:

function spawnBall(color:String, pos:Number):void { 
    var Ball = ballColors[color]; 
    if (Ball == undefined) { 
     trace("Not a color: " + color); 
     return 
    } 
    var ball = new Ball(); 
    addChild(ball); 
    ball.x = setX(pos); 
    ball.y = 0; 

    spawnedBalls.push(ball); 
} 

moveBall становится:

//Move the balls 
function moveBall(e:Event):void { 
    for each (var ball in spawnedBalls) { 
     ball.y -= 5; 
    } 
} 

И эта глобальная переменная объявлена:

var spawnedBalls:Array = []; 

Наконец, добавьте в main():

this.addEventListener(Event.ENTER_FRAME, moveBall); 

Это должно сработать.

+0

Спасибо! поэтому теперь он порождает шары и заставляет их спускаться каждые 60 кадров ... но он порождает шары друг на друга. как я могу заставить их появляться в порядке с небольшим промежутком между ними? (Я хочу, чтобы он прошел через список и породил первый ряд цветов, а затем подождал несколько кадров, прежде чем он порождает вторую и т. Д.). Я очень ценю помощь! :) –

+0

О, так вы говорите, что все это порождает * rows *, поэтому вы получаете одну строку, как 'o o o o', движущуюся по экрану? –

+0

О, теперь я понимаю, почему. Я обновлю ответ. –