Столкновение PyGame? - PullRequest
       38

Столкновение PyGame?

6 голосов
/ 16 февраля 2012

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

Ответы [ 6 ]

13 голосов
/ 16 февраля 2012

Если вы используете класс 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 в качестве позиции для изображения, когда вы хотите «перетащить» его на экран.

4 голосов
/ 04 января 2013

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

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.

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

2 голосов
/ 17 июня 2015
import pygame
pygame.init()
class Sprite(pygame.sprite.Sprite):
    def __init__(self, image, location):
        self.image = pygame.image.load(urimage)
...

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

1 голос
/ 30 апреля 2016

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

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

0 голосов
/ 11 января 2016

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

Метод 1:

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

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

Метод 2:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...