PDA

Просмотр полной версии : расчет движения обьектов через цикл для всех или onEnterFrame для каждого


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

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

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

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

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

wvxvw
22.02.2010, 17:34
По-идее должно быть наоборот. Покажите код цикла.

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

1.

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.


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
ну так с виду - несколько раз хиттестите одно и то же,

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


остальное просто мрачно как-то...

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


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

упрощенный вариант просто чтоб отразить смысл-


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;
}

}



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 и вникнуть, наконец, в ООП.