繁体   English   中英

我在使用 PyGame 中的平台游戏时遇到碰撞问题

[英]I am having trouble with getting collisions to work with my platformer in PyGame

我正在 PyGame 中制作一个平台游戏,这将涉及玩家必须通过的障碍物。 我已经设置了如何制作游戏的基础“地板”,但是当涉及到实际的“盒子”或障碍物时,我无法让碰撞正常工作。 代码分为 4 个文件,我将上传这些文件,但大部分代码位于主游戏循环文件和包含播放器本身的 class 的文件中。 碰撞逻辑发生在播放器 class 中,并在主循环中作为 function 运行。 我尝试了各种方法来使碰撞起作用,但总是出现问题。 我想要它以便跳跃障碍物会导致玩家站在障碍物上并迎头撞上障碍物不会让角色通过。 虽然我没有站在障碍物上的逻辑,但我确实有一些防止玩家跑过障碍的逻辑。 但即使这样也有错误。 例如,当它应该“向后推”玩家并否定他的 xVel 以防止进一步移动越过障碍物时,跑到障碍物的右侧会将我移到左侧。 还有一些遇到障碍的错误,您可以通过运行程序找到这些错误,但是对于改善水平碰撞和开发垂直碰撞的任何帮助将不胜感激。 主游戏循环:

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()

包含播放器 Class 和碰撞逻辑的角色文件:

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

整个项目文件夹包含所有文件,包括包含用于生成地形的 class 的地形文件、包含用于生成障碍物的 class 的障碍物文件以及使用障碍物和地形类构建关卡的关卡文件。 该项目还包括资产: https://drive.google.com/drive/folders/13XirZjMSAB_p3TJFFDFYtRG-oIE0XjAz?usp=sharing

PyGame 使我们可以很容易地检查一个 object 与另一个的碰撞,根据我的理解,你想知道一个东西是否与另一个碰撞,如果是这样的话,我有一个很好的答案,下面的代码我将使用firstRect就像你想检查的与secondRect相撞的任何东西

if firstRect.colliderect(secondRect):
    # Do stuff

我真的希望这是您想要的,如果不是,您可以告诉我,我会尽力给出更好的答案

快乐编码 - BSK - SK Studio

暂无
暂无

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

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