Java Processing使用箭头键来实现目标

时间:2017-05-22 22:53:56

标签: processing

我正在使用Java Processing 3并制作双人坦克游戏。下面是我的炮塔代码。目前我的目标是跟随tDir中的鼠标,我希望能够使用向上和向下箭头将目标从0度向上和向下移动90度。

我该怎么做?感谢。

/*
Uzair
*/

PVector mPos; //mouse position
PVector tPos; //position of turret
PVector tDir; //the firing direction of the turret
 int gravMult = 3;

void setup() {
  size(1200, 600);
  init();
}

void init() {
  //PVector initializations
  mPos = new PVector(); //zero til mouse x and y exist
  tPos = new PVector(width/8, height);
  tDir = new PVector(); //
}
void draw() { 
  //clear last frame
  background(100,100,140);

  //check keys to see if there is new key input for turret
  if (keyPressed){
    if (key == 'w'){
      tDir.y -= 10;
    }
    else if (key == 's'){
      tDir.y += 10;
    }
  }

  mPos.set(mouseX, mouseY);
  tDir = PVector.sub(mPos, tPos);
  tDir.normalize();
  tDir.mult(50);

  //draw
  fill(255);  
  ellipse(tPos.x, tPos.y, 40, 40);
  strokeWeight(5);
  line(tPos.x, tPos.y, tPos.x + tDir.x, tPos.y + tDir.y);
  fill(255, 0, 0);
  ellipse(tPos.x + tDir.x, tPos.y + tDir.y, 10, 10);
}

2 个答案:

答案 0 :(得分:1)

Stack Overflow并非真正针对一般"我如何做到这一点"输入问题。这是特定的"我试过X,期望Y,但得到了Z而不是#34;输入问题。话虽如此,我会尝试在一般意义上提供帮助。

您需要将问题分解为更小的步骤,并逐个执行这些步骤。您可以创建一个单独的独立草图,只需在按箭头键时向控制台输出内容吗?

与该草图分开,您是否可以创建另一个草图,在草图顶部的变量中存储位置或角度?使用这些变量绘制场景,并再次使其自行工作。

当你让它们自己工作时,你可以考虑通过在用户按下箭头键时更改草图级变量来组合它们。

如果您遇到某个特定步骤,请在新问题中发布MCVE,我们会从那里开始。祝你好运。

答案 1 :(得分:1)

  

从0到90度向上和向下瞄准

这听起来像是增加角度/旋转而不是像现在一样递增y位置。

你需要将极坐标(角度/半径)转换为笛卡尔坐标(x,y)。

这可以使用公式来完成:

x = cos(angle) * radius
y = sin(angle) * radius

在你的情况下

tDir.x = cos(angle) * 50;
tDir.y = sin(angle) * 50;

...虽然值得记住,PVector已经通过fromAngle()提供了这项功能。

您的代码已调整为使用此提示:

PVector mPos; //mouse position
PVector tPos; //position of turret
PVector tDir; //the firing direction of the turret
 int gravMult = 3;
//angle in radians
float angle = 0;

void setup() {
  size(1200, 600);
  init();
}

void init() {
  //PVector initializations
  mPos = new PVector(); //zero til mouse x and y exist
  tPos = new PVector(width/8, height * .75);
  tDir = new PVector(); //
}
void draw() { 
  //clear last frame
  background(100,100,140);

  //check keys to see if there is new key input for turret
  if (keyPressed){
    if (key == 'w'){
      angle -= 0.1;
      tDir = PVector.mult(PVector.fromAngle(angle),50);
    }
    else if (key == 's'){
      angle += 0.1;
      tDir = PVector.mult(PVector.fromAngle(angle),50);
    }
  }else if(mousePressed){
    mPos.set(mouseX, mouseY);
    tDir = PVector.sub(mPos, tPos);
    tDir.normalize();
    tDir.mult(50);
  }
  //draw
  fill(255);  
  ellipse(tPos.x, tPos.y, 40, 40);
  strokeWeight(5);
  line(tPos.x, tPos.y, tPos.x + tDir.x, tPos.y + tDir.y);
  fill(255, 0, 0);
  ellipse(tPos.x + tDir.x, tPos.y + tDir.y, 10, 10);
}

您可能还会发现this answer有帮助。