完整教程:Flutter 中, Flame + flame_forge2d世界坐标和屏幕坐标对齐

news/2026/1/22 20:22:54/文章来源:https://www.cnblogs.com/yangykaifa/p/19518932

一、核心概念(先对齐心智模型)

  • Forge2D 的单位是米(m),你的刚体 Body/Fixture 的位置与尺寸都是米。
  • Flame 的渲染单位是逻辑像素(px)SpriteComponent/PositionComponentsize/position 默认用像素。
  • 需要一个**像素/米比例(PPM, pixels-per-meter)**把两者连起来,例如 PPM = 10 表示 1 米 = 10 像素。

只要你在“计算、事件输入、渲染尺寸”三个点都用同一套 PPM,就不会错位。


二、固定写法(推荐模板)

1)定义全局比例

const double PPM = 10.0; // 1m = 10px,可按需求调整
Vector2 worldToScreen(Vector2 w) => w * PPM;
Vector2 screenToWorld(Vector2 s) => s / PPM;

2)摄像机与坐标转换

  • 用户触摸/输入要落到世界坐标

    
    bool onTapDown(TapDownInfo info) {
    
    final screenPos = info.eventPosition.global;          // 屏幕像素
    final worldPos  = camera.viewfinder.screenToWorld(screenPos);
    // worldPos 现在是米(配合你设定的 PPM/zoom)
    return true;
    }
  • 在代码里不要自己写一套 camera 变换同时又用 PPM,否则会“双重缩放”。
    建议:用 Flame Camera 的 screenToWorld/worldToScreen 作为最终裁判。PPM 只用于「物理 ↔ 渲染尺寸」。

3)刚体与精灵对齐

  • 刚体:用米(Forge2D)
  • 精灵:用像素(Flame)
  • 关键:渲染尺寸 = 物理尺寸(米) × PPM
