我正尝试在游戏中添加一个碰撞,以便一旦玩家与梯子碰撞,并且y轴的速度(由重力控制)大于0(表示正在使用重力)。但是我遇到的问题是,一旦我尝试使用梯子,碰撞似乎就不会发生,如果有时发生,重力就会阻碍并向下拉。另一个问题是我不知道要在哪里添加碰撞来检查玩家是否不再与梯子碰撞,这意味着您在一个平台上。
我试图通过将控制台打印为True(如果正在发生)来检查冲突,但这似乎仅在我位于梯子左侧时才起作用。
class Ladder(pygame.sprite.Sprite):
def __init__(self, x, y, pic):
self.xpos = x
self.ypos = y
super().__init__()
self.picture = pic
self.picture = pygame.transform.scale(self.picture, (50, 440))
self.rect = self.picture.get_rect()
class Player:
def __init__(self, x, y, pic_one):
self.xpos = x
self.ypos = y
self.speed_y = 0
self.speed_x = 0
self.GRAVITY = 0.9
self.picture = pic_one
self.permission_to_jump = True
self.on_ground = True
self.picture = pygame.transform.scale(self.picture, (100, 100))
self.rect = self.picture.get_rect()
self.rect.x = self.xpos
self.rect.y = self.ypos
def update(self):
if self.on_ground == False:
if self.picture == self.picture_one:
self.GRAVITY = 0.9
self.xpos += self.speed_x
self.ypos += self.speed_y
self.speed_y += self.GRAVITY # Accelerate downwards.
self.rect.x = self.xpos
self.rect.y = self.ypos
if self.ypos >= 620:
self.ypos = 620
self.speed_y = 0
self.on_ground = True
if self.on_ground == True:
self.speed_y = 0
self.xpos += self.speed_x
self.ypos += self.speed_y
def jump(self):
if self.permission_to_jump == True:
if self.on_ground:
#pygame.mixer.Channel(1).play(pygame.mixer.Sound("C:/sounds/Jump Sound Effect.wav"))
self.on_ground = False
self.speed_y = -25#Makes you move upwards
def draw(self):
screen.blit(self.picture, (self.xpos, self.ypos))
def is_collided_with(self, sprite):
return self.rect.colliderect(sprite.rect)
player_one = Player(400, 200, player_one_first_pic)
ladder = Ladder(120, 130, ladder_picture)
while True:
[...]
if joystick.get_button(0) and player_one.is_collided_with(ladder) and player_one.speed_y >= 0:
player_one.on_ground = False
player_one.speed_y = -4
player_one.update()
player_one.draw()
结果是,玩家的重力停止了爬梯的工作,并且玩家在碰到梯子的左侧时只能略微爬梯,而玩家甚至不能爬梯子
答案 0 :(得分:1)
从代码中可以看到,只要角色不在地面上,就可以添加重力。正确但不完整。
例如,当您在梯子上时,您应该添加更多的检查并避免增加重力。
这里仅是一个示例,可以给您带来想法,而不是对代码进行有效的更新。
def update(self):
if self.on_ground == False:
if self.picture == self.picture_one:
self.GRAVITY = 0.9
self.xpos += self.speed_x
self.ypos += self.speed_y
if not self.on_ladder:
self.speed_y += self.GRAVITY # Accelerate downwards.
self.rect.x = self.xpos
self.rect.y = self.ypos
因此,您可以在播放器主循环中添加on_ladder
属性,并将其从True
切换为False
。
player_one.on_ladder = player_one.is_collided_with(ladder)
当播放器位于浮动平台上时,也应进行类似的推理。