You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame如何从玩家位置按鼠标角度绘制剑形线段

Pygame俯视角游戏鼠标指向剑的实现

核心实现思路

用Pygame自带的pygame.math.Vector2向量类实现是最简便的方案,不需要手动计算三角函数、处理角度和弧度转换,也不用踩屏幕坐标系y轴向下的坑,后续如果要把线段替换成剑的美术素材,这套方向计算逻辑可以直接复用。

你原有代码存在几个会导致绘制失败的问题:

  • 线段绘制逻辑写在screen.fill()(屏幕填充)之前,就算绘制成功也会被白色背景覆盖
  • 直接对pygame.Rect对象做box+10的加法运算属于非法操作,Rect不支持和整数直接相加计算坐标
  • 鼠标点击事件的判断写在事件遍历循环外,会出现事件捕获异常
  • 玩家矩形的坐标是左上角顶点,不是中心点,直接用box当线段起点会导致剑从玩家左上角伸出来,位置不对

具体实现步骤

  • 取玩家矩形的中心点作为剑的固定起点
  • 实时获取鼠标当前坐标,计算从玩家中心指向鼠标位置的方向向量
  • 将方向向量归一化后乘以设定的剑长度,得到剑的终点坐标
  • 调整绘制顺序,在绘制完玩家、敌人之后再绘制剑,保证层级正确

修正后可运行代码

import pygame
import sys

max_tps = 20.0
sword_length = 60  # 剑的长度,可自行调整
sword_width = 8    # 剑的粗细

pygame.init()
color = (255,255,255)
screen = pygame.display.set_mode((1550,800))
box = pygame.Rect(100,100,50,50)
boxai = pygame.Rect(0,0,50,50)
clock = pygame.time.Clock()
delta = 0.0

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit(0)
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit(0)

    delta += clock.tick()/1000.0
    while delta > 1/max_tps:
        delta -= 1/max_tps

        # 玩家移动输入
        key_press = pygame.key.get_pressed()
        if key_press[pygame.K_a]:
            box.x -=10
        if key_press[pygame.K_d]:
            box.x +=10
        if key_press[pygame.K_w]:
            box.y -=10
        if key_press[pygame.K_s]:
            box.y +=10

        # 敌人AI移动
        if boxai.x < box.x:
            boxai.x += 5
        if boxai.x > box.x:
            boxai.x -= 5
        if boxai.y < box.y:
            boxai.y += 5
        if boxai.y > box.y:
            boxai.y -= 5
        if boxai.center == box.center:
            print("抓到玩家了")

        # 绘制逻辑 注意顺序:先填充背景,再画游戏元素
        screen.fill(color)
        pygame.draw.rect(screen, (0,0,0), box) # 玩家
        pygame.draw.rect(screen, (255, 0, 0), boxai) # 敌人

        # 计算剑的两个端点
        player_center = pygame.math.Vector2(box.center) # 剑的起点:玩家中心
        mouse_pos = pygame.math.Vector2(pygame.mouse.get_pos())
        # 计算指向鼠标的方向,乘以剑长得到终点
        aim_dir = (mouse_pos - player_center).normalize()
        sword_end = player_center + aim_dir * sword_length
        # 绘制剑
        pygame.draw.line(screen, (255,0,0), player_center, sword_end, sword_width)

        pygame.display.flip()

扩展说明

  • 如果要做点击才挥剑的效果,只要加一个攻击状态标记,鼠标按下时把标记设为True,攻击动画结束后设为False,只有标记为True的时候才绘制剑即可
  • 如果后续要替换成剑的图片资源,直接用aim_dir.angle_to(pygame.math.Vector2(1,0))就能拿到剑需要旋转的角度,调用pygame.transform.rotate旋转图片后绘制即可,不需要重新计算方向
  • 这套方向计算逻辑同样可以用来实现魔法弹道、龙的喷火攻击、宝箱交互判定等功能,不需要重复写角度计算代码

内容的提问来源于stack exchange,提问作者Michał Pietruszyński

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:18:17