如何让你的精灵跳转到pygame

时间:2016-01-13 22:04:19

标签: python pygame

目前我已经制作了一款平台游戏,可以左右移动我的角色。他从地面开始。关于如何让他跳起来的任何想法,因为我无法弄明白?目前,如果我按下向上键,我的玩家精灵将继续向上移动,或者如果按下它,只需向上移动并保持向上。我想让他退缩一步。

由于

class Player(pygame.sprite.Sprite):
def __init__(self,x,y,width = 65, height = 35):
    pygame.sprite.Sprite.__init__(self)
    self.x = x
    self.y = y
    self.hspeed = 2
    self.vspeed = 0

    self.images=[]
    r0 = pygame.image.load("Images\Player\i1.png")
    r1 = pygame.image.load("Images\Player\i2.png")
    r2 = pygame.image.load("Images\Player\i3.png")
    r3 = pygame.image.load("Images\Player\i4.png")
    self.hurt = pygame.image.load("Images\Player\Hurt.png")
    self.images.append(r0)
    self.images.append(r1)
    self.images.append(r2)
    self.images.append(r3)

    self.gravity = 0.5
    self.index = 0
    self.image = self.images[self.index]
    self.rect = pygame.Rect(self.x,self.y,width,height)

    self.TimeNum=0
    self.TimeTarget=10
    self.Timer = 0
    self.OnGround = True
    self.trapcollision = False
    self.enemycollision = False

def update(self, BlockListGrass, TrapList, enemygroup):

    key = pygame.key.get_pressed()

    if key[pygame.K_RIGHT] or key[pygame.K_LEFT]:
        self.TimeNum+=1
        if self.TimeNum == self.TimeTarget:
            self.index +=1
            if self.index >= len(self.images):
                self.index = 0
            self.image = self.images[self.index]

            self.TimeNum = 0

    PlatformCollision = pygame.sprite.spritecollide(self, BlockListGrass, False )
    for each_object in PlatformCollision:
        if self.vspeed > 0:
            self.rect.bottom = each_object.rect.top
        if self.vspeed < 0:
            self.rect.top = each_object.rect.bottom

    TrapCollision = pygame.sprite.spritecollide(self,TrapList,False )
    for each_object in TrapCollision:
        self.trapcollision = True
        if self.trapcollision:
            self.dead()

    EnemyCollision = pygame.sprite.spritecollide(self,enemygroup,False )
    for each_object in EnemyCollision:
        self.enemycollision = True
        if self.enemycollision:
            self.dead()

def dead(self):
    self.Timer += 1
    if self.Timer >= 10:
        self.images.append(self.hurt)
        self.image = self.images[4]
        self.hspeed = 0
    if self.Timer == 50:
        GameOver()

def move(self):

    key = pygame.key.get_pressed()

    if key[pygame.K_LEFT]:
       self.rect.move_ip(-self.hspeed,0)

    if key[pygame.K_RIGHT]:
       self.rect.move_ip(self.hspeed,0)

    if key[pygame.K_UP]:
       self.vspeed = 5
       self.rect.y -= self.vspeed
       self.OnGround = False

       if self.OnGround == False:
           self.vspeed += self.gravity

2 个答案:

答案 0 :(得分:0)

我从未使用过pygame,但一般来说你必须实现一个简单的物理集成循环,它会从垂直速度周期性地递减重力并使对象失效:

vspeed = vspeed - gravity * timeStep
y = y + vspeed * timeStep

如果以60 Hz更新,则timeStep为1/60秒。

跳转按钮会将vspeed设置为初始跳跃速度,不执行任何操作:

vspeed = jumpSpeed

答案 1 :(得分:0)

改变这个:

if key[pygame.K_UP]:
   self.vspeed = 5
   self.rect.y -= self.vspeed

因此,在rect向上移动后,它被迫向下移动。如果需要更多的实际跳转,请尝试添加一条小曲线。如果跳跃是直接向上和向下,则以下情况应该起作用:

if key[pygame.K_UP]:
   for i in range(20):             #Delay the falling down as loops are very fast
       if i <= 10:
           self.rect.y -= 0.5
       elif i > 10:
           self.rect.y += 0.5