Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Радиоуправляемая взрывчатка: нанесение повреждений.:) Самые интересные моменты. Первое никаких +199, -199 -1,+1 -200, +200 и других при вычислении тайла. только (tile_num_in_direction((tile_num(self_obj)), X, Y))!!! Пример: if ( tile_contains_obj_pid((tile_num_in_direction((tile_num(self_obj)), 0, 1)), elevation(self_obj), pid_Critter_2) == true ) then begin critter_dmg(tile_contains_pid_obj(tile_num_in_direction((tile_num(self_obj)), 0, 1), elevation(self_obj), pid_Critter_2), random(1000, 5000), 6 bwor 256 bwor 6); give_exp_points(500); display_msg("Yes, +500 exp"); end и так на все направления от 0 до 5 включительно и потребный радиус. Второе нужно что перебор вариантов(Pid критеров ) шел быстро. Примечание:( у меня с радиус в три гекса) Можно конечно critter_p_proc - хотя она слабовата заметно для 800 разных пидов на с обсчетом только одного гекса, но при этом вы можете Сделать разную по времени проигрыша анимацию. Взрываться кролики будут немного не одновременно - но на мину пойдет. +++ -сы вы эту мину сможете растреливать(сам не пробывал, но критер-мина кажется мне реальной). procedure timed_event_p_proc - не наш выбор жутко медленно максимальная скорость один тик: add_timer_event(self_obj, 1, 1); при add_timer_event(self_obj, 0, 1); или add_timer_event(self_obj,1/X, 1) мапер вешает систему почти намертво ( ну диспечер я могу вызвать(в WIN2000про)но бестолку его вызов) и остается и тогда "Cемь бед один ответ - Reset". Что ж пойдем другим путем. Пример. procedure tile_damage_1 begin /* if ( tile_contains_obj_pid(tile_num(self_obj), elevation(self_obj), pid_Critter_2) == true ) then begin critter_dmg(tile_contains_pid_obj(tile_num(self_obj), elevation(self_obj), pid_Critter_2), random(1000, 5000), 6 bwor 256 bwor 6); give_exp_points(500); display_msg("Yes, +500 exp"); end */ if (pid_Critter_2 == 16777500) then begin set_local_var(2, 0); set_local_var(3, 0); pid_Critter_2 :=0 ; add_timer_event(self_obj, 2, 2); end else if (pid_Critter_2 < 16777500) then begin set_local_var(3, pid_Critter_1 + 1); pid_Critter_2:= pid_Critter_1 + pid_Critter; display_msg("T_1N=" + pid_Critter_2); call tile_damage_1; end end т.е самовызов процедуры - ух скорость перебора такова что непозволяет в итоге сделать скриншот т.е уменя есть скриншоты до и после - но нет самых красивых "в процессе". Заметим что максимальный PID в 16777500 (диапазон от 16777217 до 16777500 включительно ) не случаен а именно я не смог в рамках одной процедуры взять значение большее 16777558 - обычно стоп происходит на 16777555. Ладушки создаем procedure tile_damage_2 begin end Вызываем ее из procedure tile_damage_1 и обламываемся. Мы неизбежно упремся в стоп на 16777555-16777558 Pid. [далее следует самая непреводимая игра слов в любом спектре] Я разрулил это так из procedure tile_damage_1 вызываем procedure timed_event_p_proc через add_timer_event(self_obj, 8, 2); (восемь тиков это не обязательно) из нее промежуточную из промежуточной уже tile_damage_2 в двух процедурах между tile_damage_1 иtile_damage_2 обнулял var-ы. Пример: if (fixed_param == 2) then begin rm_timer_event(self_obj); set_local_var(2, 0); set_local_var(3, 0); pid_Critter_2 :=0 ; call dinamit_destroy; у меня промежуточная и дестрояшая ОбьекТ. Возможно вторая промежуточная не нужна и достаточно только procedure timed_event_p_proc - не проверял. Но вот наоборот без первой вызываемой add_timer_event(self_obj, 8, 2); то есть с вызовом напрямую второй(там обнуляем вары), а затем procedure tile_damage_2 облом, также облом при попытке обнулить в рамках одной процедуры. и тогда мы преспокойно досчитаем уже от 16777500 до 16777800, а может и побольше - не пробывал. Вот такой вот шаманизм. :-)
|