О столкновениях

Board index Геймдев в Blender Игровой движок Blender

Description: Все вопросы и обсуждения, касающиеся BGE
Moderators: exooman, denis8424

Post #1by Август » 25.11.2018, 10:21

Всем привет. Знатоки Python и BGE помогите решить проблему.
def init():
bge.logic.getCurrentScene().objects['Obj'].collisionCallbacks.append(callback) # В случае столкновения с 'Obj' переход на def callback


def callback(object, point, normal):
......................
Вопрос в следующем, как назначить этот же переход в случае столкновения с несколькими объектами, не только с 'Obj', но и, например, 'Dbj', 'Odj' и т.д., или 'Obj1', 'Obj2', 'Obj3' и т.д.?
Август M
Posts: 163

Post #2by Bibo » 25.11.2018, 12:49

BGE вызывает collisionCallbacks только при первом столкновении, игнорируя остальные случаи столкновений. Получить список всех объектов с которыми произошло столкновение можно только через сенсор Collision, но без точек столкновения.
Bibo
Avatar
Posts: 612

Post #3by Август » 25.11.2018, 15:42

Bibo wrote:BGE вызывает collisionCallbacks только при первом столкновении, игнорируя остальные случаи столкновений. Получить список всех объектов с которыми произошло столкновение можно только через сенсор Collision, но без точек столкновения.
Спасибо за ответ. "Только при первом случае столкновений", это при инициализации?
Мой вопрос рождён ситуацией, когда при движении объекта, объект взаимодействует с окружением, при том, что окружение состоит из разных объектов, взаимодействие (столкновение) с которыми должно вызывать или однотипную обработку или разнотипную. Например, помещение имеет стены, пол, потолок, окна, двери. Некий предмет перемещается в комнате. Если происходит столкновение со стенами, то должна произойти именно эта обработка столкновения и в той точке где произошло столкновение. Если с полом, потолком, то это другие виды обработки. Если окна или двери, то это третий вид обработки, ну и т.д.
Если collisionCallbacks негоден для такой ситуации, то что может его заменить?
Брошенный мяч должен отскочить от стены, но разбить стекло в окне и вылететь наружу.
Август M
Posts: 163

Post #4by Bibo » 25.11.2018, 16:10

Август wrote:"Только при первом случае столкновений", это при инициализации?
Первый объект в списке столкновений в момент столкновения. Какой именно это будет объект, предсказать возможным не представляется.
Август wrote:Если collisionCallbacks негоден для такой ситуации, то что может его заменить?
Ничего, BGE на это не способен. В UPBGE collisionCallbacks позволяет получить весь список столкновений и точки столкновений. Но это UPBGE.
Bibo
Avatar
Posts: 612

Post #5by Август » 25.11.2018, 17:01

Bibo wrote:Ничего, BGE на это не способен. В UPBGE collisionCallbacks позволяет получить весь список столкновений и точки столкновений. Но это UPBGE.
Кстати, Bibo, буквально несколько дней назад скачал UPBGE. Пока не огляделся, но сразу бросилась в глаза проблема с русификацией. Интерфейс русифицируется вполне приемлемо, а вот в окне текстового редактора вывод текста идёт с сокращённым по ширине знакоместом. Попробовал назначить несколько других шрифтов из числа доступных, но терпенье быстро лопнуло. Собственно, и латиница без русификации выводится с этими же проблемами.
В Blender 2.79 в окне текстового редактора проблем никаких нет, а UPBGE идёт наслоение символов последующего на предыдущий. Что-нибудь по этой проблеме можете подсказать?
Last edited by Август on 25.11.2018, 17:19, edited 1 time in total.
Август M
Posts: 163

Post #6by Wegemu » 25.11.2018, 17:06

