Форум 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)
-   -   расчет движения обьектов через цикл для всех или onEnterFrame для каждого (http://www.flasher.ru/forum/showthread.php?t=136653)

an_games 22.02.2010 17:13

расчет движения обьектов через цикл для всех или onEnterFrame для каждого
 
здравствуйте, не однократно наблюдал следующее:
это касается различных ситуаций, например-аттачу на сцену несколько клипов, которые перемещаются по ней, взаимодействуя при помощи, например, хит теста с клипом-препятствием.

реализую это дело двумя способами-

1. при создании каждого клипа присваиваю ему функцию mc.onEnterFrame(){} c расчетом столкновения.
2.забиваю все клипы в массив и с помощью цикла расчитываю столкновения для всех клипов массива.

так вот, расчетчего-либо для клипа по 1 варианту, визуально, работае быстрее чем 2 при одинаковом алгоритме этого расчета.

вопрос- с чем это связано?
спасибо.

wvxvw 22.02.2010 17:34

По-идее должно быть наоборот. Покажите код цикла.

an_games 22.02.2010 18:12

всех случаев я не припомню, но обычно я делаю по 2 варианту и меня это устраивает, тк особо сложных расчетов я не делал, но сейчас я хочу использовать ниже приведенный код в котором последний раз замечал это.

1.
Код AS1/AS2:

var step=sss;
 
function placeBug() {
        lev++;
        var d = _root.bug.duplicateMovieClip("bg" + lev, lev);
                d._x =xxx;
                d._y =yyy;
                  d._rotation =rrr;
 
d.onEnterFrame=function(){       
 
var angle =this._rotation*3.141/180;
 
var bugX = this._x + step * _global.Math.cos(angle);
var bugY = this._y + step * _global.Math.sin(angle);
 
var myPoint1:Object = {x:7, y: 6}; this.localToGlobal(myPoint1);
var myPoint2:Object = {x:7, y:-6}; this.localToGlobal(myPoint2);
 
  if (land.hitTest(myPoint1.x, myPoint1.y, true)||land.hitTest(myPoint2.x, myPoint2.y, true)){       
 
  if (land.hitTest(myPoint1.x, myPoint1.y, true)){this._rotation-=20;};
  if (land.hitTest(myPoint2.x, myPoint2.y, true)){this._rotation+=20;};
                }else{
                this._x = bugX;
                this._y = bugY;}               
                        }                 
 
        }

2.
Код AS1/AS2:

 
var step=sss;
 
function placeBug() {
        lev++;
        var d = _root.bug.duplicateMovieClip("bg" + lev, lev);
                d._x =xxx;
                d._y =yyy;
                  d._rotation =rrr;         
 
            bugsArray.push(d);
        }
 
function moveBugs() {
 
var i = _root.bugsArray.length;
var bugsArr  = _root.bugsArray;
 
var b_cos  :Function = _global.Math.cos;
var b_sin  :Function = _global.Math.sin;
 
        while(i--) {
 
var bugA = bugsArr[i];
var angle =bugA._rotation*3.141/180;
var bugX = bugA._x + step * b_cos(angle);
var bugY = bugA._y + step * b_sin(angle);
 
var myPoint1:Object = {x:7, y: 6}; bugA.localToGlobal(myPoint1);
var myPoint2:Object = {x:7, y:-6}; bugA.localToGlobal(myPoint2);
 
if (land.hitTest(myPoint1.x, myPoint1.y, true)
  ||land.hitTest(myPoint2.x, myPoint2.y, true)){       
 
if (land.hitTest(myPoint1.x, myPoint1.y, true)){bugA._rotation-=20;};
if (land.hitTest(myPoint2.x, myPoint2.y, true)){bugA._rotation+=20;};
 
 
                }else{
 
        bugA._x = bugX;
        bugA._y = bugY;}
 
}
}




[/as]

wvxvw 22.02.2010 20:27

как вы только в этом что-то понимаете... ну так с виду - несколько раз хиттестите одно и то же, остальное просто мрачно как-то...

an_games 22.02.2010 20:48

Цитата:

ну так с виду - несколько раз хиттестите одно и то же,
да, я уже заметил косяк), но это на суть проблемы не влияет.

Цитата:

остальное просто мрачно как-то...
это в смысле- не правильно или не понятно?

Цитата:

как вы только в этом что-то понимаете...
упрощенный вариант просто чтоб отразить смысл-
Код AS1/AS2:

 
function place_mc() {
        lev++;
        var d = _root.my_mc.duplicateMovieClip("mc" + lev, lev);
                d._x =xxx;
                d._y =yyy;
 
 
d.onEnterFrame=function(){
this._x+=2;
this._y+=2;       
 }
 
}

Код AS1/AS2:

 
function place_mc() {
        lev++;
        var d = _root.my_mc.duplicateMovieClip("mc" + lev, lev);
                d._x =xxx;
                d._y =yyy;
 
 
            mcArray.push(d);
        }
 
function move_my_mc() {
 
var i = _root.mcArray.length;
var mcArr  = _root.mcArray;
 
        while(i--) {
 
mcArr[i]._x+=2;
mcArr[i]._y+=2;
 
}
}

думаю просто раньше код с циклом был совершенно не оптимизирован и при тесте с большим кол-вом обьектов работал медленне, впрочем еще не уверен

wvxvw 23.02.2010 01:23

Просто как-то год, а может два назад еще как-то писали на AS2 по-приличнее :) А сейчас на это страшно смотреть. Это не обязательно к вам относится, это так, "общее наблюдение". Просто, по-чесному, AS2 пишется в классах, не пользуются вложеными функциями, указывают тип переменных.
Да, и просто очень тяжело понимать, что вы пишете с таким форматированием :)

an_games 23.02.2010 03:40

если честно, я занимаюсь флешем не профессионально, даже ни одной книжки еще не читал, все по исходникам и статьям, так что культуру програмирования не привил, но сейчас планирую почитать про AS3 и вникнуть, наконец, в ООП.


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

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