Python 如何在pygame中获得流畅的移动?
如何使我的角色在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
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
函数具有linepygame.display.set_模式((500500))
,它基本上重新格式化了整个显示。这是一个非常昂贵的函数,只能在启动程序或更改显示器大小时调用。在第一种方法中,当程序启动时,您只正确地调用它一次。@DenFulaAnkungen使用clock.tick(60)
是一种更标准和首选的限制FPS的方法,但它只会延迟程序(并且可以选择返回自上次调用以来经过的毫秒数).当您切换进近时,有什么不起作用?你在期待什么,发生了什么?