2013-03-18 10 views
1

我一直在玩pygame一段時間,一個stackoverflow老手給了我一些幫助,以更好地改善我的代碼,在屏幕上移動一個字符。此時每按一次鍵,角色都會移動,減速然後停止,再次按鍵時繼續移動。任何人都可以提供幫助,使得角色在釋放鑰匙時減速並停止。pygame移動一個用戶控制的對象,直到密鑰被釋放?

感謝您了

import sys 
import pygame 
import os 
from pygame.locals import * 

character = "toon.png" 
bg = "bg.jpg" 

delta = { 
    pygame.K_LEFT: (-10, 0), 
    pygame.K_RIGHT: (+10, 0), 
    pygame.K_UP: (0, -10), 
    pygame.K_DOWN: (0, +10), 
    } 

class Toon(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(character) 
     self.bg = pygame.image.load(bg) 
     self.rect = self.image.get_rect() 
     self.speed = [2, 2] 
     self.area = pygame.display.get_surface().get_rect() 
    def update(self): 
     self.rect = self.rect.move(self.speed) 
     if self.rect.left < 0 or self.rect.right > self.area.width: 
      self.speed[0] = -self.speed[0] 
     if self.rect.top < 0 or self.rect.bottom > self.area.height: 
      self.speed[1] = -self.speed[1] 

class Main(object): 
    def __init__(self): 
     self.setup() 
    def setup(self): 
     pygame.init() 
     size = (self.width, self.height) = (640,360) 
     self.black = (0, 0, 0) 
     self.bg = pygame.image.load(bg) 
     self.screen = pygame.display.set_mode(size, 0, 32) 
     self.toon = Toon() 
     self.setup_background() 
    def setup_background(self): 
     self.background = pygame.Surface(self.screen.get_size()) 
     self.background = self.background.convert() 
     self.screen.blit(self.bg, (0, 0)) 
     pygame.display.flip() 
    def draw(self): 
     self.screen.blit(self.bg, (0, 0)) 
     self.screen.blit(self.toon.image, self.toon.rect) 
     pygame.display.flip() 
    def event_loop(self): 
     toon = self.toon 
     while True: 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        pygame.quit() 
        sys.exit() 
       elif event.type == pygame.KEYDOWN: 
        deltax, deltay = delta.get(event.key, (0, 0)) 
        toon.speed[0] += deltax 
        toon.speed[1] += deltay 
      toon.speed[0] *= 0.95 
      toon.speed[1] *= 0.95 
      toon.update() 
      self.draw() 
      pygame.time.delay(10) 

if __name__ == '__main__': 
    app = Main() 
    app.event_loop() 
+1

簡單 - 你需要跟蹤你想保持朝着哪個方向的當按下一個鍵,設定方向。如果所有鍵都釋放,但方向仍然顯示,則在該方向上減速。如果您的速度爲0或非常接近0,請取消方向 - 現在您將停下來。 – Patashu 2013-03-18 03:33:05

回答

3

我只想改變你Main.event_loop()和其他功能添加到您的主類,它使用pygame.key.get_pressed

def event_loop(self): 
    toon = self.toon 
    while True: 
     self.event_handle() 
     toon.speed[0] *= 0.95 
     toon.speed[1] *= 0.95 
     toon.update() 
     self.draw() 
     pygame.time.delay(10) 

def event_handle(self): 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    # This will allow diagonal movements.. 
    key = pygame.key.get_pressed() 
    if key[pygame.K_LEFT]: 
     self.toon.speed[0] = -10 
    if key[pygame.K_RIGHT]: 
     self.toon.speed[0] = +10 
    if key[pygame.K_UP]: 
     self.toon.speed[1] = -10 
    if key[pygame.K_DOWN]: 
     self.toon.speed[1] = +10 

的變化:

  1. 我添加了一個新功能,即event_handle,它將處理事件d鍵。
  2. 你會注意到for事件循環沒有做任何的鍵處理。那是因爲我們使用的是pygame.key.get_pressed,它更適合當前的工作。
    • 它返回當前按鍵的bools列表。我們通過索引key來檢查我們想要的鍵(這裏是箭頭)。

的影響:
你的問題就解決了。

1

充分利用friction = 1KEYDOWNfriction < 1KEYUP

  elif event.type == pygame.KEYDOWN: 
       deltax, deltay = delta.get(event.key, (0, 0)) 
       toon.speed[0] += deltax 
       toon.speed[1] += deltay 
       friction = 1 
      elif event.type == pygame.KEYUP: 
       friction = 0.95 
     toon.speed = [x*friction for x in toon.speed] 

import sys 
import pygame 
import os 
from pygame.locals import * 

character = "toon.png" 
bg = "bg.jpg" 

delta = { 
    pygame.K_LEFT: (-10, 0), 
    pygame.K_RIGHT: (+10, 0), 
    pygame.K_UP: (0, -10), 
    pygame.K_DOWN: (0, +10), 
    } 

class Toon(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(character) 
     self.bg = pygame.image.load(bg) 
     self.rect = self.image.get_rect() 
     self.speed = [0, 0] 
     self.area = pygame.display.get_surface().get_rect() 
    def update(self): 
     self.rect = self.rect.move(self.speed) 
     if self.rect.left < 0 or self.rect.right > self.area.width: 
      self.speed[0] = -self.speed[0] 
     if self.rect.top < 0 or self.rect.bottom > self.area.height: 
      self.speed[1] = -self.speed[1] 

class Main(object): 
    def __init__(self): 
     self.setup() 
    def setup(self): 
     pygame.init() 
     size = (self.width, self.height) = (640,360) 
     self.black = (0, 0, 0) 
     self.bg = pygame.image.load(bg) 
     self.screen = pygame.display.set_mode(size, 0, 32) 
     self.toon = Toon() 
     self.setup_background() 
    def setup_background(self): 
     self.background = pygame.Surface(self.screen.get_size()) 
     self.background = self.background.convert() 
     self.screen.blit(self.bg, (0, 0)) 
     pygame.display.flip() 
    def draw(self): 
     self.screen.blit(self.bg, (0, 0)) 
     self.screen.blit(self.toon.image, self.toon.rect) 
     pygame.display.flip() 
    def event_loop(self): 
     toon = self.toon 
     friction = 1   
     while True: 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        pygame.quit() 
        sys.exit() 
       elif event.type == pygame.KEYDOWN: 
        deltax, deltay = delta.get(event.key, (0, 0)) 
        toon.speed[0] += deltax 
        toon.speed[1] += deltay 
        friction = 1 
       elif event.type == pygame.KEYUP: 
        friction = 0.95 
      toon.speed = [x*friction for x in toon.speed] 
      toon.update() 
      self.draw() 
      pygame.time.delay(10) 

if __name__ == '__main__': 
    app = Main() 
    app.event_loop() 
+1

絕對美麗的謝謝你們,非常友善。在我沒有學習的時候,我一直試圖在閒暇時間裏解決這個問題,並且在我的腦海中摸索了一下。對你們兩個的榮譽<3 – 2013-03-18 04:29:00