PyGame Collision?

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


person pixelgeer    schedule 16.02.2012    source источник
comment
вы получаете ошибку? не могли бы вы опубликовать часть своего кода?   -  person Mizipzor    schedule 05.04.2012
comment
Вы должны хотя бы показать то, что пробовали.   -  person DCA-    schedule 17.06.2016


Ответы (6)


Если вы используете класс 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

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

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

person Casey Kuball    schedule 16.02.2012

Да, но обязательно используйте классы спрайтов для прямоугольников, доступную здесь информацию о спрайтах. Итак, для каждого спрайта сделайте прямоугольник:

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.

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

person Nick Panagakis    schedule 04.01.2013

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

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

person Henry    schedule 16.06.2015

Допустим, у вас есть класс игрока, который выглядит примерно так, мне нравится использовать 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)
person dustin bennett    schedule 30.04.2016

Создайте функцию, которая проверяет периметры x, y, w, h обоих объектов, и создайте оператор if как таковой, который будет проверять, сталкиваются ли два объекта:

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                                                

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

person Dav    schedule 17.04.2016

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

Способ 1:

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

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

Способ 2:

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

person Douglas - 15 year old Pythoner    schedule 11.01.2016