Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Движение массива объектов (http://www.flasher.ru/forum/showthread.php?t=131699)

peresmeshnik 26.10.2009 22:36

Я тоже об этом подумал, хотел сделать свой stagelistener для каждого i-го элемента. Т.е. что-то вроде:
Код AS1/AS2:

_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]);

но эта система не работает и без этого...

spooner 26.10.2009 22:54

так, давайте сначала. Выложите исходник и скажите на каком шаге у вас проблемы возникают, а то мы тут воду в ступе толчём.

peresmeshnik 26.10.2009 23:19

Вложений: 1
Вот весь исходник (математическое округление я использовал для точности позиционирования бокса, иначе расчеты сбивались на миллионные доли и программа переставала работать):
Код AS1/AS2:

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 - не работает привязка к границам окна. Может я вообще изначально в неверном направлении шёл, и эта задача в принципе решается иначе?

spooner 27.10.2009 18:24

Вложений: 1
посмотрите, я вам там подправил чуть

peresmeshnik 27.10.2009 19:40

Спасибо огромнейшее!!!
Ваш код выглядит значительно симпатичнее, чем тот, что получился у меня). Но я все же думаю, что округление значений необходимо хотя бы по тому, что при низких значениях параметра "speed" (0.1-0.3) - накапливается погрешность, из-за чего анимация зацикливается на каком-то шаге и не идет дальше.
Мне очень приятно, что Вам не безразлична проблема, и что Вы готовы помочь. Спасибо еще раз!)))

spooner 27.10.2009 19:43

Цитата:

при низких значениях параметра "speed" (0.1-0.3) - накапливается погрешность, из-за чего анимация зацикливается на каком-то шаге и не идет дальше
Вы неправы, ниче там не накапливается, юзайте без страха.

peresmeshnik 27.10.2009 19:54

Спасибо!))


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

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