2013-03-17 58 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