我为一个角色定义了一个移动方法,但我不知道如何让它在每个移动之间暂停片刻
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 中随着时间的推移控制某些东西,你有两个选择:
使用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)
使用定时器事件。在事件队列中使用 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,它会使对象更慢。
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 中随着时间的推移控制某些东西,你有两个选择:
使用
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)
使用定时器事件。在事件队列中使用
pygame.time.set_timer()
to repeatedly create aUSEREVENT
。事件发生时更改对象状态。例如:
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,它会使对象更慢。