python(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)

任何答案都将不胜感激。

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

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"
...



最新更新