0

用pygame做一个简单的游戏。已经为我的角色导入了一张图片,并且可以自由移动他。我想知道如何让角色慢慢停下来;

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()
4

3 回答 3

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()
于 2013-03-17T10:44:38.630 回答
0

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

于 2013-03-17T10:38:48.507 回答
0

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

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

当你有时间差时,你可以使用这样的距离方程:

position += speed * direction * delta

delta以毫秒为单位,因此您需要speed相应地设置。这direction将是 -1 或 +1,具体取决于当前按下的键。keyup 会将方向设置为 0。

现在回到问题。您必须对上述内容进行一些不同的更改。keyup 会从方向中减去一个小值。

然后检查方向是否不是 1 或 -1,然后从您的方向中减去一个值。您将在每个循环中执行此操作。这样它会变得越来越小,并且看起来你的角色正在减速。最好将减去的值乘以 delta,这样每台计算机上的减速度都会保持不变。

于 2013-03-17T10:25:06.043 回答