python - Pygame精灵旋转太快
问题描述
我正在尝试使用 pygame 在 python 上制作一个游戏,其中包括坦克互相射击。我有一个问题,当我试图将精灵旋转 90 度时,它的速度太快了,我需要它像这样,一旦你按下 a 按钮,它就会倾斜 90 度,然后它可以朝那个方向移动
我已经尝试过使用带有 true 和 false 的 if 语句,但这仍然使它在应该停止 90 度时倾斜得太快。
更新函数基本上将速度添加到位置上,而绘制函数根据对象的位置将对象放到屏幕上。
这是代码片段:
class Tank:
def __init__(self, x, y, pic):
self.xpos = x
self.ypos = y
self.speed_x = 0
self.speed_y = 0
self.picture = pic
self.rotation_angle = 0
self.rotation_angle_speed = 0
self.rect = self.picture.get_rect()
def update(self):
self.xpos =+ self.speed_x
self.ypos =+ self.speed_y
self.rotation_angle =+ self.rotation_angle_speed
def rotate(self):
self.picture = pygame.transform.rotate(self.picture, self.rotation_angle)
def draw(self):
screen.blit(self.picture, (self.xpos, self.ypos))
def is_collided_with(self, sprite):
return self.rect.colliderect(sprite.rect)
one_tank = pygame.image.load("C:/aliens/tank_two.png").convert_alpha()
one_tank = pygame.transform.scale(one_tank, (100, 100))
tank_one = Tank(100, 100, one_tank)
level = Level_background(0, 0, level_pic)
one_right = False
one_left = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
tank_one.speed_y = -5
elif event.key == pygame.K_s:
tank_one.speed_y = 5
elif event.key == pygame.K_a:
tank_one.speed_x = -5
elif event.key == pygame.K_d:
tank_one.speed_x = 5
elif event.key == pygame.K_q:
if one_left == False:
tank_one.rotation_angle_speed = -90
one_left = True
elif event.key == pygame.K_e:
if one_right == False:
tank_one.rotation_angle_speed = 90
one_right = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_w:
tank_one.speed_y = 0
elif event.key == pygame.K_s:
tank_one.speed_y = 0
elif event.key == pygame.K_a:
tank_one.speed_x = 0
elif event.key == pygame.K_d:
tank_one.speed_x = 0
elif event.key == pygame.K_q:
if one_left == True:
tank_one.rotation_angle_speed = 0
one_left = False
elif event.key == pygame.K_e:
if one_right == True:
tank_one.rotation_angle_speed = 0
one_right = False
tank_one.update()
level.draw()
tank_one.rotate()
tank_one.draw()
pygame.display.flip()
clock.tick(60)
我希望它做的是倾斜 90 度并保持这种状态,直到再次单击按钮。但相反,它只是决定倾斜超过 90 度
解决方案
完成单次 90 度旋转后,重置控制旋转的参数。只要没有按下新按钮,这将导致不再应用旋转:
class Tank:
# [...]
def rotate(self):
self.picture = pygame.transform.rotate(self.picture, self.rotation_angle)
self.rotation_angle_speed = 0
self.rotation_angle = 0
update
此外,该类的方法存在问题Tank
。=+
将分配一个值。注意=
是赋值,+
只是该值的正号。增量分配是+=
而不是=+
:
class Tank:
# [...]
def update(self):
self.xpos += self.speed_x
self.ypos += self.speed_y
# [...]
此外,您应该在每一帧开始时清除整个窗口。这可以通过以下方式完成pygame.Surface.fill()
:
while True:
screen.fill((0,0,0))
# [...]
推荐阅读
- spring - 将 Spring 连接到 Active Directory 时出现问题
- gremlin - gremlin order by with coalesce 重复了一些值
- sql - 有没有办法选择 * 并做一个 CASE 表达式
- html - 不使用 flex 将 div 居中
- flutter - 为什么在 Flutter 中自定义段落会很痛苦?
- groovy - Groovy 脚本将值传递给 sh。脚本
- ruby-on-rails-5 - Post的未定义方法“精选”
- c# - 使用 C# 和 Lotus Notes 在 com-visible dll 类中使用快捷方式的问题
- xamarin - 从 viewmodel xamarin prism 将命令绑定到模板视图
- spring-boot - 在 Docker 上运行 Spring-Boot 应用程序时出错