如何将图像(玩家)旋转到鼠标方向?

3

我正在考虑使用Pygame制作一款2D射击游戏,我想让我的玩家(Player_1)朝向鼠标方向。我搜索了几个小时的解决方案并尝试了所有我能找到的解决方案,但都没有起作用,所以你能帮帮我吗? 这是我的代码:

import pygame, sys, os
from pygame.locals import *
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
#Exit settings
def quit():
  pygame.quit()
  sys.quit()
def events():
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            quit()

#IDS
CLOCK=pygame.time.Clock()
FPS=120
DS=pygame.display.set_mode((0,0), pygame.FULLSCREEN)
pygame.display.set_caption("Shooting simulator")
W,H=DS.get_size()
P_X=W/2-50
P_Y=H/2-50

#Colors
Red=pygame.Color("#FF0000")
Blue=pygame.Color("#0000FF")
Green=pygame.Color("#00FF00")
Black=pygame.Color("#000000")
White=pygame.Color("#FFFFFF")

#IGT(in game things)
Player_1=pygame.image.load("Img/Player_1.png").convert()

def game_loop():
  while True:
    events()

    DS.fill(White)
    DS.blit(Player_1,(P_X,P_Y))
    pygame.display.flip()
game_loop()

这是我的播放器(Player_1)

非常感谢您的帮助。


1
是的,这正是我想要的,非常感谢你的帮助,很抱歉浪费了你的时间。 - Rami Menai
2个回答

7
你需要计算从玩家到鼠标的向量角度。通过 pygame.mouse.get_pos() 获取鼠标位置,以及围绕玩家的矩形(pygame.Rect):
mx, my = pygame.mouse.get_pos()
player_rect = Player_1.get_rect(topleft=(P_X,P_Y))

计算从玩家到鼠标的向量,并通过 math.atan2 计算向量的角度。需要翻转y轴(-dy),因为通常情况下y轴指向上方,但在PyGame坐标系中,y轴指向下方。
dx, dy = mx - player_rect.centerx, player_rect.centery - my
angle = math.degrees(math.atan2(-dy, dx)) - correction_angle

此外,必须扣除一个修正角度 (- 修正角度)。修正角度取决于Sprite。如果Sprite...

向右看,修正角度为0:correction_angle = 0
向上看,修正角度为90:correction_angle = 90
向左看,修正角度为180:correction_angle = 180
向下看,修正角度为270:correction_angle = 270

使用pygame.transform.rotate()函数,以角度为单位绕中心旋转玩家:
(另请参阅如何使用Pygame将图像围绕其中心旋转?
rot_image = pygame.transform.rotate(Player_1, angle)
rot_image_rect = rot_image.get_rect(center=player_rect.center)

最简单的例子: repl.it/@Rabbid76/PyGame-RotateWithMouse


(该示例演示了如何使用鼠标旋转PyGame中的图像)

import math
import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
player = pygame.image.load("player.png").convert_alpha()

#   0 - image is looking to the right
#  90 - image is looking up
# 180 - image is looking to the left
# 270 - image is looking down
correction_angle = 90

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

    player_pos  = window.get_rect().center
    player_rect = player.get_rect(center = player_pos)

    mx, my = pygame.mouse.get_pos()
    dx, dy = mx - player_rect.centerx, my - player_rect.centery
    angle = math.degrees(math.atan2(-dy, dx)) - correction_angle

    rot_image      = pygame.transform.rotate(player, angle)
    rot_image_rect = rot_image.get_rect(center = player_rect.center)

    window.fill((255, 255, 255))
    window.blit(rot_image, rot_image_rect.topleft)
    pygame.display.flip()

pygame.quit()
exit()


0
这里有一段简单的代码块,你可以用来帮助。 它使用了一些三角函数,并假设以下内容在之前已经定义好: elsie 是玩家。
position = pygame.mouse.get_pos()
    angle = math.atan2(position[1] - (elsiepos[1] + 32), position[0] - (elsiepos[0] + 26))
    elsierot = pygame.transform.rotate(elsie, 360 - angle * 57.29)
    elsiepos1 = (elsiepos[0] - elsierot.get_rect().width / 2, elsiepos[1] - elsierot.get_rect().height / 2)
    screen.blit(elsierot, elsiepos1)

这个代码块应该在检测到键盘按键之后立即添加,并且应该在绘制玩家(在本例中为elsie)之前添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接