2017-10-12 83 views
1

可以说我有班卡车。这个班级有很多例子,在到达特定点的实例应该“卸载”它的货物时 - 只需要移动N秒,而其他卡车应该继续移动,除非他们到达卸载点。如何设置在pygame中等待物体而不冻结其他物体

我通过将运动矢量设置为(0,0)然后将其重置为原始值来完成停止部分。

但如何等待N秒而不冻结其他车?从我迄今发现的情况来看,我认为我需要以某种方式应用pygame.time.set_timer,但这对我来说确实令人困惑。

+1

这真的取决于你的代码是如何。通常在pygame中,你有一个带有更新方法的sprite类,它可以在帧之间的时间内正确地更新。如果每个卡车实例都有一个计时器,那么您应该能够使用每个实例计时器来控制它等待的时间,而不会影响其他卡车。也许你应该包括你的卡车类,以及你目前如何更新它们? –

+0

你也可以使用'pygame.time.get_ticks'或clock.tick返回的时间差('dt = clock.tick(fps)')来实现一个计时器(https://stackoverflow.com/questions/) 30720665 /倒计时定时器功能于pygame的)。我希望看到你的代码([mcve])(https://stackoverflow.com/help/mcve)),并请更准确地描述你想实现的目标。 – skrx

+0

@skrx其实,用'get_ticks()'解决。如果你想 - 发表你的评论作为答案,所以我可以接受它 – wasd

回答

0

东西沿着这些路线应该工作:停止卡车时达到目标(truck.vel = Vector2(0, 0)),然后设置其waiting_timestart_time属性(我只是做它在__init__方法在这里)。

import pygame as pg 
from pygame.math import Vector2 


class Truck(pg.sprite.Sprite): 

    def __init__(self, pos, waiting_time, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((50, 30)) 
     self.image.fill(pg.Color('steelblue2')) 
     self.rect = self.image.get_rect(center=pos) 
     self.vel = Vector2(0, 0) 
     self.pos = Vector2(pos) 
     self.waiting_time = waiting_time # In seconds. 
     self.start_time = pg.time.get_ticks() 

    def update(self): 
     current_time = pg.time.get_ticks() 
     # * 1000 to convert to milliseconds. 
     if current_time - self.start_time >= self.waiting_time*1000: 
      # If the time is up, start moving again. 
      self.vel = Vector2(1, 0) 

     self.pos += self.vel 
     self.rect.center = self.pos 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    truck = Truck((70, 70), 4, all_sprites) 
    truck2 = Truck((70, 300), 2, all_sprites) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 

     all_sprites.update() 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 

这里的dt版本:

import pygame as pg 
from pygame.math import Vector2 


class Truck(pg.sprite.Sprite): 

    def __init__(self, pos, waiting_time, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((50, 30)) 
     self.image.fill(pg.Color('steelblue2')) 
     self.rect = self.image.get_rect(center=pos) 
     self.vel = Vector2(0, 0) 
     self.pos = Vector2(pos) 
     self.waiting_time = waiting_time 

    def update(self, dt): 
     self.waiting_time -= dt 
     if self.waiting_time <= 0: 
      self.vel = Vector2(1, 0) 

     self.pos += self.vel 
     self.rect.center = self.pos 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    truck = Truck((70, 70), 4, all_sprites) 
    truck2 = Truck((70, 300), 2, all_sprites) 

    done = False 

    while not done: 
     dt = clock.tick(30)/1000 

     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 

     all_sprites.update(dt) 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit()