在Pygame中旋转图像

0 投票
1 回答
544 浏览
提问于 2025-04-18 11:23

我知道这个问题之前有人问过,主要是因为我几乎看过这里所有提到这个话题的帖子,但我还是无法实现我想要的效果。根据我的理解,我的数学和代码都是正确的。简单来说,我正在制作一个90度的射击游戏,想让玩家的形象能够转动,朝向鼠标的位置。目前,形象只能稍微向左和向右转动,但并没有完全转向鼠标。正如我所说,我查阅了很多教程,但还是搞不明白。任何帮助或建议都非常感谢。我的代码在下面。谢谢!

    #Import pygame
    import pygame, sys
    from pygame.locals import *
    import math

    #Initialize pygame
    pygame.init()


   #System variables
   running = True
   dispWidth = 800
   dispHeight = 600
   pygame.mouse.set_visible(False)
   pygame.key.set_repeat(1, 50)

   player = pygame.image.load('resources/player_handgun.png')
   playerX = 50
   playerY = 50

   background = pygame.image.load('resources/grass.png')

   crosshair = pygame.image.load('resources/crosshair.png')

   gameScreen = pygame.display.set_mode( ( dispWidth, dispHeight) )
   pygame.display.set_caption('Zombie Shooter')
   gameScreen.blit( player, ( playerX, playerY))
   gameScreen.blit( background, ( 0, 0))

   pygame.display.update()

   #def updateScreen():
   #    playerX = playerX + movement

   #Game Loop
   while running:
     blue = (0,0,255)


     velX = 0
     velY = 0

     for event in pygame.event.get():
         if event.type == QUIT:
             pygame.quit()
             sys.exit()
         elif event.type == pygame.KEYDOWN:
             if event.key == pygame.K_d:
                 velX = 10
             if event.key == pygame.K_a:
                 velX = (-10)
             if event.key == pygame.K_w:
                 velY = (-10)
             if event.key == pygame.K_s:
                 velY = 10

     playerX = playerX + velX
     playerY = playerY + velY
     pos = (pygame.mouse.get_pos()[0], pygame.mouse.get_pos()[1])
     playerDirection = math.atan2(playerY-pos[1], playerX-pos[0])

     char = pygame.transform.rotate(player, playerDirection)
     gameScreen.blit( background, (0, 0))
     gameScreen.blit( char,(playerX,playerY))


     gameScreen.blit( crosshair, (pos[0]-16,pos[1]-16))


     print playerDirection
     pygame.display.update()

1 个回答

1

pygame.transform.rotate 这个函数需要一个角度,单位是度(度数),而 math.atan2 这个函数返回的角度是弧度(弧度制)。所以在使用这两个函数的时候,你需要把度和弧度之间进行转换。

playerDirection = math.degrees(math.atan2(playerY-pos[1], playerX-pos[0]))

相关链接:

撰写回答