Pygame为什么我的碰撞不起作用?

时间:2015-04-14 03:15:13

标签: python pygame sprite collision

我试图检测我的两个精灵何时发生碰撞。我做的第一件事是在我的播放器周围创建一个矩形(称为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)

1 个答案:

答案 0 :(得分:1)

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

self.rect = self.img.get_rect()

另外,在你的主循环中,你为什么要在循环事件中搞砸东西呢? 只按下for event in pygame.event.get()中的按键 代码中还有其他一些非常错误的东西 我可以推荐this excellent tutorial在pygame中制作带有精灵的游戏。