Четверг, 28 Марта 2024, 22:53

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Соединить два объекта
Соединить два объекта
vampir0305Дата: Пятница, 04 Сентября 2015, 18:43 | Сообщение # 1
Unity C# Programmer
Сейчас нет на сайте
Сделал врага в игре и отдельно тело и голову, чтобы при попадании пули в голову был крит.урон, но если создать несколько одинаковых врагов в комнате, то при удалении врага удаляются все в комнате, как исправить?

Красочная сюжетно-ориентированная игра-головоломка
ЛеонидДата: Пятница, 04 Сентября 2015, 19:19 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Я не понял связи между названием темы и проблемой. Код можно?
vampir0305Дата: Пятница, 04 Сентября 2015, 21:16 | Сообщение # 3
Unity C# Programmer
Сейчас нет на сайте
Ах да, совсем забыл.
Итак, объект врага Step:
Код
if hp<=0 {instance_destroy()}

Объект головы врага Step:
Код
if distance_to_object(obj_vrag) > 32
{
     instance_destroy();
}

Ещё одно событие в объекте головы End Step:
Код
if instance_exists(obj_vrag) > 0
{
     if obj_man.x < x
     {
         x = obj_vrag.x-4
         y = obj_vrag.y-16
         image_xscale = -1
     }
     else
     {
         x = obj_vrag.x+4
         y = obj_vrag.y-16
         image_xscale = 1
     }
}


Красочная сюжетно-ориентированная игра-головоломка
SyankДата: Суббота, 05 Сентября 2015, 00:11 | Сообщение # 4
участник
Сейчас нет на сайте
Тебе надо в коде врага создавать объект головы в таком случае с получением её id.
А потом уже через id работать именно с этой головой.
P.S. instance_exists вроде как возвращает только false/true


Сообщение отредактировал Syank - Суббота, 05 Сентября 2015, 00:12
vampir0305Дата: Суббота, 05 Сентября 2015, 08:06 | Сообщение # 5
Unity C# Programmer
Сейчас нет на сайте
Syank, а как это сделать?

Красочная сюжетно-ориентированная игра-головоломка
YellowAfterlifeДата: Суббота, 05 Сентября 2015, 09:20 | Сообщение # 6
Сейчас нет на сайте
Цитата vampir0305 ()
Syank, а как это сделать?

Создание головы в объекте врага:
head = instance_create(x + 4, y - 16, obj_head)
head.body = id

Теперь враг знает, где его голова, а голова знает, где сам враг.
Событие шага головы можно убрать;
End Step сделать как
if (instance_exists(body))
{
if body.x < x
{
x = body.x-4
y = body.y-16
image_xscale = -1
}
else
{
x = body.x+4
y = body.y-16
image_xscale = 1
}
}
else instance_destroy()

То есть голова ставится на предназначенное для нее тело, и удаляется если оно исчезло.
(полагаю, ещё лучше сделать переменную, отвечающую за направление обзора, а не сверять координаты)


vampir0305Дата: Суббота, 05 Сентября 2015, 09:52 | Сообщение # 7
Unity C# Programmer
Сейчас нет на сайте
YellowAfterlife, спс, это помогло только для головы, но при убийстве врага удаляются все его экземпляры.

Красочная сюжетно-ориентированная игра-головоломка
ЛеонидДата: Суббота, 05 Сентября 2015, 16:31 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Какой код убийства врага и у какого объекта он находится?
vampir0305Дата: Воскресенье, 06 Сентября 2015, 19:08 | Сообщение # 9
Unity C# Programmer
Сейчас нет на сайте
Код убийства находиться в самом враге и включается при условии что hp<=0.
В Step врага:
Код
if hp<=0 {instance_destroy()}

Добавлено (06 сентября 2015, 19:08)
---------------------------------------------
Что, никто не знает?


Красочная сюжетно-ориентированная игра-головоломка
ЛеонидДата: Воскресенье, 06 Сентября 2015, 19:22 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Это должно работать, ищи ошибку где-нибудь.
vampir0305Дата: Воскресенье, 06 Сентября 2015, 20:26 | Сообщение # 11
Unity C# Programmer
Сейчас нет на сайте
Мне одно не понятно, за что отвечает переменная body и где она объявляется.

Добавлено (06 сентября 2015, 19:58)
---------------------------------------------
Блин, не могу всё-таки ошибку найти, головы создаются для всех экземпляров врагов, при убийстве одного экземпляра умирают все. И ещё есть healthbar у врагов, и рисуется только у одного(первого), и если тот первый умирает то рисуется у другого. Ещё есть событие у врага за пределами комнаты, и если он за пределами комнаты то удаляется только тот, который за пределами комнаты, и healtbar передаётся второму. И переменная hp у врагов почему-то общая, кто знает как исправить?

Добавлено (06 сентября 2015, 20:26)
---------------------------------------------
Я понял одну фичу Gm. Если в Step предмета стоит код проверки на удаление то есть если значение равно чему-то то удалить объект, то удаляются все экземпляры объекта.


Красочная сюжетно-ориентированная игра-головоломка
AnthemДата: Воскресенье, 06 Сентября 2015, 22:36 | Сообщение # 12
Д'Артаньян
Сейчас нет на сайте
Цитата vampir0305 ()
Мне одно не понятно, за что отвечает переменная body и где она объявляется.

Это не переменная, а название объекта тела врага. Ты же не написал, как он называется
Плюс, ты неправильно работаешь с хп врагов, поэтому оно у всех становится = 0 и враги удаляются. Как исправить, никто не знает, так как никто не в курсе, как ты сам это делаешь


