Просмотр полной версии : Алтернатива альфа = 0%
Делаю я тут игру ;) Значит много всяких чебуреков бегают за другим чебуреком, стрельба и все такое.
Так вот. Вокруг каждого врага есть прозрачный (0%) круг, которыйй ХитТестится. При этом очень загружается процессор. Если включить альфа = 100%, то загрузка падает.
Существует ли какая-нибудь альтернатива прозрачному кругу? Может можно программно его описать, вокруг врага? Только чтоб камень не очень загружался, С альфой вообще невозможно.
llllllllll
16.06.2004, 02:31
... если радиус первого 30, а вторго 40, а дистанция между ними 60 - то значит они пересекаются :)
А можно пару ссылко учащимся?
гы-гы-гы =)
Забор рулит =)
Зачем тебе круги? если для урона, то это зря. Когда я парился с игрушками, я придумал для себя что-то вроде точек с неким уроном. Они создаются виртуально функцией, а после того как их параметр урона обнуляется или они уходят за экран, они удаляются.Вообще тут мы говорим о больших скоростях, а во флэше все по кадрам =) те скорость ограничего, и в нашем случае очень даже, то есть тебе придется просчитывать каждый пиксел пути сразуже после того как снаряд выпущен. Есть пара исходников. Опиши короче зачем тебе это все, а то круги как-то футуристически звучат =)
Вобщим пишу под этим ником, я оказывается уже был здесь зарегестрирован :)
Вобщем игра такая. Ты управляешь челом (вид сверху). На тебя прется враг (пока надо с одни разобраться). Вокруг врага описан прозрачный круг, который хиттестится.
иф
{круг пересекает плеера, то враг начинает в него стрелять каждые 0,5 сек. по пуле}
ложно
{враг идет в сторону плеера}
Так вот это прозрачный круг выполняет функцию некой зоны прицеливания противника. Т.е. хрен знает откуда он стрелять не будет.
Чем бы заменить этот круг, чтобы лагов меньше было. А то когда дубликаты делаешь все начинает лагать.
хмм ты говоришь о векторах.
Вычисление середины обьекта, а затем длинны вектора от середины обьекта А до середины обьекта Б, если длинна вектора меньше заданной, происходит действие (втоего чела стреляют) =)
А где об это можно почитать?
Особо не ругай, если вопрос легкий, я эту игру делаю дабы обучиться. На практике материал легче дается.
И еще один вопрос. Какие еще способу уменьшения лагов бывают? Ну может лучше импортировать gif, а не во флеше рисовать. Если объект простейший и маленький (кружочек с палочкой).
Спасибо.
А если просто отслеживать координаты (а через них дистанцию) между персонажами?
distanceX=Math.abs(vrag._x-pleer._x)
distanceY=Math.abs(vrag._y-pleer._y)
И если оба этих дистанса меньше чего-то - можно шмалять... Все равно же враг как-то следит за игроком, чтоб за ним бегать...
Лаги убавились, но возникла новая проблема.
Теперь когда делается дубликат клипа они с ума начинают сходить, т.е. стрелять, когда расстояния хотя бы между одним из них и плеером больше заданного.
Т.е. они не(!) независимы. Хотя с хиттестом все ходили сами по себе.
Код для врага написан в отдельном мувике.
distanceX=Math.abs(this._x-_root.mc._x);
distanceY=Math.abs(this._y-_root.mc._y);
Вот в таком виде. Далеше я ничего, кроме ИФ не изменял, так что там врятли какие-то лаги. Да и никто разбираться в нем не будет. Может можно как-то независимое дублирование делать?
Дублирую так
on (keyPress "<Enter>") {
v++;
vragname = "vragi"+v;
duplicateMovieClip("vragi", vragname, v);
setProperty(vragname, _x, random(0)-200);
setProperty(vragname, _y, random(480)-200);
}
Расстояние между двумя точками A ( x1 ; y1 ) и B ( x2 ; y2 ) вычисляется по формуле R = Math.sqrt( ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ) );
А зачем делать лишних вычислений?
distanceX=Math.abs(this._x-_root.mc._x);
distanceY=Math.abs(this._y-_root.mc._y);
Вроде проще.
А потом
if (distanceX && distanceY < 150)
Только вот почему при таков вычислении дублируемые обекты зависят друг от друга? С прозрачными кружками они сами по себе ходили.
По поводу лишних вычислений- ты не прав, мой метод кривоват: если distanceX && distanceY ==150, то расстояние будет 150*(корень из 2), т.е. ок. 200
Дальше. Пишешь управляющую функцию, которая "рулит" врагами (например function vrag(name)). А в каждого врага вставляешь вызов функции:
onClipEvent (enterFrame) {vrag(vrag1);
}
где vrag1 - имя именно этого экземпляра. А в функции вместо имени пишешь переменную name, которая будет принимать переданные при вызове значения (vrag1, например)
Всем спасибо, действительно формула все на свои места поставила, теперь все двигаются независимо.
А для соприкосновения совсем маленьких объектов, т.е. пуль и врагов точно также делать, или для маленьких объектов другие способы?
И как лучше эту формулу записывать, чтобы меньше процессор загружала?
Сразу в таком виде
R = Math.sqrt( ( this._x - _root.igrok._x ) * ( this._x - _root.igrok._x ) + ( this._y - _root.igrok._y ) * ( this._y - _root.igrok._y ) );
Или создавать переменные: х1, х2, у1, у2 и после этого формулу, которую привел Nucer?
A ( x1 ; y1 ) и B ( x2 ; y2 ) вычисляется по формуле R = Math.sqrt( ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ) );
Сранее спасибо :)
Для того что бы процессор не загружался sqrt не обязательно делать...
И конечно надо писать так
var x = this._x - _root.igrok._x;
var y = this._y - _root.igrok._y;
var dist = x*x+y*y;
Всё зависит от того, как тебе надо чтобы пуля попадала. Поконкретней опиши
Есть враг(враги) он бегает за игроком и когда расстояние между ними меньше 150 аттачит каждые 0,5 сек пулю в сторону игрока. Игрок - обычный кружочек размером 15 (враг тоже 15) Пуля - прямоугольник 4на2.
Если пуля соприкасается со врагом, то происходит такое-то действие.
Хиттест все делает каряво. Пуля летит мимо, он все равно хиттестит её.
Nox Noctis
17.06.2004, 18:41
Оригинал написал(а) m-16
Хиттест все делает каряво.хиттест работает так как должен работать, коряво все делает кто-то другой :)
у хиттеста м.б. два или три аргумента. посмотри в хэлпе для какого случая какой вариант вызова нужен..
Всем весело, а про какой хэлп то идет речь? :D
Тот который F1 или еще какой? :rolleyes:
Про тот который F1, скорей всего у тебя стоит "цеплять" bounding box то бишь квадрат, в который вписан круг
greyshaman
19.06.2004, 00:44
ну раз уж вы такие-тут-такие собрались, мошт вы ламерам объясните как черкз ету вашу хиттесту, определить пересечение точки с окружностью в динамике, да так чтоб точка за фрейм расстояние раз в пять больше войного диаметра пролетала.
Nox Noctis
19.06.2004, 02:08
МОЖНО!
...если ты объяснишь что это значит :D
greyshaman
19.06.2004, 16:23
ПЬЯНСТВУ БОЙ
Имеем объект сферической формы, знаем его радиус направление движения и скорость приведенную к фреймам.
Имеем другой объект такойже формы, в простонародье называемый материальной точкой, знаем ее скорость (в силу коких то причин монго большую радиуса той штуки мимо которой она пролетает) и направление движения.
Как хит тестом определить наличие столкновения?
У меня не сростается, приходится формулки выводить.
Ты хотел сказать, что у тебя круг, и точка пролетает через этот круг, даже не побывав внутри? Если так, то действительно только по формуле какой-нибудь. В принципе по формуле правильнее и надёжнее и, скорей всего, ресурсов меньше жрёт.
Ну не только по формулам
достаточно к точке пририсовать отрезок с alpha = 1 по длине и напралению равный скоростии движения
Но, согласен, по формулам правильнее и проще
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.