简体   繁体   English

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

[英]Pygame why isn't my collision working?

I am trying to detect when two of my sprites collide. 我试图检测我的两个精灵何时发生碰撞。 The first thing I did was create a rectangle around my player (called player.img) then another around the trees that I want to detect (called background.treesrect). 我做的第一件事是在播放器周围创建一个矩形(称为player.img),然后在要检测的树木周围创建一个矩形(称为background.treesrect)。 I set the coordinates of the players rectangle equal to the coordinates that update when the player moves by the user pressing keys but the players rectangle doesnt move. 我将播放器矩形的坐标设置为等于当用户通过按键移动播放器但播放器矩形不移动时更新的坐标。 Then I used the sprite.colliderect(sprite) function to detect if they collide and it doesnt detect. 然后,我使用了sprite.colliderect(sprite)函数来检测它们是否发生碰撞,并且它不会检测到。 Can someone show my why my player rectangle isnt updating and anything else that may be wrong? 有人可以告诉我为什么我的播放器矩形不更新以及其他可能出错的信息吗?

EDIT I just figured out the collision by putting the function that draws the rectangle into the game loop instead of the player class but I ran into another weird problem. 编辑我只是通过将绘制矩形的函数而不是玩家类放到游戏循环中来解决冲突,但遇到了另一个奇怪的问题。 The rectangle moves faster than the player sprite for some reason and I cant figure out how to make the player sprite on top of the background and not show the player rectangle. 由于某种原因,矩形移动的速度比播放器精灵快,我无法弄清楚如何使播放器精灵位于背景上方,而不显示播放器矩形。

                            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)

I think this may be due to the fact that, in the class Player, self.rect isn't right. 我认为这可能是由于在Player类中self.rect不正确。 Instead try: 而是尝试:

self.rect = self.img.get_rect()

also, in your main loop, why are you blit-ing stuff in the event for loop? 另外,在您的主循环中,为什​​么要在循环事件中放血呢?
Only put the key presses in for event in pygame.event.get() for event in pygame.event.get()中将按键for event in pygame.event.get()
There are other things that are very wrong in the code. 代码中还有其他错误。
May I recommend this excellent tutorial for making games with sprites in pygame. 我可以推荐这个出色的教程来用pygame中的精灵制作游戏。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM