如何将图像(播放器)旋转至鼠标方向?
- 2025-01-21 09:01:00
- admin 原创
- 61
问题描述:
我正在考虑用 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:
您必须计算从玩家到鼠标的矢量的角度。通过和玩家周围的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
另外,必须扣除校正角度(- 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
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()
解决方案 2:
以下是一段简单的代码,您可以用来提供帮助。它使用了一些三角函数,并假设以下内容之前已定义: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)之前出现。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD