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

JS小行星游戏:玩家跨屏幕重生的三角函数公式简化需求

优化小行星飞船旋转顶点坐标计算方案

问题背景

开发JS小行星游戏时,设定飞船(三角形,中心原点顶点为(30, 0)、(-10, 10)、(-10, -10))完全飞出屏幕后在对面边缘重生。当前仅在三个顶点全部离开屏幕时触发传送,但计算旋转后顶点相对飞船中心坐标的代码冗余,需要更简洁的实现方式。

简洁实现思路

直接利用2D旋转矩阵计算每个顶点旋转后的坐标,替代手动计算角度和距离的方式。对于任意点(x, y),绕原点旋转θ后的坐标公式为:

  • 旋转后x坐标:x * cosθ - y * sinθ
  • 旋转后y坐标:x * sinθ + y * cosθ

该公式能直接得到顶点相对于飞船中心的偏移量,无需额外计算距离或角度偏移,代码更直观易维护。

代码示例

// 定义飞船原始顶点(相对于自身中心)
const shipBaseVertices = [
  { x: 30, y: 0 },
  { x: -10, y: 10 },
  { x: -10, y: -10 }
];

// 计算旋转后的顶点相对坐标
const cosRot = Math.cos(this.rotation);
const sinRot = Math.sin(this.rotation);
const rotatedVertices = shipBaseVertices.map(vertex => ({
  x: vertex.x * cosRot - vertex.y * sinRot,
  y: vertex.x * sinRot + vertex.y * cosRot
}));

后续使用说明

得到旋转后的相对坐标后,只需加上飞船中心的绝对坐标(比如this.x、this.y),就能获取每个顶点在Canvas上的绝对位置,进而判断是否全部超出屏幕边界:

// 假设屏幕宽高为canvasWidth、canvasHeight
const allOffScreen = rotatedVertices.every(vertex => {
  const absX = this.x + vertex.x;
  const absY = this.y + vertex.y;
  return absX < 0 || absX > canvasWidth || absY < 0 || absY > canvasHeight;
});

if (allOffScreen) {
  // 执行屏幕边缘重生逻辑
}

内容的提问来源于stack exchange,提问作者Coolpaper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:47:49