如何在pygame中使一张图片绕固定点旋转
import pygame
import math
# 初始化Pygame
pygame.init()
# 设置窗口大小
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('投石机模拟')
# 加载图片
catapult_body_image = pygame.image.load('投石机主体.png').convert_alpha()
catapult_lever_image = pygame.image.load('投石机杠杆.png').convert_alpha()
projectile_image = pygame.image.load('投掷物.png').convert_alpha()
# 调整图片缩放比例(可根据实际情况调整)
scale_factor = 0.15
catapult_body_image = pygame.transform.scale(catapult_body_image, (int(catapult_body_image.get_width() * scale_factor),
int(catapult_body_image.get_height() * scale_factor)))
catapult_lever_image = pygame.transform.scale(catapult_lever_image, (int(catapult_lever_image.get_width() * scale_factor),
int(catapult_lever_image.get_height() * scale_factor)))
projectile_image = pygame.transform.scale(projectile_image, (int(projectile_image.get_width() * scale_factor),
int(projectile_image.get_height() * scale_factor)))
# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 投石机主体相关坐标
catapult_body_x = 120
catapult_body_y = 450
# 杠杆相关坐标
catapult_lever_x = catapult_body_x - 50
catapult_lever_y = catapult_body_y - 35
# 投掷物相关坐标
projectile_x = catapult_lever_x
projectile_y = catapult_lever_y
# 杠杆长度
lever_length = 150
# 角度
angle = 0
# 配重
counterweight = 50
# 初始速度
initial_velocity = 0
# 杠杆绘制时的y方向偏移量,可根据实际效果调整
lever_y_offset = 20
# 物理参数
gravity = 9.8
# 抛体运动相关
is_projectile_flying = False
time = 0
dt = 0.1
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
angle = max(-90, angle - 5)
elif event.key == pygame.K_RIGHT:
angle = min(90, angle + 5)
elif event.key == pygame.K_UP:
counterweight += 10
initial_velocity = counterweight * 0.5
elif event.key == pygame.K_DOWN:
counterweight = max(10, counterweight - 10)
initial_velocity = counterweight * 0.5
elif event.key == pygame.K_SPACE:
is_projectile_flying = True
time = 0
v0x = initial_velocity * math.cos(math.radians(angle))
v0y = initial_velocity * math.sin(math.radians(angle))
screen.fill(WHITE)
# 绘制投石机主体
screen.blit(catapult_body_image, (catapult_body_x - catapult_body_image.get_width() // 2,
catapult_body_y - catapult_body_image.get_height() // 2))
# 计算杠杆旋转后的坐标
rotated_lever = pygame.transform.rotate(catapult_lever_image, -angle)
lever_center_x = catapult_lever_x
lever_center_y = catapult_lever_y + lever_y_offset
lever_rect = rotated_lever.get_rect(center=(lever_center_x, lever_center_y))
screen.blit(rotated_lever, lever_rect)
if is_projectile_flying:
# 抛体运动计算
projectile_x += v0x * dt
projectile_y -= v0y * dt - 0.5 * gravity * dt * dt
if projectile_y > screen_height:
is_projectile_flying = False
else:
# 计算投掷物在杠杆上的坐标
projectile_x = lever_center_x + lever_length * math.sin(math.radians(angle))
projectile_y = lever_center_y - lever_length * math.cos(math.radians(angle))
# 绘制投掷物
screen.blit(projectile_image, (int(projectile_x - projectile_image.get_width() // 2),
int(projectile_y - projectile_image.get_height() // 2)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
这是源代码。实现的功能是投石机


如图,它事实上已经对齐了,但是现在存在的问题是,按下键盘左右键之后投石机杠杆图片会沿着自己的中点旋转,这就导致投石机动画并不现实。
我的问题是:怎么可以使杠杆部分绕图片最右端旋转且最右端点固定不动。投掷物在杠杆线末端