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

问题描述 投票:0回答:2
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是玩家的一个属性,它对应地图上每个格子的序号。而且我还有一个函数将_position转换为坐标并在地图上绘制玩家。 我尝试添加一些时间控制,但我不知道该怎么做。拜托

python pygame
2个回答
2
投票

如果你想在 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()
    在事件队列中重复创建
    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)
    

另请参阅 在 python 中同时生成同一对象的多个实例


示例 1:最小示例:PYGBAG 演示

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:最小示例:PYGBAG 演示

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

0
投票

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

您可以通过在循环之前的开头定义一个计数器变量来完成此操作。

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

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

例如:-

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.