当前位置: 首页 > 知识库问答 >
问题:

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

宇文鸣
2023-03-14

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

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

                            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个答案

蒋奕
2023-03-14

我认为这可能是因为,在课堂上,Player,自我。瑞特是不对的。请尝试:

< code > self . rect = self . img . get _ rect()

另外,在你的主循环中,你为什么在事件中为循环而烦恼?
只在 pygame.event.get() 中为事件输入按键,
代码中还有其他非常错误的东西。
我可以推荐这个优秀的教程,用于在pygame中使用精灵制作游戏。

 类似资料:
  • 我了解碰撞检测的基础,并开发了我自己的碰撞检测方法(据我所知)。然而,这似乎并不奏效。我所做的不是围绕精灵、形状和其他对象绘制完整的矩形,而是简单地在对象的所有边(左、右、上、下)绘制线条(非常细的矩形)。 在指定子画面的左侧、右侧、顶部和底部绘制细矩形的方法。这可能不是进行碰撞的最佳方式,但这就是我所拥有的,并且对所有想法和不同的解决方案持开放态度! 注:(int)(x-Game.getCame

  • 我正在与Kotlin研究地图,并决定运行以下代码: 这让我: 我以为的冲突导致了一个列表。然后当我尝试这是静态编程语言的时,我也没有得到任何冲突。 问题: 我在这个简单的碰撞示例中错过了什么? 每个实现最常见的冲突行为是什么?

  • 我在我的瓷砖碰撞方法中遇到了一个问题。由于某种原因,玩家可以在不应该通过的时候通过一些瓷砖。此外,我不完全确定为什么,但当它卡住时,它可以通过对象向左移动,但只能向左移动。我在下面发布了一些代码,如果有人能给我指出正确的方向就好了。(或者如果有人能找到一个快速的解决方案就更好了!)我的玩家移动方法和瓷砖碰撞方法都在更新方法中调用。

  • Stage.close()对我不起作用。 我查看了:JavaFX2.0:关闭一个舞台(窗口) 这是我的代码: 下面是调用消息框类的代码:

  • 当我尝试检测两个矩形之间的碰撞时当我启动程序时,它只打印“HIT”一次 我还尝试使用但出现此错误: 回溯(最近调用最后): 文件“D:/蟒蛇/PyCharm/test/src/Main/test.py”,第 104 行, 命中 = pygame.sprite.spritecollide(player_sprites,enemy_sprites,1) 文件“D:\程序\蟒蛇\lib\site-pac

  • 我正在尝试使代码中的冲突检测正常工作。我正在使用矢量,我希望玩家精灵在与称为的精灵组碰撞时碰撞并停止。问题是玩家可以通过底墙。 在这个例子中,我关闭了重力。 x冲突是可以的,但它有点滑稽,只有y方向不能正常工作与相同的代码。 我已经尝试使用调试器调试代码,但没有成功。 我主要感兴趣的是弄清楚为什么垂直碰撞检测不起作用,但我也希望得到关于水平碰撞检测的建议。 友情链接: 吉特哈布 : 完整代码 当前