PDA

Просмотр полной версии : Препятствия на дистанции А-Б


Maxi_Hunter
26.06.2008, 18:00
Уважаемые товарищи!
Я хотел бы поинтересоваться вот о чем :)
Имеется дистанция от точки А(х,у) до точки Б(х,у), которое постоянно меняется. В момент времени нужно знать есть ли на этой дистанции препятствия. Препятствия - мувиклипы с произвольными именами... Конечно можно брать и именовать их в виде obstecle_XX (где XX - номер от 0 до n) и потом проверять циклом for, но я думаю это будет очень ресурсоемко :)
Кто нибудь может помочь решить данную задачу?
Просто я не слишком владею классами во флэш, поэтому, если можно по подробнее)))

Alex_beginner
26.06.2008, 18:29
Здравствуйте Maxi Hunter!

потом проверять циклом for, но я думаю это будет очень ресурсоемко

Почему Вы так решили?! При ограниченном количестве клипов-препятствий и использовании метода hitTest() класса MovieClip не думаю, что это отнимет много ресурсов.

wvxvw
26.06.2008, 19:44
http://flasher.ru/forum/attachment.php?attachmentid=19554&d=1211402647
делал немного для другой цели, но можно попробовать адаптировать.

Maxi_Hunter
26.06.2008, 22:26
wvxvw, к сожалению у меня, почему проект не открылся... говорит "Unexpected file format"...
Alex_beginner, вероятно :) можно конечно попробовать, но в будущем хотелось бы и узнавать точку первого пересечения, но это мне пока кажется чемто невыполнимым :) подчеркиваю слово кажется, ибо невыполнимых задач нет :)

wvxvw
27.06.2008, 03:49
А чем вы .AS файлы, простите, открываете? Ну, на худой конец, можно блокнотом попробывать =) А вообще, проект, если память не изменяет для ФД был... Если хотите скомпилировать из флеша - создайте файл в директории classes. В нем, в библиотеке 2 клипа:
linkage: bullet, class: view.Bullet
linkage: enemy, class: view.Enemy
на основном таймлайне
Main.main();

Maxi_Hunter
27.06.2008, 09:48
Вот что у меня получилось...но почему-то скрипт виснет намертво при выполнении функции... Я допускаю, что в каком-то месте написал чушь и хотел бы узнать где :)
onClipEvent (enterFrame) {
if (fire == 1) {
for (i=1; i=200; i++) {
this._y -= Math.cos((this._rotation*Math.PI)/180)*5;
this._x += Math.sin((this._rotation*Math.PI)/180)*5;
for (k=1; k=50; k++) {
var global_obstacle:MovieClip;
global_obstacle._name = "obstacle_"+k;
if (global_obstacle.hitTest(global_obstacle._name)) {
this.gotoAndPlay(2);
trace("OK");
is_break = 1;
break;
}
}
if (is_break == 1) {
break;
}
}
}

etc
27.06.2008, 10:43
Вы написали бесконечный цикл, условиие i = 200 всегда истина.

Maxi_Hunter
27.06.2008, 11:38
тогда я чего-то не понимаю в работе цикла for :) ибо при условии:
for (i=1; i>200; i++) {
...
trace(i);
...
}
вообще ничего не происходит и не выполняется функция trace(i);
Заменил кусок в коде, ибо думаю, что так правильнее :)
if (this.hitTest(_root["obstacle_"+k])) {
this.gotoAndPlay(2);
trace("OK");
is_break = 1;
break;
}

Maxi_Hunter
27.06.2008, 11:41
С циклом разобрался, мой косяк :)

Maxi_Hunter
27.06.2008, 15:56
реализовал через хитТест :) вроде ничего не тормозит. Единственный недостаток -то что ограничивается количество этих препятствий)

wvxvw
27.06.2008, 16:52
Потому что нужно, чтобы препядствия тестили себя на хиттест с путем, а не наоборот.

Maxi_Hunter
28.06.2008, 00:12
я думал над этим вариантом. Обычно я так и делаю :) но в данной ситуации это представляет сложность, ибо если одно препятствие, в котором титтест=труе, касание есть, то другое говорит что касания нет. Если ставить флаг, например, contact=1 при наличии касания, то этот флаг будет не стабильным, так как одно препятствие сбрасывает его в 0, другое в 1.
У меня в момент написания родилась идея, а есть во флэше логические операции "и", "или"?

wvxvw
28.06.2008, 00:16
Логика изначально неправильная - достаточно, чтобы одно препядствие оказалось на пути.
(false && false && false && .... false) != (false && false && true && .... false)
Конечно есть =)

etc
28.06.2008, 00:17
У меня в момент написания родилась идея, а есть во флэше логические операции "и", "или"?
Конечно есть.

Maxi_Hunter
30.06.2008, 00:51
Встретился с еще одной проблемкой...
Флэш ужасно ругается на строчку:
var ["music"+current_music]:Sound = new Sound();
current_music - это счетчик (1,2,3...)
Получается такая запись не правильная в принципе? или нужно создавать "массив звуков"(если да, подскажите, пожалуйста, как :) ) или есть какой-то 3ий вариант решения?
Этот метод я хотел использовать и для мувиклипов, но теперь понимаю, что такой подход не пойдет...Подскажите, пожалуйста, как поступить, если мне нужно создать массив из объектов?

wvxvw
30.06.2008, 04:34
var soundArray:Array = [];
var someSound = new Sound();
soundArray.push(someSound);
Sound(soundArray[0]).start();

Maxi_Hunter
30.06.2008, 22:32
по какой-то причине, у меня он таким образом воспроизводит только последний загруженный файл :( вне зависимости от того что стоит soundArray[0] или soundArray[1]...
хотя в эти два места были загружены разные файлы.

Maxi_Hunter
30.06.2008, 22:39
Да, тут присутствует явление родителя, то есть, если первоначальный объект изменился, то элемент массива тоже изменился...таким образом запихивать их в массив не имеет смысла :) потому что если мы попытаемся запихнуть следующий звуковой файл в someSound, то он изменит все элементы массива с этим объектом внутри :) по сути это массив ссылок :) но все равно спасибо!