Вход

Просмотр полной версии : Принцип игры-стрелялки - как убивать?


baron27
08.01.2006, 13:28
Всем привет!
Есть грубо говоря сто мувиков с именами mc1..mc100. Также при нажатии на левую кнопку мыши к курсору аттачится так называемый мувик пулька, который летит вертикально и должен при попадании в один из этих ста мувиков их "убивать".
Никак не могу понять, как зафиксировать событие столкновения моих пулек и этих мувиков-мишеней. Ведь пульки аттачатся под разными именами.

serzhman
08.01.2006, 14:45
Для большего количества клипов наверное тормозить будет.
enterFrame всётаки да и циклов куча. Потом удаляйте пули которые за экран вышли.

baron27
08.01.2006, 15:05
Unexpected file format :(( - может версия старая флеша у меня стоит (у меня MX Prof 2004). Может еще скинешь в другой версии?
Да, EnterFrame удаляться будет при столкновении с клипом-мишенью.
А каков сам принцип? Как-нибудь хитро hitTest применить?

serzhman
08.01.2006, 15:28
Смотри.

Antares
08.01.2006, 15:47
Перебирать на предмет коллизии со всеми. Ты угадал, с помощью hitTest

K.A.T.A.F.A.L.K.E.R
08.01.2006, 15:48
ОДИН РАЗ при создании пульки пробегайся по всем шарикам (или что там у тебя) и смотри, для какого _y лежит в пределах попадания твоей пульки (для какого _y пульки равен его _y плюс/минус (в зависимости от того где ноль) его высота), и запихивай пульке как какой-нить "таргет" сцылу на этот шарик... А уж потом - дело техники :) Либо по _x проверяй, либо через хитТест, но уже не у всех, а только у таргетов (либо у таргета, если пулька разрывается после первого же столкновения)

Antares
08.01.2006, 15:55
А не проще сразу хит-тест?

baron27
08.01.2006, 17:17
but.onPress = function() {
if (Key.isDown(1)) {
// если нажата левая кнопка мыши
if (fire) {
//если активизирован огонь
k++;
attachMovie("bullet", "bullet"+k, k); //аттачим пульку
_root["bullet"+k]._y = plo._y;
_root["bullet"+k]._x = plo._x;
// координаты пульки соответствуют координатам "дула пистолета"
_root["bullet"+k].onEnterFrame = function() {
this._y -= 5; // запускаем пульку вверх

// а вот тут хз как, если через хиттест, то его надо прогнать через цикл
// из 100 итераций
for (i=0;i<100;i++) {
if (this.hitTest("kv"+i)) {
_root["kv"+i]._visible = false;
}
}
};
}
}
};

В примере game.rar данная проблема решена из-за того, что там 3 мувика-мишени, а у меня их сотня. Очень уж тормозит все, если прогонять через этот цикл:((

baron27
08.01.2006, 18:01
Вариант K.A.T.A.F.A.L.K.E.R'а лучше так как сразу уменьшается количество итераций цикла. Сейчас так и делаю. Правда гемора стока с этими if'ами ;)))

K.A.T.A.F.A.L.K.E.R
08.01.2006, 18:39
А не проще сразу хит-тест?
Проще - не спорю. Но насчет производительности я не уверен... Когда летит десяток пуль и лежит сотня мувов - пробегать по всем - ух как не здорово... Разве что всунуть все "мишени" внутрь большого мува "targets" и делать targets.hitTest(bullet._x,bullet._y,true); - хм... Как вариант... Должно сработать :)

K.A.T.A.F.A.L.K.E.R
08.01.2006, 18:50
Хм, Антарес прав - ниче не глючит и при сотне мишеней и двух десятках пуль... :)

K.A.T.A.F.A.L.K.E.R
08.01.2006, 18:56
Нет, я тоже был прав :) ВОТ ТАК не глючит вообще!

_root.createEmptyMovieClip("targets",_root.getNextHighestDepth());
for(var i=0;i<=100;i++){
_root["targets"].attachMovie("n","target"+i,i,{_x:Math.random()*500,_y:Math.random()*400});
}
for(var j=0;j<=50;j++){
num = _root.getNextHighestDepth();
_root.attachMovie("bullet","bullet"+num,num);
_root["bullet"+num]._y = Math.random()*400;
_root["bullet"+num].onEnterFrame = function(){
this._x+=2;
if(_root["targets"].hitTest(this._x,this._y,true)){
for(var i in _root["targets"]){
if(_root["targets"][i].hitTest(this._x,this._y,true))
_root["targets"][i].removeMovieClip();
}
}
}
}