Текстовый контент для вашей игры (бесплатно)
Сценарист, геймдизайнер для Вашей игры
vampir0305Дата: Понедельник, 07 Сентября 2015, 13:29 | Сообщение # 13
Unity C# Programmer
Сейчас нет на сайте
Итак, как я реализую хп врага:
Код в создание врага:
Код
hp=100


Step врага:
Код
if hp >=100 {hp=100}
if hp <= 0 {instance_destroy()}


В столкновении с объектом пуля у врага:
Код
damage = choose(10,4,6,20,12,5,3,8,30,40,15,25,35)

obj_ciborg.hp-=damage


Красочная сюжетно-ориентированная игра-головоломка
ЛеонидДата: Понедельник, 07 Сентября 2015, 16:00 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Цитата vampir0305 ()
if hp >=100 {hp=100}

Можно hp=max(100,hp). Думаю, это медленнее, но выглядит компактнее, и не так существенно в данном случае. Да и зачем больше или равно?
Цитата vampir0305 ()
В столкновении с объектом пуля у врага:
Код
damage = choose(10,4,6,20,12,5,3,8,30,40,15,25,35)

obj_ciborg.hp-=damage

Как и ожидалось. Зачем тебе уточнять obj_ciborg? Из-за этого-то хп отнимается у всех врагов сразу. Если событие уже стоит у врага, то можно просто записать hp-=damage, ты же работаешь с этим определенным экземпляром объекта, а не со всеми. Теперь точно должно работать нормально.
Зачем тебе переменная damage вообще? Это не существенно, но я бы записал компактнее, то есть
Код
hp-=choose(10,4,6,20,12,5,3,8,30,40,15,25,35)
vampir0305Дата: Понедельник, 07 Сентября 2015, 19:15 | Сообщение # 15
Unity C# Programmer
Сейчас нет на сайте
Леонид, спс, как всегда помог. А как быть с объектом головы. Там же хп не отнять просто hp, там надо вот так:
Код
obj_vrag.hp-тут сколько отнять

но если так сделать, то при попадании в голову хп отнимится у всех экземпляров.


Красочная сюжетно-ориентированная игра-головоломка
ЛеонидДата: Понедельник, 07 Сентября 2015, 19:57 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
Цитата vampir0305 ()
но если так сделать, то при попадании в голову хп отнимится у всех экземпляров.

Тебе YellowAfterlife все хорошо расписал уже.


Сообщение отредактировал Леонид - Понедельник, 07 Сентября 2015, 20:24
vampir0305Дата: Понедельник, 07 Сентября 2015, 20:51 | Сообщение # 17
Unity C# Programmer
Сейчас нет на сайте
Леонид, ах да, всё разобрался. Осталась одна фигня. У врагов health bar стоит и как его сделать чтобы отображался одновременно у всех врагов а не по очереди пока не убьёшь первого и т.д.
Код в Draw врага:
Код
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);

draw_sprite(spr_healthbar, 0, obj_vrag.x - 64, obj_vrag.y - 72)
draw_sprite_part(spr_healthbar, 1, 0, 0, sprite_get_width(spr_healthbar) * (body.enemy_hp / 100),    
sprite_get_height(spr_healthbar), obj_vrag.x - 64, obj_vrag.y - 72)


Красочная сюжетно-ориентированная игра-головоломка

Сообщение отредактировал vampir0305 - Понедельник, 07 Сентября 2015, 20:52
ЛеонидДата: Понедельник, 07 Сентября 2015, 22:04 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Цитата vampir0305 ()
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);

Зачем? В твоем случае draw_sprite сгодится (как и в большинстве других), не нужно использовать такую "длинную" функцию.
Не нужны и sprite_get_width(spr_healthbar), если спрайт у тебя не изменяется, его размеры это константы, зачем каждый раз получать их с помощью функции? Это замедляет производительность и делает код менее читаемым.
У тебя опять та же ошибка, зачем ссылаешься на объект obj_vrag, если здоровье должно отображаться у каждого отдельного экземпляра? Почему здоровье ты узнаешь через объект body? Если я правильно понимаю, что ты не понимаешь, у тебя явные проблемы с пониманием некоторых базовых вещей (много понимания). Советую почитать справку\посмотреть примеры, нежели вновь и вновь повторять те же ошибки.
vampir0305Дата: Вторник, 08 Сентября 2015, 14:00 | Сообщение # 19
Unity C# Programmer
Сейчас нет на сайте
Всем огромнейшее спасибо за помощь, всё решено.

Цитата Леонид ()
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);

Зачем? В твоем случае draw_sprite сгодится (как и в большинстве других), не нужно использовать такую "длинную" функцию.
Не нужны и sprite_get_width(spr_healthbar), если спрайт у тебя не изменяется, его размеры это константы, зачем каждый раз получать их с помощью функции? Это замедляет производительность и делает код менее читаемым.
У тебя опять та же ошибка, зачем ссылаешься на объект obj_vrag, если здоровье должно отображаться у каждого отдельного экземпляра? Почему здоровье ты узнаешь через объект body? Если я правильно понимаю, что ты не понимаешь, у тебя явные проблемы с пониманием некоторых базовых вещей (много понимания). Советую почитать справку\посмотреть примеры, нежели вновь и вновь повторять те же ошибки.


Спасибо тебе, подумав решение и вправду пришло ко мне само:
Код
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);

draw_sprite(spr_healthbar, 0, x - 64, y - 72)
draw_sprite_part(spr_healthbar, 1, 0, 0, sprite_get_width(spr_healthbar) * (enemy_hp / 100),  
sprite_get_height(spr_healthbar), x - 64, y - 72)


Красочная сюжетно-ориентированная игра-головоломка
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Соединить два объекта
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг