【问题标题】:How to do a Ray/Direction 2D system?如何做一个 Ray/Direction 2D 系统?
【发布时间】:2019-04-12 04:44:22
【问题描述】:

首先,很抱歉我的英语不是那么好,因为我是巴西人,所以我会尽量体面地描述我的问题。

嗯,我正在开发一个基于图块的 2D 游戏。在实体中,我正在创建一个 Projectile 类。目前,Projectile 可以向北/向南/向西/向东移动,但我需要使其向任何方向移动。我搜索了一下,但没有找到任何关于 Ray 2D 的好的教程或示例(仅找到关于基于光线的照明)。

例如:

x        
 \           x
  \         /
   \       /
    f     f

[x = projectile start position, f = projectile end position]

假设弹丸由 X 和 Y 组成(宽度和高度无关紧要)并且每刻都会移动,我该如何实现呢?

【问题讨论】:

  • 我不确定您要的是哪些信息。是如何绘制弹丸的轨迹吗?或者你需要知道如何计算轨迹?向您提供一些提示您遇到困难的地方会有所帮助。
  • 我需要计算轨迹
  • @HarryBlargle 我认为 OP 不想知道如何画线。 Plus OP 提到了 LWJGL,所以后端渲染也是如此。
  • @LeeALlan 您可以使用该算法找到每个滴答声中弹丸应该在的位置

标签: vector language-agnostic raytracing projectile


【解决方案1】:

我没有使用 lwjgl 的经验。

不过,对我来说,这似乎是一道数学题。因此,如果您知道“轨迹”的距离和角度,您可以将极坐标(距离、角度)转换为笛卡尔坐标(x、y)。

转换很简单: x = distance * cos(angle)y = distance * sin(angle)。 然后只需添加起始坐标的 x 和 y 即可。

我建议使用examples of processing 来感受一下 lwjgl 中的解决方案。

作为处理的启动器,您可以使用这个 sn-p:

//start coordinates
float startx;
float starty;

//radius
float r;
//angle
float theta;


void setup() {
    size(640, 360);
    background(0);

   // Initialize all values
   startx = width/2;
   starty = height/2;
   r = random(startx);
   theta = -0.5;
}

void draw() {
    // Translate the origin point to the center of the screen
    translate(startx, starty);

   // Convert polar to cartesian
   float x = r * cos(theta);
   float y = r * sin(theta);

   // Draw the ellipse at the cartesian coordinate
   ellipseMode(CENTER);
   fill(200);
   ellipse(x, y, 12, 12);

   color c = #FFCC00;
   stroke(c);
   line(0,0,x,y);
}

【讨论】:

    【解决方案2】:

    假设您要询问如何将一个点每帧移动一个固定量,这很简单: 弹丸已经有一个 X 和 Y(它的位置),我建议为其方向/速度创建另一个 X 和 Y,然后在每一帧上将速度添加到该位置(Position += velocity)。因为您要添加到当前位置,所以方向/速度对于该对象来说是局部的,例如,如果您想要正确,只需将方向/速度的 X 设为正。

    我不认为使用光线进行简单的移动是一种非常有效的方法,除非您要实现与瓷砖的碰撞(如果是这样,链接将对此有所帮助) - 无论如何您都需要存储方向。

    我建议查找向量(基本上是将 X 和 Y 作为一类有用的函数)。它们对于存储位置和方向等坐标非常有用。
    Here 是我想学习光线时遵循的教程,它很好地介绍了向量和编程的一般数学方面。

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多