class Player extends BodyComponent {

final Vector2 sizeInMeters = Vector2(1.2, 0.8); // 物理尺寸:1.2m x 0.8m
late final SpriteComponent sprite;

Future<void> onLoad() async {await super.onLoad

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1201634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用系列 | CVPR 2025 SegMAN: Mamba与局部注意力强强联合,多尺度上下文注意力的新SOTA

论文题目&#xff1a;SegMAN: Omni-scale Context Modeling with State Space Models and Local Attention for Semantic Segmentation 论文作者&#xff1a;Yunxiang Fu, Meng Lou, Yizhou Yu (The University of Hong Kong) 代码地址&#xff1a;https:// github.com/yunxian…

自行车出口美国GCC认证16 CFR 1512标准解读

自行车出口美国必看&#xff01;16 CFR 1512认证攻略&#xff01; 一、为什么必须做GCC认证&#xff1f;亚马逊新规&#xff1a;成人/儿童/电动自行车上架美国站必须提供16 CFR 1512测试报告GCC证书&#xff01;无证产品下架流量限流最高罚10万美元。二、超全办理流程&#xff…

1.22随笔

其实昨天就大概看了下 Hive 的基础概念,知道它是用 SQL 来处理大数据的工具,不用写复杂的代码,刚好我之前接触过数据库的增删改查,上手起来不算太费劲。 今天还简单了解了下 Hive 的分区表,因为后续处理大数据的时…

AT_arc108_e [ARC108E] Random IS

考虑一个 \(O(n^3)\) 做法。设 \(f_{i, j}\) 为取到区间 \([i, j]\) 且 \(i, j\) 两端点都被取到的椅子数量期望是多少,最后用 \(n\) 减一下就可以了,转移就是枚举此时新选择的一个点 \(k\),然后你注意到 \([i, k -…

如何高效盘点电脑文件并实现内容级搜索?文件清单盘点与文档内容深度搜索实践

一、为什么“文件越来越多&#xff0c;却越来越难找” 在日常办公中&#xff0c;很多人都会遇到类似的问题&#xff1a; 文件散落在多个文件夹 文件名记不清&#xff0c;但大概记得内容 Word、PDF、Excel 混在一起 想盘点一下“我到底有哪些文件”&#xff0c;却无从下手 …

美国亚马逊UL产品标准检测报告要点

在电器、灯具、插头上常见的 UL 标志&#xff0c;是美国市场权威的安全认证象征&#xff0c;对亚马逊卖家尤为关键。若产品标错、用错甚至 “假用” UL 标志&#xff0c;不仅可能被亚马逊下架、召回&#xff0c;还会被平台通报安全风险&#xff0c;直接影响店铺运营与销量。 U…

Python 异步下载文件实战:使用 asyncio + aiohttp 实现高并发下载

在处理多个远程文件下载任务时&#xff0c;如果采用传统的同步方式&#xff08;如 requests.get() 逐个下载&#xff09;&#xff0c;程序会因等待网络 I/O 而长时间阻塞&#xff0c;效率极低。 本文将教你如何使用 Python 的异步编程模型&#xff08;asyncio&#xff09;配合…

ASTM F1989-05(R2013) 烹饪用灭火毯标准

ASTM F1989-05(R2013)是由ASTM国际组织制定的烹饪用灭火毯专项标准&#xff0c;明确了住宅及商业环境中&#xff0c;用于扑灭或控制小型烹饪火灾的灭火毯类产品的核心要求&#xff0c;为厨房消防安全产品的研发、生产提供了统一依据。 该标准的适用范围覆盖各类厨房消防安全相关…

wait和notify

wait和notify是协调线程之间执行逻辑的顺序的功能&#xff0c;他和join和synchronized的区别是什么呢&#xff1f;join指的是等待一个线程的结束&#xff0c;这个线程才结束&#xff0c;也就是假如我在main线程中使用了t1.join代表的是main线程得等到t1线程结束了他才能结束&am…

5 大用例设计笔试大题,附超详细解析!

马上到找工作的金三银四&#xff0c;很多人又双叒叕被笔试中用例设计大题难住了&#xff01;本文章特意整理了最近学员反馈的 5 大用例设计大题&#xff0c;附超详细解答&#xff01; 1.出租车计费软件 答案解析&#xff1a; 1 题答案&#xff1a; 公里跟 km 需求单位最好统…

第八天|151.翻转字符串里的单词 55.右旋转字符串 459.重复的子字符串

第八天 151.翻转字符串里的单词 字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili 151.翻转字符串里的单词 | 代码随想录 笔记 怎么去掉多余空格?和数组删除元素那个很像,双指针遍历即可…

程序员棋谱之一——单例模式

单例模式呢是一种设计模式&#xff1b;什么是设计模式呢&#xff1f;这就相当于一个下棋中的一个族谱&#xff0c;我们学习设计模式可以提高我们写代码的下限&#xff0c;但如果想提高上限就得靠自己了。目前呢主流的设计模式有26种&#xff0c;我们今天聊聊单例模式。单例模式…

rpc节点: synchronized (this) + 双检锁,在 race condition 的情况下分析

结合rpc节点刷新业务&#xff0c;讲解 Java 中 synchronized (this) 的作用、原理和在代码里的具体意义。 这段代码的核心逻辑回顾 public SolanaRpcClient client() {SolanaRpcClient client this.healthyClient;// 定期检查健康状态if (client null || System.currentTim…

二进制不同位数【牛客tracker 每日一题】

二进制不同位数 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 知识点&#xff1a;位运算 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取…

MAC 怎样加密压缩 zip 包?

Mac上加密压缩ZIP包有三种主流方式:终端命令行(原生免费,无需额外软件)、第三方图形化工具(操作简单,支持更强加密)、以及Ventura及更新系统的Finder扩展(部分用户可用)。以下是详细步骤与对比。 一、终端命令行加密(推荐,原生无依赖) macOS自带zip命令支持加密,…

救命神器10个AI论文写作软件,助本科生轻松搞定毕业论文!

救命神器10个AI论文写作软件&#xff0c;助本科生轻松搞定毕业论文&#xff01; 论文写作的救星&#xff0c;AI 工具如何改变你的学习方式 在当今这个信息爆炸的时代&#xff0c;本科生的学术写作任务变得越来越繁重。无论是课程论文还是毕业论文&#xff0c;都需要大量的时间和…

Pixels 医疗影像一站式解决方案从入门到精通

Pixels 医疗影像一站式解决方案从入门到精通 各位搞医疗影像的小伙伴些&#xff0c;你们有没有遇到过这种尴尬&#xff1a;DICOM 文件堆得到处都是&#xff0c;想找个病例翻半天&#xff0c;数据格式复杂得让人头大&#xff0c;更别说还要做 AI 分析了。莫慌&#xff0c;今天给…

Linux 内存管理中的 Overcommit(过度分配)机制及OOM Killer 的处理逻辑详解

您描述的是 Linux 内存管理中的 Overcommit&#xff08;过度分配&#xff09;机制 及其潜在风险&#xff0c;以及 OOM Killer 的处理逻辑。下面我将这一过程和相关概念系统地梳理一下。 1. 内存分配机制 Linux 内核中&#xff0c;应用程序通过 malloc() 等函数请求内存时&…

MySQL InnoDB Cluster升级到MySQL 8.4.x

MySQL InnoDB Cluster升级到MySQL 8.4.x2026-01-22 20:11 潇湘隐者 阅读(0) 评论(0) 收藏 举报上一篇文章总结了MySQL单实例从MySQL 8.0.35 升级到MySQL 8.4.x版本,这里简单总结一下MySQL InnoDB Cluster的升级到M…

LangGraph MCP Tool Calling Agent:让企业级智能体开发不再头大

LangGraph MCP Tool Calling Agent&#xff1a;让企业级智能体开发不再头大 用 LangGraph 开发复杂的 AI 智能体时&#xff0c;头疼的可能不是代码逻辑处理&#xff0c;而是如何让智能体安全、高效地访问企业内部的数据和工具。这个问题困扰了不少开发者&#xff0c;搞不好还要…