【问题标题】:Sprite jumping way too high精灵跳得太高
【发布时间】:2016-05-29 04:14:48
【问题描述】:

之前,我们修复了代码的滞后,而在此之前,游戏使精灵滞后。我们修复了这个问题,但是这一次它一直让精灵飞得太高并且离开屏幕没有回来......我们可以做些什么来让精灵(罂粟)不会跳得那么高?

import pygame, sys
from pygame.locals import *
pygame.init()

class Poppy(pygame.sprite.Sprite):
   def __init__(self): #making the player
       pygame.sprite.Sprite.__init__(self)
       self.image = pygame.image.load('POPPY.png')
       self.rect = self.image.get_rect()
       self.grav = .5
       self.y_vel = 5
       self.jumping = False

   def jump_update(self): #checking the jumps
       if self.jumping:
           self.y_vel += self.grav
           self.rect.y += self.y_vel

   def jump(self): #the jump initializer
       if not self.jumping:
           self.y_vel = -50
           self.jumping = True

   def keys(self): #the keys
       key = pygame.key.get_pressed()
       dist = 5
       if key[pygame.K_RIGHT]: # right key
           self.rect.x += dist # move right
       elif key[pygame.K_LEFT]: # left key
           self.rect.x -= dist

   def collide_check(self, platform_list): #check if it hit the ground or the platforms
       for blocks in platform_list:
           if pygame.sprite.collide_rect(self, blocks) == True:
               self.rect.y = blocks.top

       if self.rect.y >= 600-self.rect.height:              # BALL HITS TOP AND BOTTOM
           self.y_vel = 0
           self.rect.y = 600 - self.rect.height
           self.jumping = False

   def move(self):
       self.rect.y += self.y_vel

   def draw(self, surface):
       surface.blit(self.image, (self.rect.x, self.rect.y))

class Platform(pygame.sprite.Sprite):
   def __init__(self):
       pygame.sprite.Sprite.__init__(self)
       self.image = pygame.image.load('levoneplatform.png')
       self.rect = self.image.get_rect()

class Enemy(pygame.sprite.Sprite):

 def __init__(self):
     pygame.sprite.Sprite.__init__(self)
     self.image = pygame.image.load('enemy.png')
     self.rect = self.image.get_rect()


class Menu():
   def __init__(self):
       self.background_image = pygame.image.load('menu.png').convert_alpha()

   def update(self):
       screen.blit(self.background_image, [0,0])


class LevOne():
   def __init__(self):

       self.background_image = pygame.image.load('night.png').convert_alpha()


       platforms_one = [ (200,300),
                       (50,500),
                       (550,650),
                       (300,200),
                       (120,100)
                  ]
       for k,v in platforms_one:
           platform = Platform()
           enemy = Enemy()
           platform.rect.x = k
           enemy.rect.x = k
           platform.rect.y = v
           enemy.rect.y = v - 44
           platform_list.add(platform)
           enemy_list.add(enemy)

   def update(self):
        screen.blit(self.background_image, [0, 0])

class LevTwo():
   def __init__(self):

       self.background_image = pygame.image.load('night.png').convert_alpha()

       platforms_two = platforms_two = [ (300,400),
                       (500,500),
                       (100,300),
                       (300,100),
                  ]

       for k,v in platforms_two:
           platform = Platform()
           enemy = Enemy()
           platform.rect.x = k
           enemy.rect.x = k
           platform.rect.y = v
           enemy.rect.y = v - 44
           platform_list.add(platform)
           enemy_list.add(enemy)

   def update(self):
       screen.blit(self.background_image, [0,0])


screen = pygame.display.set_mode((800,600))
enemy_list = pygame.sprite.Group()
platform_list = pygame.sprite.Group()
Poppy = Poppy()
Menu = Menu()
LevOne = LevOne()


clock = pygame.time.Clock()
level = 1

while True:
  clock.tick(60)

  for event in pygame.event.get():
      if event.type == QUIT:
          pygame.quit()
          sys.exit()
      elif event.type == KEYDOWN:
          if event.key == K_SPACE:
              Poppy.jump()

  Menu.update()
  if event.type == MOUSEBUTTONDOWN:
       x,y = pygame.mouse.get_pos()
       if x >= 544.86 and x <= 700.86 and y <= 385.02 and y >= 340.03:
           level = 1

  if level == 1:


      Poppy.keys()
      Poppy.move()

      LevOne.update()


      Poppy.draw(screen)
      platform_list.draw(screen)
      enemy_list.draw(screen)

      pygame.display.update()

  if level == 2:

      second_lives = 3

      LevTwo.update()
      Poppy.keys()
      Poppy.move()

      platform_list.draw(screen)
      enemy_list.draw(screen)
      Poppy.draw(screen)

  pygame.display.update()

【问题讨论】:

    标签: python pygame sprite platform


    【解决方案1】:

    您已将重力设置为 0.5 单位/秒^2,但以 -50 单位/秒的速度跳跃;角色再次开始坠落需要将近两分钟!

    要么增加重力,要么将跳跃的速度降低到-3。

    编辑:

    在您的 move()update() 函数中的某处调用此函数:

    def jump_update(self): #checking the jumps
       if self.jumping:
           self.y_vel += self.grav
           self.rect.y += self.y_vel
    

    现在它没有被使用。

    【讨论】:

    • 谢谢,但它一直在上升,不会停止。我能做什么?
    • @Angela 我查看了您的代码,发现有一些错误。我编辑了我的答案以包括其中之一。不要忘记确保正确检查碰撞;我无法让玩家登陆平台。您可能还想在self.y_vel &gt; 12 时停止添加重力,以防止下落变得太快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多