我正在使用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);
}
答案 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有帮助。