Page 1 of 1

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

Post #1Posted: 25.11.2018, 10:21
by Август
Всем привет. Знатоки 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' и т.д.?

Post #2Posted: 25.11.2018, 12:49
by Bibo
BGE вызывает collisionCallbacks только при первом столкновении, игнорируя остальные случаи столкновений. Получить список всех объектов с которыми произошло столкновение можно только через сенсор Collision, но без точек столкновения.

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

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

Post #5Posted: 25.11.2018, 17:01
by Август
Bibo wrote:Ничего, BGE на это не способен. В UPBGE collisionCallbacks позволяет получить весь список столкновений и точки столкновений. Но это UPBGE.
Кстати, Bibo, буквально несколько дней назад скачал UPBGE. Пока не огляделся, но сразу бросилась в глаза проблема с русификацией. Интерфейс русифицируется вполне приемлемо, а вот в окне текстового редактора вывод текста идёт с сокращённым по ширине знакоместом. Попробовал назначить несколько других шрифтов из числа доступных, но терпенье быстро лопнуло. Собственно, и латиница без русификации выводится с этими же проблемами.
В Blender 2.79 в окне текстового редактора проблем никаких нет, а UPBGE идёт наслоение символов последующего на предыдущий. Что-нибудь по этой проблеме можете подсказать?

Post #6Posted: 25.11.2018, 17:06
by Wegemu
Спасибо за ответ. "Только при первом случае столкновений", это при инициализации?
Мой вопрос рождён ситуацией, когда при движении объекта, объект взаимодействует с окружением, при том, что окружение состоит из разных объектов, взаимодействие (столкновение) с которыми должно вызывать или однотипную обработку или разнотипную. Например, помещение имеет стены, пол, потолок, окна, двери. Некий предмет перемещается в комнате. Если происходит столкновение со стенами, то должна произойти именно эта обработка столкновения и в той точке где произошло столкновение. Если с полом, потолком, то это другие виды обработки. Если окна или двери, то это третий вид обработки, ну и т.д.
Если 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()

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

Post #8Posted: 25.11.2018, 17:27
by Wegemu
В том, что таким образом можно проверить столкновение только с одним объектом. Если произойдет столкновение сразу с несколькими, код будет выполнен только для одного.
Верно. Но если действительно надо прям несколько объектов одновременно, то можно их добавлять в глобальный список в вызовах колбека (и не забыть сделать флаг-тригер) и проверять через пару кадров/небольшой задержки в KX.Scene.pre_draw/post_draw. Если есть ограничения, то надо выкручиваться или идти другим путем. Ну это первое что пришло в голову.

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

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

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

Image

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

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

Post #12Posted: 25.11.2018, 18:52
by Wegemu
Извините Wegemu, но я не понял как вывод системного консольного окна здесь может помочь?
Ну если UPBGE молчит и не ругается, тогда да, не поможет. Но я все же склоняюсь к тому, что дело в видеоадаптере.

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

https://paste.ofcode.org/zHz42CahmmixAwDkBwTSfZ

Post #13Posted: 25.11.2018, 21:30
by Август
Wegemu wrote:Ну если UPBGE молчит и не ругается, тогда да, не поможет. Но я все же склоняюсь к тому, что дело в видеоадаптере.
Ну, ругаться-то он ругается, и на Ё, и на хэр посылает. Вот полюбуйтесь на шельмеца.
Image
и, это нерусифицированный так изгаляется.