Files
shooter-demo/tools/flashfin-rapier2d/assets/scripts/RapierDebugRenderer.ts

100 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-11-30 20:56:51 +08:00
import { _decorator, Component, Graphics, Color } from 'cc';
const { ccclass, property } = _decorator;
// import RAPIER from '@dimforge/rapier2d';
export const RAPIER_PTM_RATIO:number = 32.0;
@ccclass('RapierDebugRenderer')
export class RapierDebugRenderer extends Component {
@property(Graphics)
graphics: Graphics = null!;
// 可选:可调整的线宽
@property
lineWidth: number = 1.0;
// 可选:坐标缩放系数
@property
scale: number = RAPIER_PTM_RATIO;
@property
onoff: boolean = false;
private _world: any = null; // RAPIER.World 类型
/**
*
* @param world RAPIER物理世界实例
*/
public setWorld(world: any) {
this._world = world;
}
/**
*
*/
update() {
if (!this._world || !this.graphics) return;
this.onoff && this.render(this._world);
}
clear(){
this.graphics&&this.graphics.clear();
}
/**
*
* @param world RAPIER物理世界
*/
render(world: any) {
// 获取调试渲染数据
const { vertices, colors } = world.debugRender();
// 清除之前的绘制内容
this.graphics.clear();
// const g = this.graphics;
// g.lineWidth = 10;
// g.fillColor.fromHEX('#ff0000ff');
// g.moveTo(-40, 0);
// g.lineTo(0, -80);
// g.lineTo(40, 0);
// g.lineTo(0, 80);
// g.close();
// g.stroke();
// g.fill();
// 遍历所有线段进行绘制
for (let i = 0; i < vertices.length / 4; i++) {
// 从颜色数组中获取当前线段的颜色
const r = Math.floor(colors[i * 8] * 255); // 转换为 0-255 范围
const g = Math.floor(colors[i * 8 + 1] * 255);
const b = Math.floor(colors[i * 8 + 2] * 255);
const a = colors[i * 8 + 3] * 255; // alpha 直接使用 0-255 范围
// 设置线条样式
this.graphics.lineWidth = this.lineWidth;
this.graphics.strokeColor = new Color(r, g, b, a);
// 获取线段的起点和终点坐标
// 注意Cocos Creator 使用左下角为原点的坐标系y轴向上为正
// 而 RAPIER 可能使用不同的坐标系,因此这里做适当调整
// 获取原始坐标
let x1 = vertices[i * 4] * this.scale;
let y1 = vertices[i * 4 + 1] * this.scale;
let x2 = vertices[i * 4 + 2] * this.scale;
let y2 = vertices[i * 4 + 3] * this.scale;
// 执行绘制
this.graphics.moveTo(x1, y1);
this.graphics.lineTo(x2, y2);
this.graphics.close();
this.graphics.stroke();
}
}
}