【问题标题】:Pygame why isn't my collision working?Pygame为什么我的碰撞不起作用?
【发布时间】:2015-04-14 03:15:12
【问题描述】:

我正在尝试检测我的两个精灵何时发生碰撞。我做的第一件事是在我的播放器周围创建一个矩形(称为 player.img),然后在我想要检测的树周围创建另一个矩形(称为 background.treesrect)。我将玩家矩形的坐标设置为等于当玩家通过用户按键移动但玩家矩形不移动时更新的坐标。然后我使用 sprite.colliderect(sprite) 函数来检测它们是否发生碰撞并且它没有检测到。有人可以告诉我为什么我的播放器矩形没有更新以及其他任何可能有问题的地方吗?

编辑我只是通过将绘制矩形的函数而不是玩家类放入游戏循环中来解决碰撞问题,但我遇到了另一个奇怪的问题。由于某种原因,矩形移动得比玩家精灵快,我不知道如何让玩家精灵在背景之上而不显示玩家矩形。

                            import pygame
                            import sys
                            from pygame.locals import *

                            #starts the program
                            pygame.init()

                            white = (255, 255, 255)
                            black = (0, 0, 0)
                            red = (255, 0, 0)
                            blue = (0, 0, 255)
                            green = (0, 255, 0)
                            yellow = (255, 255, 153)

                            #creates a window of 800x600
                            setDisplay = pygame.display.set_mode((800, 600))
                            pygame.display.set_caption('Menu')

                            img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png')

                            class Player(pygame.sprite.Sprite):
                                    def __init__(self):
                                            pygame.sprite.Sprite.__init__(self)
                                            self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert()
                                            self.imgx = 10
                                            self.imgy = 10
                                            self.setDisplay = pygame.display.get_surface()
                                            self.x = self.imgx
                                            self.y = self.imgy
                                            self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32))

                                    def draw(self):
                                            self.setDisplay.blit(self.img)

                                    def load(self, filename):
                                            self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()               



                            class Background(pygame.sprite.Sprite):
                                    def __init__(self):
                                             pygame.sprite.Sprite.__init__(self)
                                             self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert()
                                             self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert()
                                             self.treesx = 0
                                             self.treesy = 70
                                             self.treesrect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255),pygame.Rect(self.treesx, self.treesy, 376, 100))
                                    def draw(self):
                                             self.setDisplay.blit(self.img)
                                             self.setDisplay.blit(self.img2)

                                    def load(self, filename):
                                             self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert_alpha()
                                             self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert_alpha()


                            def detectCollision(sprite1, sprite2):
                                    if sprite1.colliderect(sprite2):
                                            print("worked")
                            player = Player()              
                            background = Background()
                            def gameLoop():



                                imgx = 10
                                imgy = 10
                                lead_x_change = 0
                                lead_y_change = 0
                                move_variable = 5

                                while True:



                                    pygame.display.flip()

                                    for event in pygame.event.get():
                                        #print (event)

                                        if event.type == QUIT:
                                            pygame.quit()
                                            sys.exit()
                                        setDisplay.blit(background.img, [0, 0])
                                        setDisplay.blit(background.img2, [0, 0])
                                        setDisplay.blit(player.img, [player.imgx, player.imgy])


                                        if player.rect.colliderect(background.treesrect):
                                                print("collided")

                                        if event.type == pygame.KEYDOWN:
                                            if event.key == pygame.K_LEFT:
                                                lead_x_change = -move_variable
                                                player.x -= 10
                                            elif event.key == pygame.K_UP:
                                                lead_y_change = -move_variable
                                            elif event.key == pygame.K_RIGHT:
                                                player.imgx += 10
                                                player.x += 10
                                            elif event.key == pygame.K_DOWN:
                                                lead_y_change = move_variable
                                                player.y += 10
                                        if event.type == pygame.KEYUP:
                                            if event.key == pygame.K_LEFT:
                                                lead_x_change = 0
                                            elif event.key == pygame.K_UP:
                                                lead_y_change = 0
                                            elif event.key == pygame.K_RIGHT:
                                                lead_x_change = 0
                                            elif event.key == pygame.K_DOWN:
                                                lead_y_change = 0
                                        print(player.x, player.y)

                                        player.imgx += lead_x_change
                                        player.imgy += lead_y_change
                                    pygame.display.flip()
                                    pygame.display.update()

                            gameLoop()

                            #start (0, 71)
                            #length (376, 71)
                            #width (0, 168)

【问题讨论】:

    标签: python pygame sprite collision


    【解决方案1】:

    我认为这可能是因为在 Player 类中 self.rect 是不正确的。而是尝试:

    self.rect = self.img.get_rect()

    另外,在你的主循环中,你为什么要在 for 循环的事件中使用 blit-ing 东西?
    只把按键放在for event in pygame.event.get()
    代码中还有其他非常错误的地方。
    我可以推荐this excellent tutorial 在pygame 中使用精灵制作游戏。

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多