2012-02-16 2 views
3

Как найти столкновение между символами и изображениями в PyGame? Я нарисовал игрока из изображения и нарисовал стены из плиток, так как бы я обнаружил эти столкновения?PyGame Collision?

+0

у вас есть ошибка? вы могли бы опубликовать часть своего кода? – Mizipzor

+0

Можете ли вы дать тест? – beary605

+0

Вы должны хотя бы показать, что вы пробовали. –

ответ

11

Если вы используете класс pygame Rect для представления границ вашего объекта, вы можете определить, сталкиваются ли два с помощью функции Rect.colliderect. Например:

import pygame 

a = pygame.Rect((1, 1), (2, 2)) 
b = pygame.Rect((0, 0), (2, 2)) 
c = pygame.Rect((0, 0), (1, 1)) 
a.colliderect(b) 
# 1 
a.colliderect(c) 
# 0 
b.colliderect(c) 
# 1 

а является сталкиваясь с Ь и Ь сталкиваясь с с, но не сталкиваясь с гр. Обратите внимание, что прямоугольники, разделяющие границу, не сталкиваются.

Pygame также поддерживает использование Rect как позиции для изображения, когда вы хотите «разбить» его на экране.

+1

Это не работает для меня, он всегда возвращает 0 – pixelgeer

2

Да, но убедитесь, что использовать классы спрайтов для прямоугольников, sprite info available here. Таким образом, для каждого спрайта сделать прямоугольник:

class object(pygame.sprite.Sprite): 
def __init__(self): 
    pygame.sprite.Sprite.__init__(self) 
    self.x = 0 
    self.y = 0 
    self.image = pygame.image.load('object.png') 
    self.rect = pygame.Rect(self.x,self.y,32,32) #The rect for collision detection. 

Я знаю, это выглядит как много, и то, что я думал, когда я начался с спрайтов, но поверьте мне, это того стоит.

0
import pygame 
pygame.init() 
class Sprite(pygame.sprite.Sprite): 
    def __init__(self, image, location): 
     self.image = pygame.image.load(urimage) 
... 

затем сделать столкновение групп и использовать pygame.sprite.spritecollide()

0

Есть много способов, которые вы можете сделать обнаружение столкновений в Pygame. Rect (@Darthfett) и spritecollide методы являются более популярными, но есть 2 другие, которые вы можете использовать:

Метод 1:

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

Что вы делаете, это выбрать определенный цвет, проверить цвета пикселей вокруг объекта и заставить его столкнуться, если вы обнаружите определенный цвет. Это позволяет использовать простые игры, такие как «Do not Let Your Mouse Touch The Color Black» и другие простые программы.

Метод 2:

Этот метод, безусловно, мой любимый, и я использую это в 90% всех моих программ. Вы обнаруживаете столкновение по расчету . Здесь вы берете координаты объектов 1 и 2, смотрите, насколько они близки друг к другу, и из-за этого возникают столкновения. Этот метод допускает большую гибкость при столкновениях, не слишком неряшлив, если все сделано правильно, и довольно просто. Это может занять немного времени, и вам нужно будет тестировать программу много раз, но результаты ее стоит того. Этот метод также позволяет обнаруживать между невидимыми объектами и позволяет легко регулировать коллизионные поля, например. если есть волшебник или что-то еще, и вы умираете, когда вы на некоторое расстояние от него. Этот метод действительно не так популярен, как должен, но я заверяю вас, что он работает. Две самые простые формы столкновения с этим методом - с круговыми и с прямоугольным столкновением.

0

Создайте функцию, которая проверяет для х, у, ш, ч периметров обоих объектов и создать если заявление как таковой, которая будет проверять, если два объекта сталкиваясь:

def col_check(x,y,w,h,x2,y2,w2,h2): 
if (x < (x2 + w2) and (x + w) > x2 and y < (y2 + h2) and (h + y) > y2):      
    # Do something here             

Теперь вы можете просто вызовите функцию с периметрами объектов в качестве аргументов.

0

Допустим, у вас есть класс игрока, который выглядит примерно так, мне нравится использовать pygame.sprite.collide_rect(), в этом случае у нас также будет класс стены.

class Player(pygame.sprite.Sprite): 
    def __init__(self,x,y): 

     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((32,32)) 
     self.rect = Rect(x, y, 32, 32) 

    def move(self, px, py): 

     if px != 0: 
      self.move_on_axis(px, 0) 
     if py != 0: 
      self.move_on_axis(0, py) 

    def move_on_axis(self, px, py): 
     self.rect.x += px 
     self.rect.y += py 

Здесь мы щекочем для столкновений с чем-либо в группе стен, которые мы добавляем, когда когда-либо создаём новую стену.

 for wall in walls: 
      if pygame.sprite.collide_rect(self, wall): 
       if px > 0: 
        self.rect.right = wall.rect.left 
       if px < 0: 
        self.rect.left = wall.rect.right 
       if py > 0: 
        self.rect.bottom = wall.rect.top       
       if py < 0: 
        self.rect.top = wall.rect.bottom 

class Wall(pygame.sprite.Sprite): 
    def __init__(self, wx): 
     super().__init__() 
     all_Sprite_List.add(self) 
     walls.add(self) 
     self.image = pygame.Surface((32,32)) 
     self.rect = Rect(wx[0], wx[1], 32, 32)