问题
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