2016-07-16 4 views
1

В настоящее время я работаю над игрой на Pygame, Python 3, и одной из существенных частей игры является столкновение Rect в ситуации с пулей-мишенью.Столкновение Colorkey между Rect в Pygame, Python 3

Это довольно легко достичь с помощью функции colliderect, но необходимо, чтобы пиксели были того же цвета, что и colorkey, чтобы не считаться.

Например, если один из спрайтов (символ) выполнен в виде большого равностороннего треугольника с горизонтальной базой, а пуля исходит из верхнего левого угла, colliderect обнаруживает столкновение сразу, хотя пиксели в верхнем левом углу спрайта игрока прозрачны.

Мне нужно сделать функцию, которая будет обнаруживать столкновение только тогда, когда пуля достигнет пикселей различного цвета, чем colorkey. Это достаточно легко, если пуля только один пиксель:

if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey(): 

Я попытался итерация выше заявление для каждого пикселя в пуле, но, конечно же, что вызвало огромный лаг. Есть ли другой, более эффективный способ?

Спасибо заранее!

ответ

1

Посмотри на функции collide_mask:

http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask

Вкратце вы даете каждый спрайт атрибут self.mask (с использованием pygame.mask.from_surface()) - что можно сделать с помощью цветового ключа , или на пиксель альфа. Затем вы включите его в качестве обратного вызова для функции spritecollide как так:

pygame.sprite.spritecollide (игрок, пули, правда, pygame.sprite.collide_mask)

Надеется, что это помогает!

0

мне удалось сделать алгоритм, который смотрит на углах каждого прямоугольника:

def rectsCollideSimple (rect1, surf1, rect2, surf2): 
    collide = False 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    return collide 

def rectsCollide (rect1, surf1, rect2, surf2): 
    if rectsCollideSimple(rect1, surf1, rect2, surf2) or rectsCollideSimple(rect2, surf2, rect1, surf1): 
     return True 
    else: 
     return False 

Возможно не самый effcient путь, но решить мою проблему :)

Смежные вопросы