问题描述
我正在制作一个平台游戏并且我有碰撞工作,但是对于平台,左侧似乎有一个额外的立方体区域,玩家可以在上面行走。我似乎无法弄清楚如何删除它。下面是一些我认为是其原因的代码,但我不确定。
。我已经为平台等修剪了图像,但问题仍然存在。
background_image = pygame.image.load("JungleBackground.png")
done = False
clock = pygame.time.Clock()
black = ( 0,0)
white = ( 255,255,255)
x = 300
y = 88
class Character(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((100,100))
self.image.set_colorkey(black)
self.rect = self.image.get_rect(center=(50,300))
self.rect.x = 50
self.rect.y = 300
self.pos = vec(50,300)
self.vel = vec(0,0)
self.acc = vec(0,0)
self.image.blit(pygame.image.load("TheoHillsS.png"),(0,0))
def characterJump(self):
self.rect.y += 1
hits = pygame.sprite.spritecollide(self,platforms,False)
self.rect.y -= 1
if hits:
self.vel.y = -13
def update(self):
self.acc = vec(0,0.5)
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
self.acc.x = -PLAYER_ACC
if keys[pygame.K_d]:
self.acc.x = PLAYER_ACC
# apply friction
self.vel.x *= PLAYER_FRICTION
self.vel += self.acc
self.pos += self.vel
self.rect.midbottom = self.pos
class Platform(pygame.sprite.Sprite):
def __init__(self,x,y,w,h):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((100,88))
self.image.fill(black)
self.image = pygame.image.load("Platform1.png")
self.rect = self.image.get_rect(topleft=(x,y))
all_sprites = pygame.sprite.Group()
platforms = pygame.sprite.Group()
character = Character()
all_sprites.add(character)
p1 = Platform(-80,350,WIDTH - 400,HEIGHT - 10)
p2 = Platform(175,220,HEIGHT - 10)
p3 = Platform(500,HEIGHT - 10)
all_sprites.add(p1,p2,p3)
platforms.add(p1,p3)
# Main Game
running = True
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
character.characterJump()
all_sprites.update()
hits = pygame.sprite.spritecollide(character,False)
for platform in hits:
if character.vel.y > 0:
character.rect.bottom = platform.rect.top
character.vel.y = 0
elif character.vel.y < 0:
character.rect.top = platform.rect.bottom
character.vel.y = 3
character.pos.y = character.rect.bottom
screen.blit(background_image,[0,0])
all_sprites.draw(screen)
pygame.display.flip()
game_intro()
game_loop()
pygame.quit()
quit()
解决方法
碰撞是针对图像的边界矩形进行测试的,而不是针对图像上绘制的区域。确保平台和玩家几乎填满了 pygame.Surface
的整个区域。
不要在比播放器大得多的透明Surface上绘制播放器,而是直接使用pygame.image.load
创建的Surface:
class Character(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("TheoHillsS.png")
self.rect = self.image.get_rect(topleft = (50,300))
self.pos = vec(50,300)
self.vel = vec(0,0)
self.acc = vec(0,0)
# [...]