|
|
|||||
[+6 17.12.12]
Регистрация: Dec 2012
Сообщений: 34
|
движение нескольких объектов
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); } Если шар один то все понятно, а если несколько то как быть? Последний раз редактировалось PinGV; 19.12.2012 в 02:07. |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Каждый шарик сделайте отдельным классом Ball (например), наследующимся от спрайта и добавьте ему паблик-свойства radius, vx и vy. vx и vy — это компоненты вектора движения.
На момент создания шариков, записывайте ссылки на них в массив. В методе update проходитесь по массиву и добавляйте каждому шарику x += vx, y+=vy. Ну и проверку на столкновения со стенами сделайте. Для правой стенки так: если x + radius > x стенки, то vx *= -1;
__________________
hauts.ru |
|
|||||
[+6 17.12.12]
Регистрация: Dec 2012
Сообщений: 34
|
А можно код этого момента
"Каждый шарик сделайте отдельным классом Ball (например), наследующимся от спрайта и добавьте ему паблик-свойства radius, vx и vy. vx и vy — это компоненты вектора движения." и этого "На момент создания шариков, записывайте ссылки на них в массив. " А то мне до сих пор не понятно |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Main.as:
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); } } } } 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)); } } }
__________________
hauts.ru |
|
|||||
[+6 17.12.12]
Регистрация: Dec 2012
Сообщений: 34
|
Спасибо вам Hauts, буду разбираться, я могу воспрользоваться частями вашего кода?
|
|
|||||
[+6 17.12.12]
Регистрация: Dec 2012
Сообщений: 34
|
А что такое _stageRect, и для чего он нужен?
|
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Это экземпляр класса Rectangle, описывающего прямоугольную область. В данном примере используется для того, чтобы сообщать всем шарикам границы их "игрового поля", когда передается аргументом в метод update шарика.
Меняется при изменении размеров флэшки, поэтому при любых её размерах шарики будут летать по всей её площади.
__________________
hauts.ru |
|
|||||
PinGV если не понимаете некоторые вещи то пользуетесь переводчиком я именно так и поступаю и сразу все становится понятно что для чего и счем его едят. Stage---Сцена Rect----Прямоугольника StageReact=Сцена прямоугольника (просто совет) у самого с английским беда, заодно и его немного учу))) |
Часовой пояс GMT +4, время: 09:22. |
|
« Предыдущая тема | Следующая тема » |
Теги |
движение , несколько объектов , отскок |
|
|