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