在pygame中制作一个简单的游戏。为我的charactater导入了一个图像,可以自由地移动他。我想知道如何使角色慢慢停止;
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 :(得分:1)
distance = speed*time
您希望提高速度,而不是增加位置(通过movex
或movey
):
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()
答案 1 :(得分:0)
通常,角色移动与机器速度无关。在您的示例中,您不知道While循环每秒进行多少次,它取决于计算机速度。首先,你应该使用pygame Clock来计算每次调用move()之间的时差。
myclock = pygame.Clock()
delta = myclock.tick()
当你有时差时,你可以使用这样的距离方程:
position += speed * direction * delta
delta
以毫秒为单位,因此您需要相应地设置speed
。 direction
将为-1或+1,具体取决于按下的当前键。密钥将方向设置为0。
现在回到这个问题。您必须以不同的方式更改上述内容。 密钥将从方向中减去一个小值。
然后检查方向是否不是1或-1,然后从方向中减去一个值。你会在每个循环中这样做。这样它会变得越来越小,看起来你的角色正在变慢。最好将乘以减去的值乘以delta,这样每台计算机上的减速度都会保持不变。
答案 2 :(得分:0)
我的建议: 转到以下网站:http://karpathy.ca/phyces/tutorial1.php 下载pygamehelper和startercode(我保证会让你的生活更轻松)。 FPS是内置的,因此您无需在移动逻辑中进行调整。 如果您想进一步澄清,请查看其他一些教程,如果您想要一些额外的snaz,请使用矢量库。