python中动画速度问题(pygame)

时间:2021-06-11 11:08:57

标签: python animation pygame

我正在制作一个忍者游戏,其中忍者必须通过跳跃(按空格键)来躲避障碍物,但是跳跃动画太快,忍者无法跳过障碍物。 我希望它跳得慢一点,让它越过障碍物,即使按下然后松开键,也能一直跳到394 y值。

请注意,我是初学者。

import pygame,time,random #import    
pygame.init() #pygame initialization

screen = pygame.display.set_mode((0,0))
pygame.quit()
pygame.init()

clock = pygame.time.Clock()

canvas = pygame.display.set_mode((1000,780)) #creating screen
caption = pygame.display.set_caption("Ninja Run") #creating caption

iconImage = pygame.image.load("C:/Garv/python/pygame/Ninja Game/Ninja_logo.png")
icon = pygame.display.set_icon(iconImage) #drawing icon image

land = pygame.image.load("C:/Garv/python/pygame/Ninja Game/land.jfif") #land image
sky = pygame.image.load("C:/Garv/python/pygame/Ninja Game/sky.jfif") # sky image

x = 50
y = 594

start = time.time()
ninjaRun = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 1.jpg"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 2.jpg")] #ninja images
ninjaImage = ninjaRun[0]
ninjaState = "Run"

ninjaStars = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star 2.png"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star.png")]
tyre = pygame.image.load("C:/Garv/python/pygame/Ninja Game/tyre.png")
rock = pygame.image.load("C:/Garv/python/pygame/Ninja Game/stone.png")
acid = pygame.image.load("C:/Garv/python/pygame/Ninja Game/acid.png")

rockX = 1000
rockY = 625

starX1 = 1050
starY1 = 580

starX2 = 1000
starY2 = 650

tyreX = 1000
tyreY = 590

acidX = 1000
acidY = 718

class obstacles: # obstacle class
    def __init__(self,stars,tyre,rock,canvas,rockX,rockY,starX1,starX2,starY1,starY2,tyreX,tyreY,acid,acidX,acidY):
        self.stars = stars
        self.tyre = tyre
        self.rock = rock
        self.canvas = canvas
        self.rockX = rockX
        self.rockY = rockY
        self.starX1 = starX1
        self.starX2 = starX2
        self.starY1 = starY1
        self.starY2 = starY2
        self.tyreX = tyreX
        self.tyreY = tyreY
        self.acid = acid
        self.acidX = acidX
        self.acidY = acidY
    def choose(self):
        self.rand = random.randint(1, 4)
    def rockImage(self): # drawing rock
        self.canvas.blit(self.rock, (self.rockX,self.rockY))
        if self.rockX == -161:
            self.choose()
            self.rockX = 1000
        elif self.rockX != -161:
            self.rockX -= 1
        
    def starsImage(self): # drawing ninjaStar
        self.canvas.blit(self.stars[0], (self.starX1,self.starY1))
        self.canvas.blit(self.stars[1], (self.starX2,self.starY2))
        if self.starX1 == -50 and self.starX2 == -100:
            self.choose()
            self.starX1 = 1050
            self.starX2 = 1000
        elif self.starX1 != -50 and self.starX2 != -100:
            self.starX1 -= 1
            self.starX2 -= 1
    def tyreImage(self): # drawing tyre
        self.canvas.blit(self.tyre, (self.tyreX,self.tyreY))
        if self.tyreX == -120:
            self.choose()
            self.tyreX = 1000
        elif self.tyreX != -120:
            self.tyreX -= 1
    def acidImage(self):# drawing acid
        self.canvas.blit(self.acid,(self.acidX,self.acidY))
        if self.acidX == -144:
            self.choose()
            self.acidX = 1000
        elif self.acidX != -144:
            self.acidX -= 1

tim = 10
class Ninja: # ninja class
    def __init__(self,canvas,start,run,image,x,y,time,ninjaState): #Initializing of variables
        self.canvas = canvas
        self.start = start
        self.run = run
        self.image = image
        self.x = x
        self.y = y
        self.time = time
        self.ninjaState = ninjaState
    def ninja(self): #ninja movement method
        self.image = ninjaRun[0]
        self.sec = int((time.time()-self.start)*self.time)
        if self.sec % 2 != 0:
            self.image = ninjaRun[0]
            if ninjaState == "Jump":
                self.image = pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja jumping.jpg")
            elif ninjaState == "Run":
                self.image = ninjaRun[0]
        elif self.sec % 2 == 0:
            self.image = ninjaRun[1]
            if ninjaState == "Jump":    
                self.image = pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja jumping.jpg")
            elif ninjaState == "Run":
                self.image = ninjaRun[1]
            
        self.canvas.blit(self.image, (self.x,self.y)) #ninja draw
        
player = Ninja(canvas,start,ninjaRun,ninjaRun[0],x,y,tim,ninjaState) #calling Ninja class
obstacle = obstacles(ninjaStars,tyre,rock,canvas,rockX,rockY,starX1,starX2,starY1,starY2,tyreX,tyreY,acid,acidX,acidY)#calling obstacle class

obstacle.choose()

def decide(): # calling draw functions
    if obstacle.rand == 1:
        obstacle.rockImage()
    elif obstacle.rand == 2:
        obstacle.starsImage()
    elif obstacle.rand == 3:
        obstacle.tyreImage()
    else:
        obstacle.acidImage()
while True: #main loop
    if player.y == y:
        ninjaState = "Run"
    elif player.y < y:
        ninjaState = "Jump"
    for event in pygame.event.get(): #event handler
        if event.type == pygame.QUIT: #quit handler
            pygame.quit()
            import sys
            sys.exit()
        if event.type == pygame.KEYDOWN: #keydown
            if event.key == pygame.K_SPACE:
                ninjaDirect = "up"
                player.y -= 100
                if player.y < 100:
                    player.y += 100
                    ninjaDirect = "down"
        if event.type == pygame.KEYUP: #keyup
            if event.key == pygame.K_SPACE:
                player.y += 100
    canvas.blit(sky, (0,0))#sky drawing
    canvas.blit(land, (0,718))#land drawing
    decide() # obstacle drawing
    player.ninja() #ninja drawing
    pygame.display.update() #display update
    clock.tick(60)

任何答案将不胜感激。

1 个答案:

答案 0 :(得分:1)

可能的解决方案, 添加变量:

speedJump = 2 # play with this value, try to decrease and increase
ninjaDirect = None

在主循环中:

while True:  # main loop
  if ninjaDirect == "down":
    if player + 100 >= y:
      # we in middle of jump
      player.y += speedJump
    else: # we finish the jump
      ninjaDirect = None
      player.y = y
  ...
  for event in pygame.event.get():
  ...
    if event.type == pygame.KEYDOWN: #keydown
      if event.key == pygame.K_SPACE:
        if player.y > 100:
          ninjaDirect = "up"
          player.y -= speedJump
      else: ninjaDirect = "down"
    if event.type == pygame.KEYUP: #keyup
      if event.key == pygame.K_SPACE:
        ninjaDirect = "down"
  ...