Спасибо за ответ. "Только при первом случае столкновений", это при инициализации?
Мой вопрос рождён ситуацией, когда при движении объекта, объект взаимодействует с окружением, при том, что окружение состоит из разных объектов, взаимодействие (столкновение) с которыми должно вызывать или однотипную обработку или разнотипную. Например, помещение имеет стены, пол, потолок, окна, двери. Некий предмет перемещается в комнате. Если происходит столкновение со стенами, то должна произойти именно эта обработка столкновения и в той точке где произошло столкновение. Если с полом, потолком, то это другие виды обработки. Если окна или двери, то это третий вид обработки, ну и т.д.
Если collisionCallbacks негоден для такой ситуации, то что может его заменить?
Брошенный мяч должен отскочить от стены, но разбить стекло в окне и вылететь наружу.
Ну вообще-то годен. В collisionCallback передается object, point, normal и points. Внутри колбека сделать вермишель из условий как пример, с вызовом нужных функций для дальнейшей обработки. В чем проблема то собственно? :) Оно вызывается для каждого столкновения с каждым объектом.
Code: Select all
def ball_coll_callback(obj, point, normal):
   # определение по имени
   if obj.name == 'window':
      fx_glass_crash(obj, point, normal)
      
   if obj.name == 'floor':
      fx_wall_brake(obj, point, normal)
      
   # определение по свойству
   if obj['gtype'] == 'window':
      fx_glass_crash(obj, point, normal)
      
   if obj['gtype'] == 'floor':
      fx_wall_brake(obj, point, normal)

Можно и по материалу определять, но чуть-чуть сложнее.

Вот реальный пример из моего прототипа.

P.S. Так как это только ранний прототип игры, то код страшненький. Уберите беременных собак от экрана.
P.S.2 Разбавил доп. комментариями
P.S.3 Куда попадет пуля не важно, хоть в глаз хоть в палец (эль прототипо).

Code: Select all
...
# выстрел из оружия, вешаем колбек на пулю
shell.collisionCallbacks.append(shell_callback)
...
# ==================================
def shell_callback(obj):
   # попали во врага
   if obj.name in ENEMIES_LIST:
      system['SCORE'] += SCORE_TABLE['enemies'][obj.name] # бонусные очки
      system['KILLED'] += 1
      
      # выпадение бонусов
      v = randint(1, 20)
      if v == 1:
         add_bonus('ammo', obj, BONUS_TIME)
      
      if v == 2:
         add_bonus('score', obj, BONUS_TIME)
         
      if v == 3:
         add_bonus('medkit', obj, BONUS_TIME)
         
      if v == 4:
         add_bonus('money', obj, BONUS_TIME)
      
      zd = scene.addObject('zombie_dead', obj, 3*TICKRATE)
      
      # расчлененка
      for child in zd.children:
         child.removeParent()
         
         # ограничиваем "мусор" по времени
         life = logic.getClockTime() + 3.0 + 7.0*logic.getRandomFloat()
         child['endlife'] = life
         child.restoreDynamics()
         child.enableRigidBody()
         
         # r = logic.getRandomFloat()
         # g = logic.getRandomFloat()
         # b = logic.getRandomFloat()
         # child.color = [r, g, b, 1.0]
         
         # бабах
         impulse = child.worldPosition - zd.worldPosition
         child.applyImpulse(child.worldPosition, impulse/5.0, True)
      
      # good-bye, comrade
      obj.endObject()
When debugging, novices insert corrective code; experts remove defective code.
VEゲーム

Ушел в поисках приключений в страну GLSL.
Wegemu M
Avatar
Posts: 62

  • 1

Post #7by Bibo » 25.11.2018, 17:11

Август wrote:Что-нибудь по этой проблеме можете подсказать?
К сожалению нет. Никогда не пользовался русификаторами. Могу только добавить, что официальной поддержи переводов нет, а значит и качество русификации и ее совместимость с разными версиями (как и гарантия работоспособности) могут оставлять желать лучшего.
Wegemu wrote:В чем проблема то собственно?
В том, что таким образом можно проверить столкновение только с одним объектом. Если произойдет столкновение сразу с несколькими, код будет выполнен только для одного.
Bibo
Avatar
Posts: 612

Post #8by Wegemu » 25.11.2018, 17:27

