Как найти столкновение между символами и изображениями в PyGame? Я нарисовал игрока из изображения и нарисовал стены из плиток, так как бы я обнаружил эти столкновения?PyGame Collision?
ответ
Если вы используете класс 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 как позиции для изображения, когда вы хотите «разбить» его на экране.
Это не работает для меня, он всегда возвращает 0 – pixelgeer
Да, но убедитесь, что использовать классы спрайтов для прямоугольников, 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.
Я знаю, это выглядит как много, и то, что я думал, когда я начался с спрайтов, но поверьте мне, это того стоит.
import pygame
pygame.init()
class Sprite(pygame.sprite.Sprite):
def __init__(self, image, location):
self.image = pygame.image.load(urimage)
...
затем сделать столкновение групп и использовать pygame.sprite.spritecollide()
Есть много способов, которые вы можете сделать обнаружение столкновений в Pygame. Rect (@Darthfett) и spritecollide методы являются более популярными, но есть 2 другие, которые вы можете использовать:
Метод 1:
Этот метод очень легко программировать, но увеличить разгильдяйства кодирование, имеет множество ограничений, и обычно это не лучшая вещь для использования.
Что вы делаете, это выбрать определенный цвет, проверить цвета пикселей вокруг объекта и заставить его столкнуться, если вы обнаружите определенный цвет. Это позволяет использовать простые игры, такие как «Do not Let Your Mouse Touch The Color Black» и другие простые программы.
Метод 2:
Этот метод, безусловно, мой любимый, и я использую это в 90% всех моих программ. Вы обнаруживаете столкновение по расчету . Здесь вы берете координаты объектов 1 и 2, смотрите, насколько они близки друг к другу, и из-за этого возникают столкновения. Этот метод допускает большую гибкость при столкновениях, не слишком неряшлив, если все сделано правильно, и довольно просто. Это может занять немного времени, и вам нужно будет тестировать программу много раз, но результаты ее стоит того. Этот метод также позволяет обнаруживать между невидимыми объектами и позволяет легко регулировать коллизионные поля, например. если есть волшебник или что-то еще, и вы умираете, когда вы на некоторое расстояние от него. Этот метод действительно не так популярен, как должен, но я заверяю вас, что он работает. Две самые простые формы столкновения с этим методом - с круговыми и с прямоугольным столкновением.
Создайте функцию, которая проверяет для х, у, ш, ч периметров обоих объектов и создать если заявление как таковой, которая будет проверять, если два объекта сталкиваясь:
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
Теперь вы можете просто вызовите функцию с периметрами объектов в качестве аргументов.
Допустим, у вас есть класс игрока, который выглядит примерно так, мне нравится использовать 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. Pygame Collision не работает
- 2. Python Pygame Enemy Collision
- 3. Pygame Collision Detection (прямоугольники)
- 4. pygame sprite wall collision
- 5. Pygame Collision без класса
- 6. Pygame image collision
- 7. Pygame collision trouble
- 8. Pygame Collision Map
- 9. Pygame Collision Explained
- 10. Pygame Collision взаимодействие логическое
- 11. Pygame Sprite Collision
- 12. Pygame Collision Not Working - pygame.sprite.collide_rect()
- 13. Pygame Collision с переменной скоростью
- 14. Pygame Collision with Change sprites
- 15. PyGame Collision Detection - Платформер замораживания
- 16. Pygame 2,7 Collision To 3,3
- 17. Pygame Collision Error Python 3
- 18. Pygame rect.contains collision не обнаруживает
- 19. Pygame: Collision by Sides of Sprite
- 20. PyGame Collision with Tile Rendered map?
- 21. Pygame collision, did not use pygame.sprite
- 22. Pygame: Collision С плитками не работает
- 23. Pygame Screen Collision Troubles, Player Moves Off Screen
- 24. PyGame collision работает, но спрайт сбрасывается - движение не продолжается.
- 25. Rectangle collision in pygame? (Наклоняя прямоугольники друг в друга)
- 26. jQuery Collision
- 27. CFBundleIdentifier Collision
- 28. Vector Collision
- 29. JavaScript Collision
- 30. Love2D Collision?
у вас есть ошибка? вы могли бы опубликовать часть своего кода? – Mizipzor
Можете ли вы дать тест? – beary605
Вы должны хотя бы показать, что вы пробовали. –