Python碰撞使用pygame检测图像(图像类型:png)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python碰撞使用pygame检测图像(图像类型:png)相关的知识,希望对你有一定的参考价值。

我想制作碰撞检测脚本。

当我运行我的脚本时,Pygame总是说图像是碰撞的。

当我使用{"rect = cat1.img.get_rect()" then "rect.colliderect(another rect of other image)}时,它会打印出“崩溃”。

我在两个精灵中使用了cat.png

问题

cat.png不好吗?

我没有使用正确的脚本吗?

我的电脑很怪异吗?

这是我的脚本和cat.png

import pygame, sys, time
from pygame.locals import *

pygame.init()

Fps = 100
fpsClock = pygame.time.Clock()

Displaysurf = pygame.display.set_mode((300, 300))# full is 1900, 1000
pygame.display.set_caption('Animation')

white = (255, 255, 255)

class cat:
      def __init__(self, x, y):
          self.img = pygame.image.load('cat.png')
          self.x = x
          self.y = y
          self.rect = self.img.get_rect()

     def draw(self):
          Displaysurf.blit(self.img, (self.x, self.y))

     def colde(self, sprite1, sprite2):
          col = pygame.sprite.collide_rect(sprite1, sprite2)
          if col == True:
               print("crash!")

cat1 = cat(10, 10)
cat2 = cat(100, 100)

while True:
    Displaysurf.fill(white)
    cat1.draw()
    cat2.draw()

    for event in pygame.event.get():
        if event.type==QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        cat1.y -= 3
    if keys[pygame.K_DOWN]:
        cat1.y += 3
    if keys[pygame.K_LEFT]:
        cat1.x -= 3
    if keys[pygame.K_RIGHT]:
        cat1.x += 3
    cat1.colde(cat1, cat2)
    pygame.display.update()
    fpsClock.tick(Fps)`
答案

你必须使用cat1.rect.xcat1.rect.x而不是cat1.xcat1.y移动物体,然后使用cat1.rect检查碰撞并绘制它

self.rect.colliderect(other_sprite)

surface.blit(self.img, self.rect)

码:

import pygame

# --- constants --- (UPPER_CASE_NAMES)

FPS = 100
WHITE = (255, 255, 255)

# --- classes --- (CamelCaseNames)

class Cat:

    def __init__(self, x, y):
        self.img = pygame.image.load('cat.png')
        self.rect = self.img.get_rect()
        self.rect.x = x
        self.rect.y = y

    def draw(self, surface):
        surface.blit(self.img, self.rect)

    def colide(self, other_sprite):
        col = self.rect.colliderect(other_sprite)
        if col:
            print("crash!")

# --- main --- (lower_case_names)

# - init -

pygame.init()

display_surf = pygame.display.set_mode((300, 300)) # full is 1900, 1000
pygame.display.set_caption('Animation')

# - objects -

cat1 = Cat(10, 10)
cat2 = Cat(100, 100)

# - mainloop -

fps_clock = pygame.time.Clock()
running = True

while running:

    # - events -

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()

    if keys[pygame.K_UP]:
        cat1.rect.y -= 3
    if keys[pygame.K_DOWN]:
        cat1.rect.y += 3
    if keys[pygame.K_LEFT]:
        cat1.rect.x -= 3
    if keys[pygame.K_RIGHT]:
        cat1.rect.x += 3

    # - updates (without draws) -

    cat1.colide(cat2)

    # - draws (without updates) -

    display_surf.fill(WHITE)
    cat1.draw(display_surf)
    cat2.draw(display_surf)

    pygame.display.update()

    fps_clock.tick(FPS)

# - end -

pygame.quit()

以上是关于Python碰撞使用pygame检测图像(图像类型:png)的主要内容,如果未能解决你的问题,请参考以下文章

Pygame中图像和矩形之间的碰撞检测?

Pygame如何改变图像碰撞点

Python-项目实战--飞机大战-碰撞检测

Pygame - 没有 Sprite 或类的子弹和敌人碰撞

pygame碰撞检测函数python3中的语法错误[重复]

Python进阶篇十一Pygame的精灵和碰撞检测