В том, что таким образом можно проверить столкновение только с одним объектом. Если произойдет столкновение сразу с несколькими, код будет выполнен только для одного.
Верно. Но если действительно надо прям несколько объектов одновременно, то можно их добавлять в глобальный список в вызовах колбека (и не забыть сделать флаг-тригер) и проверять через пару кадров/небольшой задержки в KX.Scene.pre_draw/post_draw. Если есть ограничения, то надо выкручиваться или идти другим путем. Ну это первое что пришло в голову.
When debugging, novices insert corrective code; experts remove defective code.
VEゲーム

Ушел в поисках приключений в страну GLSL.
Wegemu M
Avatar
Posts: 62

Post #9by Август » 25.11.2018, 17:28

Wegemu wrote:Ну вообще-то годен. В collisionCallback передается object, point, normal и points. Внутри колбека сделать вермишель из условий как пример, с вызовом нужных функций для дальнейшей обработки. В чем проблема то собственно? Оно вызывается для каждого столкновения с каждым объектом.
Спасибо Wegemu, очень похоже что это то, что надо. Буду пробовать.
За код отдельное спасибо.

Added after 14 minutes 3 seconds:
Bibo wrote:К сожалению нет. Никогда не пользовался русификаторами.
Нет Bibo, я позже дописал, очевидно после вашего ответа, что эта бяка и без русификации имеет место в окне текстового редактора, тут дело скорее всего не в русификации. В настройках на вкладке Система включил настройки отрисовки текста и сглаживание, установил Hinting "Полностью". Ширина знакоместа чуть увеличилась, но наложение всё равно продолжается.
Август M
Posts: 163

Post #10by Wegemu » 25.11.2018, 17:57

Нет Bibo, я позже дописал, очевидно после вашего ответа, что эта бяка и без русификации имеет место в окне текстового редактора, тут дело скорее всего не в русификации. В настройках на вкладке Система включил настройки отрисовки текста и сглаживание, установил Hinting "Полностью". Ширина знакоместа чуть увеличилась, но наложение всё равно продолжается.
После запуска UPBGE нажать в панели меню Window -> Toggle System Console. Из страшного черного окна скопировать весь вывод сюда.

Image
When debugging, novices insert corrective code; experts remove defective code.
VEゲーム

Ушел в поисках приключений в страну GLSL.
Wegemu M
Avatar
Posts: 62

Post #11by Август » 25.11.2018, 18:11

Wegemu wrote:После запуска UPBGE нажать в панели меню Window -> Toggle System Console. Из страшного черного окна скопировать весь вывод сюда.
Извините Wegemu, но я не понял как вывод системного консольного окна здесь может помочь?

Added after 14 minutes 48 seconds:
Wegemu wrote:...
# выстрел из оружия, вешаем колбек на пулю
shell.collisionCallbacks.append(shell_callback)
...
# ==================================
Wegemu, тут очевидно надо определить объёкт shell? Мы столкновения которого будем проверять с окружением или окружения с которым? Что-то мозги набекрень поехали.
Август M
Posts: 163

Post #12by Wegemu » 25.11.2018, 18:52

Извините Wegemu, но я не понял как вывод системного консольного окна здесь может помочь?
Ну если UPBGE молчит и не ругается, тогда да, не поможет. Но я все же склоняюсь к тому, что дело в видеоадаптере.

Wegemu, тут очевидно надо определить объёкт shell? Мы столкновения которого будем проверять с окружением или окружения с которым? Что-то мозги набекрень поехали
Мы столкновения которого будем проверять с окружением

https://paste.ofcode.org/zHz42CahmmixAwDkBwTSfZ
When debugging, novices insert corrective code; experts remove defective code.
VEゲーム

Ушел в поисках приключений в страну GLSL.
Wegemu M
Avatar
Posts: 62

Post #13by Август » 25.11.2018, 21:30

Wegemu wrote:Ну если UPBGE молчит и не ругается, тогда да, не поможет. Но я все же склоняюсь к тому, что дело в видеоадаптере.
Ну, ругаться-то он ругается, и на Ё, и на хэр посылает. Вот полюбуйтесь на шельмеца.
Image
и, это нерусифицированный так изгаляется.
Август M
Posts: 163


Return to Игровой движок Blender