2013-03-18 11 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