Python 如何在pygame中获得流畅的移动?

Python 如何在pygame中获得流畅的移动?,python,loops,oop,module,pygame,Python,Loops,Oop,Module,Pygame,如何使我的角色在pygame中平稳移动?当我创建一个常规程序时,我似乎能够通过降低速度(角色在每一步中移动的距离)和减少时间延迟来获得平滑的移动,以便它快速移动小步 代码可以是这样的(这里我只是有一个简单的矩形在屏幕上移动) import pygame pygame.init() win = pygame.display.set_mode((500, 500)) x = 400 y = 400 width = 60 height = 60 vel = 2 run = True whil

如何使我的角色在pygame中平稳移动?当我创建一个常规程序时,我似乎能够通过降低速度(角色在每一步中移动的距离)和减少时间延迟来获得平滑的移动,以便它快速移动小步

代码可以是这样的(这里我只是有一个简单的矩形在屏幕上移动)

import pygame

pygame.init()

win = pygame.display.set_mode((500, 500))

x = 400
y = 400
width = 60
height = 60
vel = 2

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] and x > vel:
        x -= vel

    if keys[pygame.K_RIGHT] and x < 500 - width - vel:
        x += vel

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 0, 0), (x, y, width, height))
    pygame.display.update()

pygame.quit()
导入pygame
pygame.init()
win=pygame.display.set_模式((500500))
x=400
y=400
宽度=60
高度=60
水平=2
运行=真
运行时:
pygame。时间。延迟(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和x>vel:
x-=水平
如果键[pygame.K_RIGHT]和x<500-宽度-级别:
x+=vel
赢。填充((0,0,0))
pygame.draw.rect(赢,(255,0,0),(x,y,宽,高))
pygame.display.update()
pygame.quit()
然而,当我试图使游戏面向对象时,我没有让角色平稳移动。代码是这样的。我做错了什么

import pygame

pygame.init()

win = pygame.display.set_mode((500, 500))

class player():
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 2
        self.left = False
        self.right = False

    def draw(self):
        pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))
        if self.left:
            pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))
        elif self.right:
            pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))


def re_draw():
    win = pygame.display.set_mode((500, 500))
    man.draw()
    pygame.display.update()


man = player(400, 400, 60, 60)

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] and man.x > man.vel:
            man.x -= man.vel
            man.left = True
            man.right = False

        elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
            man.x += man.vel
            man.left = False
            man.right = True

        re_draw()

pygame.quit()
导入pygame
pygame.init()
win=pygame.display.set_模式((500500))
类播放器():
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=2
self.left=False
self.right=False
def牵引(自):
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
如果self.left:
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
elif self.right:
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
定义重新绘制()
win=pygame.display.set_模式((500500))
画
pygame.display.update()
男子=运动员(400、400、60、60)
运行=真
运行时:
pygame。时间。延迟(10)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_左]和man.x>man.vel:
man.x-=man.vel
左=真
对=错
elif键[pygame.K_RIGHT]和man.x<500-man.width-man.vel:
man.x+=man.vel
左=假
正确的
re_draw()
pygame.quit()

您可以使用
clock.tick
代替
pygame.time.delay

import pygame

pygame.init()

win = pygame.display.set_mode((500, 500))

class player():
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 2
        self.left = False
        self.right = False

    def draw(self):
        pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))
        if self.left:
            pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))
        elif self.right:
            pygame.draw.rect(win, (255, 0, 0), (man.x, man.y, man.height, man.width))


def re_draw():

    man.draw()
    pygame.display.update()


man = player(400, 400, 60, 60)

run = True
clock = pygame.time.Clock()

while run:

        win.fill((0, 0, 0)) # fill the window with your desired color
        # pygame.time.delay(10) use clock.tick instead

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and man.x > man.vel:
            man.x -= man.vel
            man.left = True
            man.right = False

        elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
            man.x += man.vel
            man.left = False
            man.right = True

        man.draw() # this might be better

        pygame.display.update()

        clock.tick(60) 

pygame.quit()
导入pygame
pygame.init()
win=pygame.display.set_模式((500500))
类播放器():
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=2
self.left=False
self.right=False
def牵引(自):
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
如果self.left:
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
elif self.right:
pygame.draw.rect(赢,(255,0,0),(man.x,man.y,man.height,man.width))
定义重新绘制()
画
pygame.display.update()
男子=运动员(400、400、60、60)
运行=真
clock=pygame.time.clock()
运行时:
win.fill((0,0,0))#用你想要的颜色填充窗口
#pygame.time.delay(10)改用clock.tick
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_左]和man.x>man.vel:
man.x-=man.vel
左=真
对=错
elif键[pygame.K_RIGHT]和man.x<500-man.width-man.vel:
man.x+=man.vel
左=假
正确的
伙计,画()#这可能更好
pygame.display.update()
时钟滴答(60)
pygame.quit()

希望这有帮助,欢迎使用StackOverflow。

时钟。勾号(60)
不会增加FPS,恰恰相反!它会延迟游戏,因此游戏每秒最多运行60帧。哦,我的抱歉,我会编辑它。但是我已经测试了th代码,它实际上运行得很慢。没问题,很高兴我能提供帮助:)@DenFulaAnkungen我认为第二种方法的实际问题是,
re_draw
函数具有line
pygame.display.set_模式((500500))
,它基本上重新格式化了整个显示。这是一个非常昂贵的函数,只能在启动程序或更改显示器大小时调用。在第一种方法中,当程序启动时,您只正确地调用它一次。@DenFulaAnkungen使用
clock.tick(60)
是一种更标准和首选的限制FPS的方法,但它只会延迟程序(并且可以选择返回自上次调用以来经过的毫秒数).当您切换进近时,有什么不起作用?你在期待什么,发生了什么?