python - 对角线移动使玩家走得更快
问题描述
我有这个简单的移动脚本。
if x > 0:
if key[pygame.K_a] or key[pygame.K_LEFT]:
rect_player.move_ip(-1 * speed, 0)
if x < SCREEN_WIDTH - 110:
if key[pygame.K_d] or key[pygame.K_RIGHT]:
rect_player.move_ip(speed, 0)
if y > 0:
if key[pygame.K_w] or key[pygame.K_UP]:
rect_player.move_ip(0, -1 * speed)
if y < SCREEN_HEIGHT - 110:
if key[pygame.K_s] or key[pygame.K_DOWN]:
rect_player.move_ip(0, speed)
当玩家向一个方向移动时,一切都很好。但是当它们沿对角线移动时,它会走得更快。有没有什么办法解决这一问题?
解决方案
由于pygame.Rect
应该代表屏幕上的一个区域,一个pygame.Rect
对象只能存储整数数据。
Rect 对象的坐标都是整数。[...]
我建议使用pygame.math.Vector2
该问题。将对象的位置存储在一个pygame.math.Vector2
对象中:
pos = pygame.math.Vector2(start_x, start_y)
根据键设置方向向量。将向量缩放到speed
with的长度scale_to_length
。移动对象并更新rect_player
:
key = pygame.key.get_pressed()
up = key[pygame.K_w] or key[pygame.K_UP]
down = key[pygame.K_s] or key[pygame.K_DOWN]
left = key[pygame.K_a] or key[pygame.K_LEFT]
right = key[pygame.K_d] or key[pygame.K_RIGHT]
move = pygame.math.Vector2(right - left, down - up)
if move.length_squared() > 0:
move.scale_to_length(speed)
pos += move
rect_player.topleft = round(pos.x), round(pos.y)
如果您不关心浮点精度,只需移动矩形:
key = pygame.key.get_pressed()
up = key[pygame.K_w] or key[pygame.K_UP]
down = key[pygame.K_s] or key[pygame.K_DOWN]
left = key[pygame.K_a] or key[pygame.K_LEFT]
right = key[pygame.K_d] or key[pygame.K_RIGHT]
move = pygame.math.Vector2(right - left, down - up)
if move.length_squared() > 0:
move.scale_to_length(speed)
rect_player.move_ip(round(move.x), round(move.y))
最小的例子:
import pygame
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
rect_player = pygame.Rect(0, 0, 20, 20)
rect_player.center = window.get_rect().center
speed = 5
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
key = pygame.key.get_pressed()
up = key[pygame.K_w] or key[pygame.K_UP]
down = key[pygame.K_s] or key[pygame.K_DOWN]
left = key[pygame.K_a] or key[pygame.K_LEFT]
right = key[pygame.K_d] or key[pygame.K_RIGHT]
move = pygame.math.Vector2(right - left, down - up)
if move.length_squared() > 0:
move.scale_to_length(speed)
rect_player.move_ip(round(move.x), round(move.y))
window.fill(0)
pygame.draw.rect(window, (255, 0, 0), rect_player)
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()
推荐阅读
- javascript - 函数运行队列中的 javascript 函数
- maven - 在 Jenkins 中执行 Maven 项目时出错
- python - 如何正确格式化时间,以便在使用 matplotlib 绘图时正确显示
- apache-spark - 无分区列性能的 Spark 下推过滤器
- angular - 如何以角度在动态组件中绑定和发出动态事件
- excel - 如何在 Excel 中使用起始编号和结束编号在 Excel 中创建一列数字?
- python - CNN 模型没有考虑训练数据集中的所有数据,而是只考虑部分数据,我在所有时期都得到完全相同的准确度
- css - 身高:100% 不被继承
- oracle - SQL Developer:PLSCOPE_SETTINGS“无”和“全部”之间的区别?
- function - 为什么 Lua 表达式中没有匿名函数?