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