Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我在PyGame中无法让碰撞与我的platformer一起工作_Python_Python 3.x_Pygame - Fatal编程技术网

Python 我在PyGame中无法让碰撞与我的platformer一起工作

Python 我在PyGame中无法让碰撞与我的platformer一起工作,python,python-3.x,pygame,Python,Python 3.x,Pygame,我正在PyGame中制作一个平台成型器,这将涉及玩家必须通过的障碍。我已经设置了如何制作游戏的基本“地板”,但当涉及到实际的“盒子”或障碍物时,我很难让碰撞正常工作。代码分为4个文件,我将上传这些文件,但大部分代码都在主游戏循环文件和包含玩家类的文件中。冲突逻辑发生在player类中,在主循环中作为函数运行。我尝试了各种各样的方法使碰撞生效,但总是出了问题。我想要这样,在障碍物上跳跃将导致玩家站在障碍物上,迎面冲入障碍物,而不允许角色通过。虽然我没有站在障碍物上的逻辑,但我有一些阻止玩家穿过障碍

我正在PyGame中制作一个平台成型器,这将涉及玩家必须通过的障碍。我已经设置了如何制作游戏的基本“地板”,但当涉及到实际的“盒子”或障碍物时,我很难让碰撞正常工作。代码分为4个文件,我将上传这些文件,但大部分代码都在主游戏循环文件和包含玩家类的文件中。冲突逻辑发生在player类中,在主循环中作为函数运行。我尝试了各种各样的方法使碰撞生效,但总是出了问题。我想要这样,在障碍物上跳跃将导致玩家站在障碍物上,迎面冲入障碍物,而不允许角色通过。虽然我没有站在障碍物上的逻辑,但我有一些阻止玩家穿过障碍物的逻辑。但即便如此,还是有漏洞。例如,跑向障碍物的右侧会将我移到左侧,而此时它应该“向后推”球员,并抵消他的X水平,以防止进一步移动越过障碍物。在遇到障碍物时还有一些错误,你可以通过运行程序来发现,但是如果能帮助改进水平碰撞和发展垂直碰撞,我们将不胜感激。 主要游戏循环:

import pygame
import character as c
import levels
pygame.init()



WINWIDTH = 1200
WINHEIGHT = 700


win = pygame.display.set_mode((WINWIDTH,WINHEIGHT))
pygame.display.set_caption('Game')



all_sprites = pygame.sprite.Group()
terrainSprites = pygame.sprite.Group()
obstacleSprites = pygame.sprite.Group()
player = c.Player(win, WINWIDTH, WINHEIGHT)
all_sprites.add(player)
terrainSprites.add(levels.level1Terrain)
obstacleSprites.add(levels.level1Obstacles)

mainloop = True

clock = pygame.time.Clock()
while mainloop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainloop = False




    all_sprites.update()
    terrainSprites.update()
    obstacleSprites.update()
    player.collision(player.rect.x, player.rect.y)
    win.fill((0,0,0))
    terrainSprites.draw(win)
    obstacleSprites.draw(win)
    pygame.draw.rect(win, (255, 0, 0), obstacleSprites.sprites()[0].rect, 2)
    pygame.draw.rect(win, (255, 0, 0), player.rect, 2)  # (player.rect.x + 4, player.rect.y + 5, 43, 50)
    all_sprites.draw(win)
    pygame.display.flip()
    clock.tick(60)
