Вычисляется выражение direction/45 округляется до целой части функцией round() В зависимости от полученного числа выбираем при помощи оператора switch.
Тебе не понятно как работает switch или не понятно зачем вычислять direction/45?
Ты его загружаешь в проект? И как именно загружаешь? Наверное ты нажимаешь кнопку "Загрузить спрайт". Чтобы загрузить стрип нужно нажать кнопку "редактировать" в появившемся окне нажать "Файл"--> "Создать из стрипа..." Потом выбираешь стрип и количество кадров.
Но вообще strip maker предназначен для создания стрпиов с целью использования их как внешних ресурсов. Если ресурсы в самой игре, проще добавить кадры прямо из отдельных файлов.
switch round(direction/45) { case 0: sprite_index=sp_ai_01_anim_00; break; case 1: sprite_index=sp_ai_01_anim_01; break; case 2: sprite_index=sp_ai_01_anim_02; break; case 3: sprite_index=sp_ai_01_anim_03; break; case 4: sprite_index=sp_ai_01_anim_04; break; case 5: sprite_index=sp_ai_01_anim_05; break; case 6: sprite_index=sp_ai_01_anim_06; break; case 7: sprite_index=sp_ai_01_anim_07; break; case 8: sprite_index=sp_ai_01_anim_00; break; }
То есть, чтобы он обходил твердые объекты, мне нужно это заменить на мой твердый объект?
Если у тебя только один объект, который нужно обходить, то да. Если несколько, сделай один объект с любым именем, напиши его имя вместо obj_building_mask_base и сделай родительским для всех остальных. Если нужно чтобы обходил ВСЕ твердые предметы - замени эту функцию на mp_potential_step() (она почти такая же, подробнее почитай в справке).
А что подробнее рассказать? Что именно не понятно (я просто не знаю что еще добавить к тому что я писал выше...) Можешь еще про switch в справке прочитать.
А, ну наверное я забыл написать что
Code
case 0: sprite_index=sp_ai_01_anim_00; // если получили 0 ставим спрайт с именем sp_ai_01_anim_00 case 1: sprite_index=sp_ai_01_anim_01; // если получили 1 ставим спрайт с именем sp_ai_01_anim_01
Моб двигается при помощи mp_potential_step_object(go_to_player.x,go_to_player.y,speed_defolt,obj_building_mask_base) и обходит предметы obj_building_mask_base или сделай для всех объектов, которые он должен объодить, один родительский и напили его сюда, или используй вместо функции mp_potential_step_object() функцию mp_potential_step()
Apelsinoviy_kot, можешь скинуть, но я не знаю когда у меня будет время посмотреть. Исправлять что-то в ближайшее время точно времени не будет, может-быть смогу что-то посоветовать.
p.s.: времени мало, по тому что скоро, возможно, наступит конец света (в самом прямом смысле этого слова)... Нужно что-то с этим делать...
Добавлено (27.12.2010, 14:02) --------------------------------------------- Ок. По буквам:
switch round(direction/45) //делим direction на 45 и округляем полученное значение. direction, как известно, угол поаорота объекта. Он может быть от 0 до 360 градусов. Разделив direction на 45 мы получаем число от 0 до 8. Если угол поворота от 0 до 22 градусов - получим 0, если от 22 до 22+45=67 градусов - 1 и.т.д. В зависимости от полученного числа выбираем спрайт: { case 0: sprite_index=sp_ai_01_anim_00; // если получили 0 break; case 1: sprite_index=sp_ai_01_anim_01; // если получили 1 break;
И т.д.
Это все для изометрическоц игры. Для TDS всю эту конструкцию можно заменить строкой
Code
image_angle=direction; //Поворот изображения угол direction
Первый блок делает выбор спрайта в зависимости от поворота моба.
Я тебе, просто скинул весь основной код моба, на тот случай если он потом еще кому-то пригодится (чтобы потом не задавали вопросы "почему у меня ошибка?".
Вот пример кода из моей игры (неимного вырезал лишнее, немного добавил того чего небыло):
Код в step:
Code
switch round(direction/45) { case 0: sprite_index=sp_ai_01_anim_00; break; case 1: sprite_index=sp_ai_01_anim_01; break; case 2: sprite_index=sp_ai_01_anim_02; break; case 3: sprite_index=sp_ai_01_anim_03; break; case 4: sprite_index=sp_ai_01_anim_04; break; case 5: sprite_index=sp_ai_01_anim_05; break; case 6: sprite_index=sp_ai_01_anim_06; break; case 7: sprite_index=sp_ai_01_anim_07; break; case 8: sprite_index=sp_ai_01_anim_00; break; }
go_to_player = instance_nearest(x,y,obj_player) //Определяем ближайшего игрока (код делался для игры с несколькими игроками)
if distance_to_object(go_to_player)>320 //Если расстояние до игрока больше 20 - спрайт стнадартный { if mp_step alarm[0]=1 mp_step=false; } else //Иначе - спрайт атаки (в этом примере только спрайты ходьбы, по этому спрайт атаки не прописан, прописана только сама атака) { /*if atak_sp = true { sprite_index = loader_sprites.spr_ai_01_atak atak_sp = false }*/ mp_step=true; speed=0 mp_potential_step_object(go_to_player.x,go_to_player.y,speed_defolt,obj_building_mask_base) mp_potential_settings (20,10,10,true) //Параметры поиска пути для ближнего расстояния alarm[0]=-1
if (place_meeting(x,y,obj_player)) //При столкновении с игроком наносить ему урон и уменьшать скорость { if (canshoot) { go_to_player.hp-=round((damage_ai+random(3))) canshoot=false alarm[1]=30 } speed=-1.9 } }
if (hp<0) { instance_destroy(); }
Код в событии alarm0:
Code
speed=random_range(1.5,2.5); //Выставляем случайную скорость в диапазоне от 1.5 до 2.5 direction=irandom(360); //Выбираем случайное направление alarm[0]=irandom_range(40,80); //Устанавливаем через сколько шагов опять сменить скорость и направление.
Можешь в событии Create установить еще и скорость анимации. Или в степе привяжи значение скорости анимации к скорости движения (в этом примере моб может двигаться с разной скоростью. Делается это таким кодом:
Code
image_speed=speed*1
или
Code
image_speed=speed_defolt*1
Вот тут точно не скажу. Нужно проверить оба кода, какой работает правильно. (скорее всего второй). Вместо 1 нужно поставить число, которое подбирается экспериментальным путем.
Quote (AGENTX001)
Как это мило - кошак помогает кошаку:)
AGENTX001, ты очень сильно ошибаешься... Два кошака помогают кошаку...
Apelsinoviy_kot, вот код движения в разные стороны:
if direction = 0 {object_set_sprite(объект игрока, спрайт вправо)}; if direction = 45 {object_set_sprite(объект игрока, спрайт вправо-вверх)}; if direction = 90 {object_set_sprite(объект игрока, спрайт вверх)}; if direction = 135 {object_set_sprite(объект игрока, спрайт влево-вверх)}; if direction = 180 {object_set_sprite(объект игрока, спрайт влево)}; if direction = 225 {object_set_sprite(объект игрока, спрайт влево-вниз)}; if direction = 270 {object_set_sprite(объект игрока, спрайт вниз)}; if direction = 315 {object_set_sprite(объект игрока, спрайт вправо-вниз)};
Мне кажется этот код лучше было бы сделать через switch.
Apelsinoviy_kot, у меня где-то было именно то что тебе нужно. Сейчас найду... наверное...
Добавлено (27.12.2010, 12:46) --------------------------------------------- Еще вопрос: тебе нужно чтобы бот "гулял", а когда игрок подойдет близко - бежал к нему и наносил урон?
Зависит от того как ты сделал движение (заменой скорости на противоположную по знаку, изменением direction, передвижение с помощью изменения координаты x). Новый пример инвентаря! /20.06.2012/