[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 39: mysqli::mysqli() [mysqli.mysqli]: (28000/1045): Access denied for user 'itcomp_korchy'@'91.206.201.47' (using password: YES)
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 63: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 51: mysqli::query() [mysqli.query]: Couldn't fetch mysqli
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 63: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 51: mysqli::query() [mysqli.query]: Couldn't fetch mysqli
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 63: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli
[phpBB Debug] PHP Warning: in file [ROOT]/konkurs/konkursrank.inc.php on line 51: mysqli::query() [mysqli.query]: Couldn't fetch mysqli
О столкновениях - Игровой движок Blender - Форум про Blender 3D

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

Список разделов Геймдев в Blender Игровой движок Blender

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

Сообщение #1 Август » 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
Сообщения: 163

Сообщение #2 Bibo » 25.11.2018, 12:49

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

Сообщение #3 Август » 25.11.2018, 15:42

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

Сообщение #4 Bibo » 25.11.2018, 16:10

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

Сообщение #5 Август » 25.11.2018, 17:01

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

Сообщение #6 Wegemu » 25.11.2018, 17:06

Спасибо за ответ. "Только при первом случае столкновений", это при инициализации?
Мой вопрос рождён ситуацией, когда при движении объекта, объект взаимодействует с окружением, при том, что окружение состоит из разных объектов, взаимодействие (столкновение) с которыми должно вызывать или однотипную обработку или разнотипную. Например, помещение имеет стены, пол, потолок, окна, двери. Некий предмет перемещается в комнате. Если происходит столкновение со стенами, то должна произойти именно эта обработка столкновения и в той точке где произошло столкновение. Если с полом, потолком, то это другие виды обработки. Если окна или двери, то это третий вид обработки, ну и т.д.
Если collisionCallbacks негоден для такой ситуации, то что может его заменить?
Брошенный мяч должен отскочить от стены, но разбить стекло в окне и вылететь наружу.
Ну вообще-то годен. В collisionCallback передается object, point, normal и points. Внутри колбека сделать вермишель из условий как пример, с вызовом нужных функций для дальнейшей обработки. В чем проблема то собственно? :) Оно вызывается для каждого столкновения с каждым объектом.
Код: Выделить всё
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 Куда попадет пуля не важно, хоть в глаз хоть в палец (эль прототипо).

Код: Выделить всё
...
# выстрел из оружия, вешаем колбек на пулю
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
Аватара
Сообщения: 62

  • 1

Сообщение #7 Bibo » 25.11.2018, 17:11

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

Сообщение #8 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
Аватара
Сообщения: 62

Сообщение #9 Август » 25.11.2018, 17:28

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

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

Сообщение #10 Wegemu » 25.11.2018, 17:57

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

Изображение
When debugging, novices insert corrective code; experts remove defective code.
VEゲーム

Ушел в поисках приключений в страну GLSL.
Wegemu M
Аватара
Сообщения: 62

Сообщение #11 Август » 25.11.2018, 18:11

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

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

Сообщение #12 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
Аватара
Сообщения: 62

Сообщение #13 Август » 25.11.2018, 21:30

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


Вернуться в Игровой движок Blender