我为一个角色定义了一个移动方法,但我不知道如何让它在每个移动之间暂停片刻

I define a movement method for a character, but I don't know how to itmake it pause for a moment between each move

def playermove(self,dice_status):
        self._position += dice_status
        '''i want to Add some pauses at each step so 
           it doesn't look like it flashed past'''

def playerlocate(self,screen):
    if self._position <= 19:
        screen.blit(self._image, mapCoordinate[self._position])
    elif 19 < self._position <= 30:
        screen.blit(pygame.transform.rotate(self._image,-90),mapCoordinate[self._position])
    elif 30 < self._position <= 48:
        screen.blit(pygame.transform.rotate(self._image, -180), mapCoordinate[self._position])
    elif 48 < self._position <= 54:
        screen.blit(pygame.transform.rotate(self._image, -270), mapCoordinate[self._position])
    else:
        screen.blit(pygame.transform.rotate(self._image, -270), mapCoordinate[self._position-55])
        self._position -= 55

mapCoordinate=[[1184,773],[971,873],...] #我有 55 个地图网格

#self._position是player的一个属性,对应着map.And上每个格子的序号 我还有一个函数就是把_position转换成坐标,把player画在地图。 我试图添加一些时间控制,但我不知道该怎么做 it.Please

如果你想在 Pygame 中随着时间的推移控制某些东西,你有两个选择:

  1. 使用pygame.time.get_ticks()测量时间并实现根据时间控制对象的逻辑。

    例如:

    time_interval = 500 # 500 milliseconds == 0.1 seconds
    next_step_time = 0 
    
    while run:
        # [...]
    
        current_time = pygame.time.get_ticks()
        if current_time > next_step_time :
            next_step_time += time_interval
    
            # move object
            player.playermove(dice_status)
    
  2. 使用定时器事件。在事件队列中使用 pygame.time.set_timer() to repeatedly create a USEREVENT。事件发生时更改对象状态。

    例如:

    time_interval = 500 # 500 milliseconds == 0.1 seconds
    timer_event = pygame.USEREVENT+1
    pygame.time.set_timer(timer_event, time_interval)
    
    while run:
        for event in pygame.event.get():
            if event.type == timer_event:
    
                # move object
                player.playermove(dice_status)
    

另见


最少的例子:

示例 1:

import pygame

pygame.init()
window = pygame.display.set_mode((400, 200))
clock = pygame.time.Clock()
rect = pygame.Rect(0, 80, 40, 40)

time_interval = 500 # 500 milliseconds == 0.1 seconds
next_step_time = 0 

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False 

    current_time = pygame.time.get_ticks()
    if current_time > next_step_time :
        next_step_time += time_interval
    
        rect.x += 40
        if rect.x >= 400:
            rect.x = 0

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()
    clock.tick(100)

pygame.quit()
exit()

示例 2:

import pygame

pygame.init()
window = pygame.display.set_mode((400, 200))
clock = pygame.time.Clock()
rect = pygame.Rect(0, 80, 40, 40)

time_interval = 500 # 500 milliseconds == 0.1 seconds
timer_event = pygame.USEREVENT+1
pygame.time.set_timer(timer_event, time_interval) 

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False 

        if event.type == timer_event:

            rect.x += 40
            if rect.x >= 400:
                rect.x = 0

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()
    clock.tick(100)

pygame.quit()
exit()

一种方法是在循环中保留一个计数器,并根据计数器的值更新对象的位置。这样可以有效的减慢物体的运动。

您可以通过在循环之前的开头定义一个计数器变量来做到这一点。

然后在每次迭代中更新计数器的值。

之后,在更新对象位置的地方,检查计数器的值。

例如:-

if counter > 5: #you can increase or decrease the value... here I have taken 5
   self.position += dice_status
   counter = 0

您还必须在 'if' 块中将计数器的值改回零。

如果取更大的值而不是 5,它会使对象更慢。