Просмотр полной версии : расчет движения обьектов через цикл для всех или onEnterFrame для каждого
an_games
22.02.2010, 17:13
здравствуйте, не однократно наблюдал следующее:
это касается различных ситуаций, например-аттачу на сцену несколько клипов, которые перемещаются по ней, взаимодействуя при помощи, например, хит теста с клипом-препятствием.
реализую это дело двумя способами-
1. при создании каждого клипа присваиваю ему функцию mc.onEnterFrame(){} c расчетом столкновения.
2.забиваю все клипы в массив и с помощью цикла расчитываю столкновения для всех клипов массива.
так вот, расчетчего-либо для клипа по 1 варианту, визуально, работае быстрее чем 2 при одинаковом алгоритме этого расчета.
вопрос- с чем это связано?
спасибо.
По-идее должно быть наоборот. Покажите код цикла.
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]
как вы только в этом что-то понимаете... ну так с виду - несколько раз хиттестите одно и то же, остальное просто мрачно как-то...
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;
}
}
думаю просто раньше код с циклом был совершенно не оптимизирован и при тесте с большим кол-вом обьектов работал медленне, впрочем еще не уверен
Просто как-то год, а может два назад еще как-то писали на AS2 по-приличнее :) А сейчас на это страшно смотреть. Это не обязательно к вам относится, это так, "общее наблюдение". Просто, по-чесному, AS2 пишется в классах, не пользуются вложеными функциями, указывают тип переменных.
Да, и просто очень тяжело понимать, что вы пишете с таким форматированием :)
an_games
23.02.2010, 03:40
если честно, я занимаюсь флешем не профессионально, даже ни одной книжки еще не читал, все по исходникам и статьям, так что культуру програмирования не привил, но сейчас планирую почитать про AS3 и вникнуть, наконец, в ООП.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.