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
相关产品推荐
相关产品推荐

