繁体   English   中英

如何在 pygame 中平滑地进行定向运动?

[英]How can I make directional movement in pygame smooth?

我正在 pygame 中制作一个游戏,你是一只水母,你可以四处游动。 我已经设法能够转向水母旋转的方向。 但是当我朝那个方向走时,球员形象在颤抖。 我能以某种方式解决这个问题吗?

在此处输入图片说明

其中 self.list[int(self.current)] 是动画的当前图像和 dt delta 时间。

if pygame.key.get_pressed()[pygame.K_UP]:
    self.rotr = math.radians(self.rot)
    self.ysp = math.cos(self.rotr)
    self.xsp = math.sin(self.rotr)
    self.x -= self.xsp*dt*20
    self.y -= self.ysp*dt*20
    self.image = pygame.transform.rotate(self.list[int(self.current)], self.rot)
    self.rect = self.image.get_rect(center = (x, y))

if pygame.key.get_pressed()[pygame.K_LEFT]:
    self.rot += math.pi*dt*7

if pygame.key.get_pressed()[pygame.K_RIGHT]:
    self.rot -= math.pi*dt*7

您可能已经看过有关如何在 PyGame 中移动对象的教程,这些教程依赖于整数 X 和 Y 值。 这不是实现平滑运动的好方法。 下面是一个平滑运动的例子——注意速度和位置值是如何为整数的:

import pygame
pygame.init()  
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("Moving rectangle")
x = 200 #integer value
y = 200 #integer value
width = 20
height = 20
vel = 10 # integer value
run = True
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel
    win.fill((0, 0, 0))
    #int values are directly used for screen position
    pygame.draw.rect(win, (255, 0, 0), (x, y, width, height)) 
    pygame.display.update() 
pygame.quit()

不过,这是一个简单的修复:

x = 200.0 #now a float
y = 200.0 #now a float
width = 20
height = 20
vel = 10.0 #now a float
run = True
while run:
    pygame.time.delay(10)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel
    win.fill((0, 0, 0))
    #now converting X and Y from floats to integers, rounding first
    pygame.draw.rect(win, (255, 0, 0), (int(round(x)), int(round(y)), width, height)) 

注意当我们绘制矩形时,我们如何围绕 X 和 Y 坐标。 圆角坐标是显示坐标。 您内部使用的 X 和 Y 值甚至不必与像素值 1:1 对应; 您可以控制从位置坐标到屏幕坐标的转换方式。 这只是最简单的情况。

使用加速度、摩擦等可以实现更平滑的运动。不过有很多教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM