How to make your sprite jump in pygame

跟風遠走 提交于 2021-01-28 03:32:19

问题


Currently i have made a platform game and can move my character left and right. He starts on the ground. Any ideas on how to make him jump because i can't figure it out? At the moment my player sprite will just continuously move up if i hold down the up key or just move up and stay up if i press it. I wanted a way from him to fall back down.

Thanks

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

回答1:


I have never used pygame, but in general you must implement a simple physics integration loop that periodically decrements gravity from the vertical velocity and brings the object down:

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

If you update at 60 Hz then timeStep would be 1/60 s.

The jump button would set vspeed to the initial jump velocity and do nothing else:

vspeed = jumpSpeed



回答2:


Change this:

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

So that after your rect moves up that it is forced to moved down. For more of a realistic jump, try adding a little curve if needed. If a jump is straight up and down, the following should work:

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


来源:https://stackoverflow.com/questions/34777962/how-to-make-your-sprite-jump-in-pygame

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!