2013-03-17 63 views
0

在pygame中制作一个简单的游戏。为我的charactater导入了一张图片,并可以自由移动。我想知道如何让人物慢慢停下来;pygame使用KEYUP减慢对象?

event.type == KEYUP:

中,当我松开键的字符将说,从按键已被释放到角色慢慢停止50个像素。

我已经尝试了几个不同的东西,但似乎没有任何工作。下面是我的代码。任何帮助都会很棒=]

bg="bg.jpg" 
staticCharacter="toon.png" 

import pygame, sys, time 
from pygame.locals import * 

pygame.init() 
screen = pygame.display.set_mode((640,360),0,32) 

background=pygame.image.load(bg).convert() 

staticToon = pygame.image.load(characterMid).convert_alpha() 

x = 0 
y = 0 
movex = 0 
movey = 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_LEFT: 
       movex = -0.20 
      elif event.key == K_RIGHT: 
       movex = +0.20   
      elif event.key == K_UP: 
       movey = -0.20  
      elif event.key == K_DOWN: 
       movey = +0.20 

     if event.type == KEYUP: 
      if event.key == K_LEFT: 
       movex = 0   
      elif event.key == K_RIGHT: 
       movex = 0      
      elif event.key == K_UP: 
       movey = 0   
      elif event.key == K_DOWN: 
       movey = 0 


    x += movex 
    y += movey 

    if x > 560: 
     x = 560 
    if y > 280: 
     y = 280 
    if x < 0: 
     x = 0 
    if y < 0: 
     y = 0 

screen.blit(background,(0,0)) 
screen.blit(staticToon,(x,y)) 
pygame.display.update() 
+0

我想你问的加速度?握住钥匙移动到最大速度,但释放时会慢下来,最终停止? – ninMonkey 2013-03-17 18:03:46

回答

0

通常,字符移动与机器速度无关。在你的例子中,你不知道While循环每秒执行多少次,它取决于计算机的速度。所以首先,你应该使用pygame Clock来计算每次调用move()之间的时间差。

myclock = pygame.Clock() 
delta = myclock.tick() 

当你有时间差,可以用一个等式距离像这样:

position += speed * direction * delta 

delta是毫秒,所以你需要设置相应的speed。根据当前按键,direction将为-1或+1。 keyup会将方向设置为0.

现在回到问题。你将不得不改变上面的一点。 一个keyup会从方向减去一个小值。

然后检查方向是不是1或-1,然后从您的方向减去一个值。你会在每个循环都做到这一点。这样它会变得越来越小,而且看起来你的角色正在放慢速度。也可以乘以减去增量值的值,这样在每台计算机上它的减速度都将保持不变。

0

我的建议: 访问以下网站:http://karpathy.ca/phyces/tutorial1.php 下载pygamehelper和startercode(我保证它会让你的生活更轻松)。 FPS是内置的,因此您不需要在运动逻辑中进行调整。 查看一些其他教程,如果你想进一步澄清和使用矢量库,如果你想要一些额外的snaz。

1

distance = speed*time

反而增大的位置(通过movexmovey)的,要增加速度:

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

elif event.type == pygame.KEYDOWN: 
    deltax, deltay = delta.get(event.key, (0, 0)) 
    ball.speed[0] += deltax 
    ball.speed[1] += deltay 

现在,对象(下面的示例所示一球)慢下来,添加一些摩擦:

ball.speed[0] *= 0.95 
    ball.speed[1] *= 0.95 

这使每次通过事件循环的速度稍微降低一点。

移动物体的距离等于speed * time。为了简单起见,我们只需要及时更改为1。

self.rect = self.rect.move(self.speed) 

这里是一个可运行的例子:(刚加入为staticCharacter的正确道路。)

import sys 
import pygame 
import os 

''' 
Based on http://www.pygame.org/docs/tut/intro/intro.html 
Draws a red ball bouncing around in the window. 
Pressing the arrow keys moves the ball 
''' 

staticCharacter = "toon.png" 

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

class Ball(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(staticCharacter) 
     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.screen = pygame.display.set_mode(size, 0, 32) 
     self.ball = Ball() 
     self.setup_background() 
    def setup_background(self): 
     self.background = pygame.Surface(self.screen.get_size()) 
     self.background = self.background.convert() 
     self.background.fill(self.black) 
     self.screen.blit(self.background, (0, 0)) 
     pygame.display.flip() 
    def draw(self): 
     self.screen.blit(self.background, (0, 0)) 
     self.screen.blit(self.ball.image, self.ball.rect) 
     pygame.display.flip() 
    def event_loop(self): 
     ball = self.ball 
     while True: 
      for event in pygame.event.get(): 
       if ((event.type == pygame.QUIT) or 
        (event.type == pygame.KEYDOWN and 
        event.key == pygame.K_ESCAPE)): 
        sys.exit() 
       elif event.type == pygame.KEYDOWN: 
        deltax, deltay = delta.get(event.key, (0, 0)) 
        ball.speed[0] += deltax 
        ball.speed[1] += deltay 
      ball.speed = [0.99*s for s in ball.speed] 
      ball.update() 
      self.draw() 
      pygame.time.delay(10) 

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

Unutbu这是美丽的。非常感谢。现在可以稍微处理一下,并在按住按键时获得持续的动作。这工作非常感谢! – 2013-03-17 11:26:30

+0

@ user1947560考虑使用['pygame.key.get_pressed'](http://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed),它应该让生活更轻松。 – pradyunsg 2013-03-17 15:48:34