Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как случайно выбрать направление движения рисунка? (http://www.flasher.ru/forum/showthread.php?t=194374)

Tina 13.02.2013 00:55

Как случайно выбрать направление движения рисунка?
 
Шарик сначала двигается вправо, а доходя до границы поля изменяет движение и начинает двигаться влево. Код такой.
Код AS3:

public function moveX():void
                {
                        x += speed;
                        if (x >= stage.stageWidth - width || x < 0)
                        {
                                speed *= -1;
                        }
                }

Как сделать чтоб начальное направление движения выбиралось случайно или вправо или влево?
Была такая мысль, но это не работает.
Код AS3:

                public function moveX():void
                {
                        var arr:Array=new Array(x += speed, x -= speed)
                        x += arr.length * Math.random();
                        if (x >= stage.stageWidth - width || x < 0)
                        {
                                speed *= -1;
                        }
                }


NoisyFlasher 13.02.2013 01:11

Сразу после того, как объявите speed:
Код AS3:

var speed: Number = 1;
if (Math.random() > 0.5) {
  speed *= -1;
}


UPD: или даже вот так:

Код AS3:

var speed: Number = (Math.random() > 0.5) ? 1 : -1:


Tina 13.02.2013 01:58

Спасибо. А теперь еще вопрос. есть две функции, одна двигает шарик вправо-влево, а другая вверх-вниз. Нужно случайно выбрать начальное направление движения, тоесть выбрать случайно одну из двух функций. Как это сделать?
Код AS3:

        public function moveBalls():void
                {
                        if (Math.random() > 0.5)
                        {
                                moveX();
                        }
                }

если так то шарик всегда двигается только вправо-влево.
А если добавить функции в массив и выбирать из массива то он вообще не двигается.
Код AS3:

public function moveBalls():void
                {
                        var arr:Array = new Array(moveX, moveY);
                        var a:int = arr.length * Math.random();
                }


NoisyFlasher 13.02.2013 02:24

Честно, не пойму - зачем вы их постоянно в массив пихаете?)

Если вот так:
Код AS3:

public function moveBalls():void {
  if (Math.random() > 0.5){
      moveX();
  } else {
      moveY();
  }
}

UPD: люди добрые, подскажите, как тут выравнивание нормально делать?)

Добавлено через 10 часов 7 минут
Кстати, в последнем примере, шарик не двигается не потому, что что-то не выбирается, а потому, что что-то не вызывается - т.е. вы высчитали a (которое, как я понимаю - индекс элемента массива), но функцию-то нигде не вызвали нужную.
Кроме того, если я правильно понял замысел, умножать нужно не на
Код AS3:

arr.length

а на
Код AS3:

arr.length - 1

. Иначе в определенных случаях вы будете вылетать за пределы массива.

Tina 13.02.2013 14:15

Цитата:

Сообщение от NoisyFlasher (Сообщение 1120442)
Честно, не пойму - зачем вы их постоянно в массив пихаете?)

Если вот так:
Код AS3:

public function moveBalls():void {
  if (Math.random() > 0.5){
      moveX();
  } else {
      moveY();
  }
}


А если так, то шарик вообще по диагонали двигается. Тоесть он одновременно смещается и по x и по y. Да и функцию я вызываю, я же сдесь не весь код привела.

NoisyFlasher 13.02.2013 22:24

Ну, по диагонали он может двигаться, если вы вызываете по очереди то одну, то другую функцию. Например, если moveBalls() у вас вызывается по EnterFrame, то шарик и будет двигаться по диагонали - сначала случайно выпадает одно направление, потом другое.

Tina 13.02.2013 23:20

Именно так. Вызываю по EnterFrame. Вот мне нужно и чтоб по энтерфрейм вызвать и чтоб направление случайное было. Вот я и не пойму как же это сделать?

NoisyFlasher 13.02.2013 23:30

То есть не просто случайное, но что бы оно определилось только один раз - либо вверх/вниз, либо влево/вправо?..

AlexCooper 13.02.2013 23:31

Код AS3:

var speed:uint = 1;
var vX:uint = 0;
var vY:uint = 0;
 
if (Math.random()<.5) vX = (Math.random()<.5) ? 1 : -1;
else vY = (Math.random()<.5) ? 1 : -1;
 
/* in move handler */
/**/ moveObject.x += speed*vX;
/**/ moveObject.y += speed*vY;
/* in move handler */


NoisyFlasher 13.02.2013 23:39

Или вот так:

Код AS3:

var _move: Function;
_move = (Math.random() > 0.5) ? moveX : moveY;
addEventListener(Event.ENTER_FRAME, _move);



Часовой пояс GMT +4, время: 00:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.