2013-06-20 18 views
1

我的while循環僅在光標移動到屏幕內時維護精靈的運動。我試着重新組織一些screen.blits和display.update()和display.flip()。我似乎無法弄清楚爲什麼角色會在一個像素髮生變化之後停下來,而不是像我想要的那樣繼續。只有鼠標在屏幕上移動時,角色纔會保持移動狀態?

background_image = 'Terrain_Grass_First.png' 
    import pygame, sys 
    from pygame.locals import * 
    pygame.init() 
    pygame.display.set_caption('Hans') 
    screen_width = 600 
    screen_height = 400 
    screen = pygame.display.set_mode((screen_width, screen_height),0,32) 
    pygame.mouse.set_visible(False) 
    sprite = pygame.image.load('Hans_front_still.png').convert_alpha() 
    x,y = (0,0) 
    movex, movey = (0,0) 
    while True: 
     for event in pygame.event.get(): 
       if event.type == QUIT: 
         pygame.quit() 
         sys.exit() 

       if event.type == KEYDOWN: 
         if event.key == K_ESCAPE: 
           pygame.quit() 
           sys.exit() 
         if event.key == K_w: 
           y = -1 

         elif event.key == K_a: 
           x = -1 

         elif event.key == K_s: 
           y = +1 

         elif event.key == K_d: 
           x = +1 

       elif event.type == KEYUP: 
         if event.key == K_w: 
           y = 0 

         elif event.key == K_a: 
           x = 0 

         elif event.key == K_s: 
           y = 0 

         elif event.key == K_d: 
           x = 0 
       movex += x 
       movey += y 


     screen.fill((0,0,0)) 
     screen.blit(sprite,(movex,movey)) 
     pygame.display.flip() 

回答

2

您的循環塊在pygame.event.get上。

您不會安排您自己的任何活動。

因此,除非操作系統發生事件(鼠標移動,重繪等),否則您什麼也不做。


而且,即使你固定的,你打電話movex += x每個事件一次。所以,當操作系統向你投擲大量事件時,你的精靈將會瘋狂地在屏幕上進行壓縮,但是當事件進入更慢時,它將會爬行。這幾乎從來都不是你想要的。


這兩個問題的簡單解決方法是隻安排自己的事件。例如,通過pygame.time.set_timer(),您可以確保每250毫秒獲得一個事件,並且只能將精靈移動到這些事件上。例如:

timer_event = pygame.USEREVENT + 1 
pygame.time.set_timer(timer_event, 250) 
while True: 
    for event in pygame.event.get(): 
     # ... 
     elif event.type == timer_event: 
      movex += x 
      movey += y 

另一種方法是使用固定幀率來設計你的遊戲。

一個簡單的例子是這樣的:

FRAME_TIME = 50 # 50ms = 20fps 
next_frame_time = pygame.time.get_ticks() + FRAMES 
while True: 
    while True: 
     event = pygame.event.poll() 
     if event.type == pygame.NOEVENT: 
      break 
     elif # ... 
    pygame.display.flip() 
    now = pygame.time.get_ticks() 
    if now < next_frame_time: 
     pygame.time.wait(next_frame_time - now) 
    next_frame_time += FRAMES 

現在你只需移動每5幀。

一個現實的例子有對付錯過幀,太多的事件隊列中,waitdelay適當選擇等

但我會去與事件驅動版採用了定時器,而不是在大多數情況下,固定幀速率版本,特別是如果你已經下了這條線。

相關問題