Python 如何让你的精灵在pygame中跳跃

Python 如何让你的精灵在pygame中跳跃,python,pygame,Python,Pygame,目前我已经做了一个平台游戏,可以左右移动我的角色。他从地上开始。有没有办法让他跳下去,因为我搞不懂?此时,如果我按下向上键,我的播放器精灵将持续向上移动,或者如果我按下它,它将继续向上移动并保持向上。我想从他那里得到一条退路 谢谢 class Player(pygame.sprite.Sprite): def __init__(self,x,y,width = 65, height = 35): pygame.sprite.Sprite.__init__(self) self.x

目前我已经做了一个平台游戏,可以左右移动我的角色。他从地上开始。有没有办法让他跳下去,因为我搞不懂?此时,如果我按下向上键,我的播放器精灵将持续向上移动,或者如果我按下它,它将继续向上移动并保持向上。我想从他那里得到一条退路

谢谢

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
职业玩家(pygame.sprite.sprite):
定义初始值(self,x,y,宽度=65,高度=35):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
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)
自重=0.5
self.index=0
self.image=self.images[self.index]
self.rect=pygame.rect(self.x、self.y、宽度、高度)
self.TimeNum=0
self.TimeTarget=10
自动定时器=0
self.OnGround=True
self.trapcollision=False
self.enemycollision=False
def更新(self、BlockListGrass、TrapList、enemygroup):
key=pygame.key.get_pressed()
如果键[pygame.K_RIGHT]或键[pygame.K_LEFT]:
self.TimeNum+=1
如果self.TimeNum==self.TimeTarget:
自索引+=1
如果self.index>=len(self.images):
self.index=0
self.image=self.images[self.index]
self.TimeNum=0
PlatformCollion=pygame.sprite.spritecollide(self,BlockListGrass,False)
对于平台碰撞中的每个_对象:
如果self.vspeed>0:
self.rect.bottom=每个_object.rect.top
如果self.vspeed<0:
self.rect.top=每个_object.rect.bottom
TrapCollision=pygame.sprite.spritecollide(self、TrapList、False)
对于TrapCollision中的每个_对象:
self.trapcollision=True
如果self.trapcollision:
self.dead()
EnemyCollision=pygame.sprite.spritecollide(self、enemygroup、False)
对于Enemoclision中的每个_对象:
self.enemycollision=True
如果发生自碰撞:
self.dead()
def死亡(自我):
自动定时器+=1
如果自拍定时器>=10:
self.images.append(self.hurt)
self.image=self.images[4]
self.hspeed=0
如果self.Timer==50:
GameOver()
def移动(自我):
key=pygame.key.get_pressed()
如果键[pygame.K_左]:
自校正移动ip(-self.hspeed,0)
如果键[pygame.K_RIGHT]:
self.rect.move_ip(self.hspeed,0)
如果键[pygame.K_UP]:
self.vspeed=5
self.rect.y-=self.vspeed
self.OnGround=False
如果self.OnGround==False:
self.vspeed+=self.gravity

我从未使用过pygame,但一般来说,您必须实现一个简单的物理积分循环,该循环周期性地降低垂直速度的重力,并使物体下降:

vspeed = vspeed - gravity * timeStep
y = y + vspeed * timeStep
如果以60赫兹更新,则时间步长为1/60秒

“跳跃”按钮将vspeed设置为初始跳跃速度,不执行其他操作:

vspeed = jumpSpeed
更改此项:

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
if键[pygame.K_UP]:
对于范围(20)内的i:#延迟下降,因为循环非常快
如果我是10:
自校正y+=0.5

在我的代码中是否有你可以给出的例子,因为我已经尝试过了,但它仍然没有移动。我感谢你的帮助,但如果我这样做,我的播放器会立即向下移动,甚至不会跳起来。我上面的代码错了吗?