Форум 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=189975)

PinGV 19.12.2012 01:30

движение нескольких объектов
 
Код AS3:

var all_circule:Sprite = new Sprite();
for (i=0; i<100; i++)
{var newCircle:Sprite = new Sprite();
        newCircle.graphics.lineStyle(3, 0x000000);
        newCircle.graphics.beginFill(int(Math.random() * 0xffff) + 0xff0000);
        newCircle.graphics.drawCircle(Math.random() * 450 + 50, Math.random() * 300 + 70, Math.random() * 20 + 15);
        newCircle.graphics.endFill();
        all_circule.addChild(newCircle);
}

Есть контейнер all_circule. Как сделать чтобы при вызове функции Update происходило перемещение шаров, согласно вектору который произвольно задастся при их добавлении, взаимодействие с шарами не учитывается, учитываются рамки самого ролика?
Если шар один то все понятно, а если несколько то как быть?

iNils 19.12.2012 01:49

А вопрос где?

Hauts 19.12.2012 12:38

Каждый шарик сделайте отдельным классом Ball (например), наследующимся от спрайта и добавьте ему паблик-свойства radius, vx и vy. vx и vy — это компоненты вектора движения.

На момент создания шариков, записывайте ссылки на них в массив. В методе update проходитесь по массиву и добавляйте каждому шарику x += vx, y+=vy. Ну и проверку на столкновения со стенами сделайте. Для правой стенки так: если x + radius > x стенки, то vx *= -1;

PinGV 19.12.2012 19:50

А можно код этого момента
"Каждый шарик сделайте отдельным классом Ball (например), наследующимся от спрайта и добавьте ему паблик-свойства radius, vx и vy. vx и vy — это компоненты вектора движения." и этого
"На момент создания шариков, записывайте ссылки на них в массив. "
А то мне до сих пор не понятно:(

Hauts 19.12.2012 20:09

Вложений: 1
Main.as:

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.geom.Rectangle;
 
        /**
        * ...
        * @author Hauts
        */

        public class Main extends Sprite
        {
                private var _balls:Array;
                private var _totalBalls:int;
                private var _stageRect:Rectangle;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        stage.scaleMode = StageScaleMode.NO_SCALE
                        stage.showDefaultContextMenu = false;
                        stage.align = StageAlign.TOP_LEFT
 
                        stage.addEventListener(Event.RESIZE, stageResizeHandler);
                        stageResizeHandler(null)
 
                        _balls = [];
                        _totalBalls = 100;
                        var newBall:Ball;
                        for (var k:int = 0 ; k < _totalBalls; k ++ ) {
                                newBall = new Ball(10 + (Math.random() * 10), 2 + (Math.random() * 18));
                                newBall.x = _stageRect.left + Math.random() * _stageRect.width;
                                newBall.y = _stageRect.top + Math.random() * _stageRect.height;
                                _balls.push(addChild(newBall));
                        }
 
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function stageResizeHandler(e:Event):void
                {
                        _stageRect = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
                }
 
                private function enterFrameHandler(e:Event):void
                {
                        for (var k:int = 0 ; k < _totalBalls; k++ ) {
                                _balls[k].update(_stageRect);
                        }
                }
 
        }
 
}

Ball.as:

Код AS3:

package  
{
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.geom.Rectangle;
 
        /**
        * ...
        * @author Hauts
        */

        public class Ball extends Sprite
        {
                public var radius:Number;
 
                private var _vx:Number;
                private var _vy:Number;
 
                public function Ball(radius:Number, speed:Number = 20)
                {
                        this.radius = radius
 
                        var randomAngle:Number = Math.PI * 2 * Math.random();
                        _vx = Math.cos(randomAngle) * speed;
                        _vy = Math.sin(randomAngle) * speed;
 
                        var gr:Graphics = this.graphics;
                        gr.beginFill(0xFFFFFF * Math.random())
                        gr.lineStyle(1);
                        gr.drawCircle(0, 0, radius);
                        gr.endFill()
 
                        gr.moveTo(0, 0);
                        gr.lineTo(radius, 0);
                }
                public function update(rect:Rectangle):void
                {
                        x += _vx;
                        y += _vy;
 
                        if (x > rect.right - radius) {
                                _vx *= -1;
                                x = rect.right - radius;
                        } else if (x < rect.left + radius) {
                                _vx *= -1;
                                x = rect.left + radius;
                        }
 
                        if (y > rect.bottom - radius) {
                                _vy *= -1
                                y = rect.bottom - radius;
                        } else if (y < rect.top + radius) {
                                _vy *= -1
                                y = rect.top + radius
                        }
 
                        rotation = x
                }
 
                public function constrain(rect:Rectangle):void
                {
                        x = Math.max(rect.left + radius, Math.min(rect.right - radius, x));
                        y = Math.max(rect.top + radius, Math.min(rect.bottom - radius, y));
                }
        }
 
}

BallsExample.swf   (1.6 Кб)

PinGV 19.12.2012 20:15

Спасибо вам Hauts, буду разбираться, я могу воспрользоваться частями вашего кода?

Hauts 19.12.2012 20:18

Конечно, я только за.

PinGV 19.12.2012 21:27

А что такое _stageRect, и для чего он нужен?

Hauts 19.12.2012 21:35

Это экземпляр класса Rectangle, описывающего прямоугольную область. В данном примере используется для того, чтобы сообщать всем шарикам границы их "игрового поля", когда передается аргументом в метод update шарика.

Меняется при изменении размеров флэшки, поэтому при любых её размерах шарики будут летать по всей её площади.

Wild 19.12.2012 22:14

Цитата:

Сообщение от PinGV (Сообщение 1110826)
А что такое _stageRect, и для чего он нужен?


PinGV если не понимаете некоторые вещи то пользуетесь переводчиком я именно так и поступаю и сразу все становится понятно что для чего и счем его едят. Stage---Сцена Rect----Прямоугольника
StageReact=Сцена прямоугольника (просто совет) у самого с английским беда, заодно и его немного учу)))


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

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