当前位置: 首页 > news >正文

科普:Pygame 中的坐标系

一、轴的位置与方向

在 Pygame 中,坐标系用于定位所有图形元素(如精灵、图像、文字、几何图形等),其设计遵循屏幕显示的常规逻辑,核心特点如下:

1. 原点位置

坐标系的原点(0, 0)位于屏幕的左上角,这是与数学中“原点在中心”的主要区别。所有元素的位置都以这个原点为基准计算。

2. 坐标轴方向

  • x轴(水平方向):向右为正方向(从原点向右,x值逐渐增大)。
  • y轴(垂直方向):向下为正方向(从原点向下,y值逐渐增大)—— 这与数学中“y轴向上为正”的习惯不同,需要特别注意(原因是屏幕扫描通常从左上角开始,向下逐行显示像素)。

3. 坐标单位

坐标的单位是像素(pixel),即屏幕上的一个点。例如:

  • 坐标 (100, 200) 表示“从原点向右100像素,向下200像素”的位置;
  • 一个宽度为 300、高度为 200 的矩形,意味着它横向占据300个像素,纵向占据200个像素。

4. 屏幕范围与坐标示例

假设游戏窗口的分辨率为 800×600(宽800像素,高600像素),则屏幕上关键位置的坐标为:

  • 左上角(原点):(0, 0)
  • 右上角:(800, 0)(x=800,y=0)
  • 左下角:(0, 600)(x=0,y=600)
  • 右下角:(800, 600)
  • 中心位置:(400, 300)(x=800/2,y=600/2)

5. 与对象位置的关联

Pygame 中所有可绘制对象的位置都基于这个坐标系:

  • pygame.Rect 矩形rect.xrect.y 表示矩形左上角的坐标;rect.center 表示矩形中心的 (x, y) 坐标。
  • 精灵(Sprite:通过 sprite.rect 的坐标属性(如 topleftcenter)控制精灵在屏幕上的位置。
  • 鼠标事件pygame.mouse.get_pos() 返回鼠标指针在这个坐标系中的实时位置(如 (x, y))。
  • 绘制函数:如 pygame.draw.circle(screen, color, (x, y), radius) 中,(x, y) 是圆心在坐标系中的位置。

常见误区提醒

  • y轴方向:新手容易习惯性认为“向上是y轴正方向”,导致绘制的元素位置与预期相反(例如想让精灵向上移动,却错误地减小y值,实际应该减小y值才会向上移动,因为y轴向下为正)。
    例:让精灵向上移动10像素,应执行 self.rect.y -= 10(y值减小,位置上移)。

Pygame 坐标系以屏幕左上角为原点,x轴向右为正,y轴向下为正,单位为像素。理解这一体系是准确定位游戏元素、处理移动和碰撞的基础,尤其需要注意y轴方向与数学坐标系的差异。

二、轴上的长度单位

在 Pygame 中,坐标系的横轴(x 轴)和纵轴(y 轴)的逻辑单位是完全一致的,都是“像素”(pixel)。但需要区分“逻辑单位”和“物理显示单位”的差异:

1. 逻辑单位:x 和 y 轴的单位长度相等

在 Pygame 的坐标系逻辑中,xy 的单位都是“像素”,且 1 个像素在 x 方向和 y 方向的逻辑长度是相等的
例如:

  • 一个宽 100 像素、高 100 像素的矩形(pygame.draw.rect(screen, color, (x, y, 100, 100))),在逻辑上是标准正方形。
  • 一个半径为 50 像素的圆(pygame.draw.circle(screen, color, (cx, cy), 50)),在逻辑上是标准正圆。

2. 物理显示:可能存在差异,但由硬件决定

实际显示时,1 像素在屏幕上的物理长度(比如毫米)是否在 x 和 y 方向相等,取决于显示器的像素形状

  • 绝大多数现代显示器(如电脑屏幕、手机屏幕)的像素是正方形(square pixel),即遵循正方形像素标准。此时 x 和 y 方向 1 像素的物理长度相等,Pygame 绘制的正方形和圆会看起来是“正”的。
  • 极少数特殊设备(如早期CRT显示器、某些嵌入式屏幕)可能使用长方形像素(non-square pixel),此时 1 像素在 x 和 y 方向的物理长度不同。例如:x 方向 1 像素长 0.2mm,y 方向 1 像素长 0.3mm,这会导致逻辑上的正方形显示为长方形,正圆显示为椭圆。 但通过底层技术手段优化后,用户感知差异极小,即应用级的程序员不必考虑。

3. Pygame 如何处理图形绘制?

Pygame 仅负责逻辑像素的绘制,不直接处理物理显示的差异:

  • 正方形:通过指定相等的宽度和高度(如 width=height=100),在逻辑上就是标准正方形。无论屏幕像素是否为正方形,Pygame 都按“宽高相等”绘制。

  • 圆形:通过 pygame.draw.circle() 指定半径(如 radius=50),逻辑上是到中心距离相等的点的集合,即标准正圆。

  • Pygame 中 x 轴和 y 轴的逻辑单位(像素)长度相等,绘制正方形(宽高相等)和圆(指定半径)时,逻辑上是标准图形。

  • 实际显示是否“正”,取决于屏幕硬件的像素是否为正方形(现代设备几乎都是正方形像素),与 Pygame 无关。

因此,在开发中只需按逻辑像素绘制即可,无需额外处理坐标系单位差异。

http://www.lryc.cn/news/619423.html

相关文章:

  • 猫头虎AI分享:Excel MCP,让AI具备操作Excel表格|创建销售数据表、复制工作表、填充数据、写公式、绘制图表、调节颜色、添加透视表、保存为PDF
  • python与JavaScript的区别
  • Unity3d UGUI图片按钮只有非透明区域(透明阈值)可以点击功能实现(含源码)
  • 高级IO(五种IO模型介绍)
  • C# 多线程:并发编程的原理与实践
  • I2c、SPI、USB驱动架构类比
  • 2025年,Javascript后端应该用 Bun、Node.js 还是 Deno?
  • 欧姆龙E6B2-CWZ6C旋转编码器参数说明+示例代码
  • SQL详细语法教程(二)--DML(数据操作语言)和DQL(数据查询语言)
  • PostgreSQL——索引
  • 【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题
  • django request.data.get 的值修改
  • 基于Tensorflow2.15的图像分类系统
  • C++中的`auto`与`std::any`:功能、区别与选择建议
  • Android 在 2020-2025 都做哪些更新?
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.13
  • 数据治理之元数据管理
  • TensorFlow实现回归分析详解
  • PyTorch基础(使用TensorFlow架构)
  • CSS counter-reset 与 counter-increment:用 CSS 实现自动编号的黑科技
  • 【贪心算法】加油站
  • TensorFlow深度学习实战(31)——强化学习仿真库Gymnasium
  • 【IntelliJ IDEA】如何在pom.xml中去除maven中未使用的依赖
  • 七大排序算法全解析:从入门到精通
  • 各种排序算法(一)
  • Java开发环境搭建(WIN+IDEA+Maven)
  • STM32的UART奇偶校验注意
  • C# xml UI格式化字符串
  • IDEA创建一个VUE项目
  • 基于人工智能和物联网融合跌倒监控系统(LW+源码+讲解+部署)