Dva_Kota, а вверх , вниз и во все остальные стороны? Кстати, я когда тестировал, заметил, что спрайт при таком раскладе постоянно дергается. Как сделать так, чтобы он шел в случайную сторону, через несколько шагов останавливался, шел в другую сторону, и при этом не дергался? Посоветуйте, где скачать VB6 :C
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([b]объект игрока, спрайт влево-вниз[/b])}; if direction = 270 {object_set_sprite(объект игрока, спрайт вниз)}; if direction = 315 {object_set_sprite(объект игрока, спрайт вправо-вниз)};
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) --------------------------------------------- Еще вопрос: тебе нужно чтобы бот "гулял", а когда игрок подойдет близко - бежал к нему и наносил урон?
Вот пример кода из моей игры (неимного вырезал лишнее, немного добавил того чего небыло):
Код в 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, ты очень сильно ошибаешься... Два кошака помогают кошаку...
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; }
И еще, советую скачать игру(ссыль в первом посте), там ты сможешь посмотреть возможности игры, и не писать ненужного кода типа
Quote (Dva_Kota)
canshoot=true; //Можно ли стрелять
. За код спасибо, посмотрю. Посоветуйте, где скачать VB6 :C
Первый блок делает выбор спрайта в зависимости от поворота моба.
Я тебе, просто скинул весь основной код моба, на тот случай если он потом еще кому-то пригодится (чтобы потом не задавали вопросы "почему у меня ошибка?".
Dva_Kota, может, тебе скинуть исходник? Просто у меня много проблем с кодом, в основном из-за того, что я его плохо понимаю. Раньше я с AI не работал, и мне непонятно. Посоветуйте, где скачать VB6 :C
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