Просмотр полной версии : Движение массива объектов
peresmeshnik
26.10.2009, 17:27
Приветствую.
У меня есть вот такой код, который позволяет двигать объект "box" в заданном направлении:
var speed = 1;
this.onEnterFrame = function(){
box._x = box._x + speed;
}
Проблема заключается в том, что у меня не получается двигать сразу массив объектов "box1", "box2". Для этого я использую этот код:
var speed = 1;
var i = 2;
this.onEnterFrame=function(){
while (i <= 2){
_root["box" + i]._x = _root["box" + i]._x + speed;
i++;
}
}
Подскажите пожалуйста, что я делаю неверно?
desadent
26.10.2009, 18:07
var speed = 1;
this.onEnterFrame = function(){
for(i=1;i<5;i++){
_root["box" + i]._x = _root["box" + i]._x + speed;
}
}
peresmeshnik
26.10.2009, 20:53
Спасибо огромное, так действительно работает, но это не решило моей проблемы, т.к. мне нужно, чтобы объекты двигались по периметру экрана. Для этого я написал вот такой код, чтобы объекты "box" пристыковывались к нижней части окна:
Stage.align="TL"
Stage.scaleMode="noScale"
stagelistener = new Object();
var speed = 1;
this.onEnterFrame=function(){
for (i=1; i<=2; i++){
stagelistener.onResize=function(){
sh=Stage.height;
_root["box" + i]._y = sh;
}
Stage.addListener(stagelistener);
_root["box" + i]._x = _root["box" + i]._x + speed;
}
}
Код не работает, хотя без цикла for все идет хорошо.
Я, честно говоря, не уверен, что врубился, чего вы хотите, но могу сказать, что код
stagelistener.onResize=function(){
sh=Stage.height;
_root["box" + i]._y = sh;
}
Stage.addListener(stagelistener);
не надо прописывать в цикле и уж тем более в enterFrame'e, достаточно написать один раз, в начале.
И еще, если у мувика box точка регистрации в левом верхнем углу (так по умолчанию), то ваши мувики будут за экран уходить, поэтому
_root["box" + i]._y = sh - _root["box" + i]._height;
но это чисто предположение
peresmeshnik
26.10.2009, 21:24
На самом деле у меня этот код на пару экранов, только потому, чтобы описать движение по периметру, с учетом изменения размеров окна и разворота по углам.
А смысл в том, чтобы эти объекты двигались именно по периметру, т.е. как в прикрепленном архиве, но только множество, раскиданное хаотично именно по периметру.
хм, все равно не догоняю, попробуйте ваш engine.swf за нижнюю часть окна потаскать вверх/вниз, когда эта штука вверх ползет, и прикиньте что будет, когда их много станет.
peresmeshnik
26.10.2009, 21:49
Когда вверх ползет - нижней границей окна она подталкивается выше, а в окне их всего-то 4-5 штук нужно. Но без этого никак, т.к. у пользователей окно браузера может и сжиматься и на весь экран растягиваться.
Не хочется для каждого элемента свой код делать - это как-то неоптимально...
Вам надо сделать КАК в engine.swf или это то, что у вас получилось?
peresmeshnik
26.10.2009, 21:58
engine.swf это то, что у меня получилось. Но работает только для одного объекта. Массив я хотел добавить циклом, но не получилось, вот, ломаю голову, как сделать...
Если вы пропишите такой код
stagelistener.onResize=function(){
for (i=1; i<=2; i++){
sh=Stage.height;
_root["box" + i]._y = sh;
}
}
Stage.addListener(stagelistener);
то при изменении размера экрана ВСЕ ваши боксы свалятся в низ экрана. Нельзя же так.
peresmeshnik
26.10.2009, 22:36
Я тоже об этом подумал, хотел сделать свой stagelistener для каждого i-го элемента. Т.е. что-то вроде:
_root["stagelistener" + i].onResize=function(){
for (i=1; i<=2; i++){
_root[sh" + i]=Stage.height;
_root["box" + i]._y = _root[sh" + i];
}
}
Stage.addListener(_root["stagelistener" + i]);
но эта система не работает и без этого...
так, давайте сначала. Выложите исходник и скажите на каком шаге у вас проблемы возникают, а то мы тут воду в ступе толчём.
peresmeshnik
26.10.2009, 23:19
Вот весь исходник (математическое округление я использовал для точности позиционирования бокса, иначе расчеты сбивались на миллионные доли и программа переставала работать):
Stage.align="TL"
Stage.scaleMode="noScale"
stagelistener = new Object();
speed1 = 1;
speed_angle1 = speed1 / 2;
round_val = 0.01;
i = 1;
this.onEnterFrame=function(){
sw=Stage.width;
sh=Stage.height;
txt_x.text = _root["box" + i]._x;
txt_y.text = _root["box" + i]._y;
txt_angle.text = _root["box" + i]._rotation;
//низ
if ( _root["box" + i]._x > 0 && _root["box" + i]._y == sh && _root["box" + i]._rotation == 0){
stagelistener.onResize=function(){
sw=Stage.width;
sh=Stage.height;
_root["box" + i]._y = sh;
if (_root["box" + i]._x > sw){
_root["box" + i]._x = sw;
}
}
Stage.addListener(stagelistener);
_root["box" + i]._x = Math.round((_root["box" + i]._x - speed1)/round_val)*round_val;
}
//лево_низ
else if( _root["box" + i]._x == 0 && _root["box" + i]._y == sh && _root["box" + i]._rotation < 90){
stagelistener.onResize=function(){
sh=Stage.height;
_root["box" + i]._y = sh;
}
Stage.addListener(stagelistener);
_root["box" + i]._rotation = Math.round((_root["box" + i]._rotation + speed_angle1)/round_val)*round_val;
}
//лево
else if( _root["box" + i]._x == 0 && _root["box" + i]._y > 0 && _root["box" + i]._rotation == 90 ){
stagelistener.onResize=function(){
sh=Stage.height;
if ( _root["box" + i]._y > sh ){
_root["box" + i]._y = sh;
}
}
Stage.addListener(stagelistener);
_root["box" + i]._y = Math.round((_root["box" + i]._y - speed1)/round_val)*round_val;
}
//лево_верх
else if( _root["box" + i]._x == 0 && _root["box" + i]._y == 0 && _root["box" + i]._rotation < 180 ){
_root["box" + i]._rotation = Math.round((_root["box" + i]._rotation + speed_angle1)/round_val)*round_val;
}
//верх
else if( _root["box" + i]._x < sw && _root["box" + i]._y == 0 && _root["box" + i]._rotation == 180 ){
stagelistener.onResize=function(){
sw=Stage.width;
if ( _root["box" + i]._x > sw ){
_root["box" + i]._x = sw;
}
}
Stage.addListener(stagelistener);
_root["box" + i]._x = Math.round((_root["box" + i]._x + speed1)/round_val)*round_val;
}
//верх_право
else if( _root["box" + i]._x == sw && _root["box" + i]._y == 0 && _root["box" + i]._rotation < -90 || _root["box" + i]._rotation == 180){
stagelistener.onResize=function(){
sw=Stage.width;
_root["box" + i]._x = sw;
}
Stage.addListener(stagelistener);
_root["box" + i]._rotation = Math.round((_root["box" + i]._rotation + speed_angle1)/round_val)*round_val;
}
//право
else if( _root["box" + i]._x == sw && _root["box" + i]._y < sh && _root["box" + i]._rotation == -90 ){
stagelistener.onResize=function(){
sw=Stage.width;
sh=Stage.height;
_root["box" + i]._x = sw;
if ( _root["box" + i]._y > sh ){
_root["box" + i]._y = sh;
}
}
Stage.addListener(stagelistener);
_root["box" + i]._y = Math.round((_root["box" + i]._y + speed1)/round_val)*round_val;
}
//право_низ
else if ( _root["box" + i]._x == sw && _root["box" + i]._y == sh && _root["box" + i]._rotation < 0){
stagelistener.onResize=function(){
sw=Stage.width;
sh=Stage.height;
_root["box" + i]._x = sw;
_root["box" + i]._y = sh;
}
Stage.addListener(stagelistener);
_root["box" + i]._rotation = Math.round((_root["box" + i]._rotation + speed_angle1)/round_val)*round_val;
}
}
А проблема в том, что когда я добавляю цикл for - не работает привязка к границам окна. Может я вообще изначально в неверном направлении шёл, и эта задача в принципе решается иначе?
посмотрите, я вам там подправил чуть
peresmeshnik
27.10.2009, 19:40
Спасибо огромнейшее!!!
Ваш код выглядит значительно симпатичнее, чем тот, что получился у меня). Но я все же думаю, что округление значений необходимо хотя бы по тому, что при низких значениях параметра "speed" (0.1-0.3) - накапливается погрешность, из-за чего анимация зацикливается на каком-то шаге и не идет дальше.
Мне очень приятно, что Вам не безразлична проблема, и что Вы готовы помочь. Спасибо еще раз!)))
при низких значениях параметра "speed" (0.1-0.3) - накапливается погрешность, из-за чего анимация зацикливается на каком-то шаге и не идет дальше
Вы неправы, ниче там не накапливается, юзайте без страха.
peresmeshnik
27.10.2009, 19:54
Спасибо!))
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.