pygame.quit()
包含播放器类和冲突逻辑的字符文件:

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, surface, WINWIDTH, WINHEIGHT):
        pygame.sprite.Sprite.__init__(self)
        self.framecounter = 1
        self.images = []
        self.idleframes = []
        self.surface = surface
        self.width = 40
        self.height = 60
        self.WINWIDTH = WINWIDTH
        self.WINHEIGHT = WINHEIGHT
        self.xVel = 5
        self.yVel = 5
        self.jumpActive = False
        self.jumpCounter = 12
        self.walking = False
        self.grounded = True
        #LOAD WALKCYCLE
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/1.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/2.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/3.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/4.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/5.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/6.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/7.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/8.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/9.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/10.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/11.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/12.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/13.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/14.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/15.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/16.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/17.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/18.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/19.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/20.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/21.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/22.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/23.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/24.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/25.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/26.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/27.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/28.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/29.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/30.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/31.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/32.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/33.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/34.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/35.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/36.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/37.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/38.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/39.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/40.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/41.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/42.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/43.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/44.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/45.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/46.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/47.png"))
        self.images.append(pygame.image.load("D:/PythonProjects/game/Assets/WalkCycleLeft - Copy/48.png"))

        # LOAD JUMP UP - Idx. 48
        self.images.append(pygame.image.load("D:\PythonProjects\game\Assets\Pixel Adventure 1\Free\Main Characters\Virtual Guy\Jump (32x32).png"))

        # LOAD JUMP FALL - Idx. 49
        self.images.append(pygame.image.load("D:\PythonProjects\game\Assets\Pixel Adventure 1\Free\Main Characters\Virtual Guy\Fall (32x32).png"))


        #LOAD IDLE FRAMES - Idx. >49
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/1.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/1.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/1.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/1.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/2.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/2.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/2.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/2.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/3.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/3.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/3.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/3.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/4.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/4.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/4.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/4.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/5.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/5.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/5.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/5.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/6.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/6.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/6.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/6.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/7.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/7.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/7.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/7.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/8.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/8.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/8.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/8.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/9.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/9.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/9.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/9.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/10.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/10.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/10.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/10.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/11.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/11.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/11.png"))
        self.idleframes.append(pygame.image.load("D:/PythonProjects/game/Assets/Idle/11.png"))





        self.framecounter = 1
        self.idlecounter = 1
        self.image = self.images[self.framecounter]
        self.image = pygame.transform.scale(self.image, (50,50))
        self.rect =  self.image.get_rect()
        self.rect.x = 200
        self.rect.y = 640
        self.rect.width = 50
        self.rect.height = 50
        self.facing = None

    def update(self):

        self.walking = False
        keys = pygame.key.get_pressed()

        if keys[pygame.K_a]:
            self.rect.x -= self.xVel
            self.walkcycle()
            self.facing = 'left'
            self.walking = True
        elif keys[pygame.K_d]:
            self.rect.x += self.xVel
            self.walkcycle('right')
            self.facing = 'right'
            self.walking = True
        else:
            self.walking = False

        if self.jumpActive == False and self.grounded == True:
            if keys[pygame.K_SPACE]:
                self.jumpActive = True
        else:
            if self.jumpCounter >= -12:
                self.jumpUPAnim()
                neg = 1
                if self.jumpCounter < 0:
                    self.fallAnim()
                    neg = -1
                self.rect.y -= int((self.jumpCounter ** 2) * 0.25 * neg)
                self.jumpCounter -= 1
            else:
                self.jumpCounter = 12
                self.jumpActive = False
        if self.rect.x >= (self.WINWIDTH - 40):
            self.rect.x = int(self.WINWIDTH - 40)
        elif self.rect.x <= 0:
            self.rect.x = 0
        if self.rect.y >= (self.WINHEIGHT - 55):
            self.rect.y = int(self.WINHEIGHT - 55)
            self.grounded = True
        elif self.rect.y <= 0:
            self.rect.y = 0


        self.idleAnim(self.facing)
        self.gravity()
    def walkcycle(self, facing = None):
        self.image = self.images[self.framecounter]
        self.image = pygame.transform.scale(self.image, (50,50))
        if facing == 'right':
            self.image = pygame.transform.flip(self.image, True, False)

        self.framecounter += 1
        if self.framecounter == 48:
            self.framecounter = 1
    def jumpUPAnim(self):
        self.image = self.images[48]
        self.image = pygame.transform.scale(self.image, (50,50))
        if self.facing == 'left':
            self.image = pygame.transform.flip(self.image, True, False)
    def fallAnim(self):
        self.image = self.images[49]
        self.image = pygame.transform.scale(self.image, (50,50))
        if self.facing == 'left':
            self.image = pygame.transform.flip(self.image, True, False)
    def idleAnim(self, facing):
        if self.jumpActive == False and self.walking == False:
            self.image = self.idleframes[self.idlecounter]
            self.image = pygame.transform.scale(self.image, (50,50))
            if facing == 'left':
                self.image = pygame.transform.flip(self.image, True, False)
            self.idlecounter += 1
            if self.idlecounter == 44:
                self.idlecounter = 1
    def collision(self, store_x, store_y):
        from main import terrainSprites
        from main import obstacleSprites
        old_pos = self.rect.x, self.rect.y
        for i in terrainSprites:
            if pygame.sprite.spritecollide(self, terrainSprites, False):
                if self.rect.y < i.rect.top:
                    self.rect.bottom = i.rect.top
                    return True
                else:
                    return False
        for i in obstacleSprites:

            if pygame.sprite.spritecollide(self, obstacleSprites, False):
                if self.rect.bottom < i.rect.top:
                    self.yVel = 0
            else:
                self.yVel = 5
                self.rect.y = store_y
            if pygame.sprite.spritecollide(self, obstacleSprites, False):
                if self.rect.right < i.rect.left:
                    self.xVel = 0
            else:
                self.xVel = 5
                self.rect.x = store_x
    def gravity(self):
            self.rect.y += self.yVel
导入pygame
职业玩家(pygame.sprite.sprite):
def _u初始(自、曲面、WINWIDTH、WINHEIGHT):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.framecounter=1
self.images=[]
self.idleframes=[]
self.surface=曲面
自宽=40
自身高度=60
self.WINWIDTH=WINWIDTH
self.WINHEIGHT=WINHEIGHT
self.xVel=5
self.yVel=5
self.jumpActive=False
self.jumpCounter=12
self.walking=False
self.grounded=True
#负载步行循环
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/1.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/2.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/3.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/4.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/5.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/6.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/7.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/8.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/9.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/10.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/11.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/12.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/13.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/14.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/15.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/16.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/17.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/18.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/19.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/20.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/21.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/22.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/23.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/24.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/25.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/26.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/27.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/28.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/29.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/30.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/31.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/32.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/33.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/34.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/35.png”))
self.images.append(pygame.image.load(“D:/PythonProjects/game/Assets/WalkCycleLeft-Copy/36.png”))
if firstRect.colliderect(secondRect):
    # Do stuff