试图用Java创建一个旋转的旋转轮

时间:2017-04-05 04:43:41

标签: java processing

我目前正在开展一个小型项目,我正在创建一个简单的棋盘式旋转轮。用户将按下按钮,旋转器将随机落在四种颜色中的一种(红色,绿色,黄色或蓝色)。我遇到的麻烦是让旋转器旋转一圈(或顺时针)并随机落在四个正方形之一的随机位置。

Screenshot of game thus far

源代码:

void setup() { // this is run once
  size(800, 800);
}

void draw() { //  this is run repeatedly
  background(255);
  strokeWeight(2);
  fill(255,0,0);
  rect(100,100,300,300);
  fill(0,96,255);
  rect(100, 400, 300, 300);
  fill(255,240,0);
  rect(400, 100, 300, 300);
  fill(0,255,0);
  rect(400, 400, 300, 300);

  // how to rotate this part like a spinner?
  strokeWeight(20);
  line(400, 400, 400, 600);
}
然后我需要弄清楚如何确定旋转器落在哪种颜色上,并打印出“你已经落在[旋转器所着的颜色]上”的文字。我很难理解旋转后确定坐标的Matrix方面。

我在处理开发平台上用Java编写代码。

2 个答案:

答案 0 :(得分:0)

不幸的是,在编程时使用圆和坐标可能有点棘手。您将不得不在极坐标和笛卡尔坐标之间进行一些转换。 Here's a great reference to the difference between the two.

因此,您需要首先生成0到2 PI(Radians)之间的随机数,这在处理过程中很容易完成: float rnd = random(0, TWO_PI);

接下来需要让它转换为正常坐标:

 float x = 200 * cos(rnd);
 float y = 200 * sin(rnd);

最后画出一行:line(400, 400, x + 400, y + 400);

编辑:忘记处理的时间为rotate(),这是一个比这个混乱更好的解决方案

答案 1 :(得分:0)

您的第一步是了解在不旋转整个草图的情况下隔离到一个形状的旋转。我们的代码模式涉及pushMatrixpopMatrixtranslaterotate - 所有这些都是相互结合的。

// inside draw
pushMatrix();
translate(400, 400);
rotate(radians(rotation));
line(0, 0, 100, 100);
popMatrix();

rotation += 5;

translate函数将原点移动到新位置,在本例中为400,400。原点移动后绘制的任何形状都相对于它。这就是在新原点(实际为400,400)上绘制0,0行的原因。函数pushMatrixpopMatrix隔离了此代码,以免影响草图的其余部分。这是一个很好的技巧,可以在草图中创建独立的旋转(以及其他任何东西),而不必提出数学公式来抵消你的所有动作。想象一下五个旋转器的速度和方向不同。

对于逐渐减速的微调器,我引入一个stepSize变量并慢慢减小它并从旋转中减去它,直到旋转达到零并且微调器停止。

// still inside draw
if (stepSize > 0) {
  rotation += stepSize;
  stepSize -= 0.05; // play around with this value
}

这是一个演示程序,将所有部分组合在一起,以实现一个可以移动一段时间然后停止的微调器。

float rotation = 1, stepSize = 10;

void setup() {
  size(800, 800);
}

void draw() {
  background(255);
  strokeWeight(2);
  fill(255, 0, 0);
  rect(100, 100, 300, 300);
  fill(0, 96, 255);
  rect(100, 400, 300, 300);
  fill(255, 240, 0);
  rect(400, 100, 300, 300);
  fill(0, 255, 0);
  rect(400, 400, 300, 300);
  strokeWeight(20);

  pushMatrix();
  translate(400, 400);
  rotate(radians(rotation));
  line(0, 0, 100, 100);
  popMatrix();

  if (stepSize > 0) {
    rotation += stepSize;
    stepSize -= 0.05; // play around with this value
  }
}

void mousePressed() {
  stepSize = random(5,15); // try adjusting these values
}