因此,我试图沿屏幕上鼠标位置指示的方向移动弹丸。我已经将鼠标坐标转换为游戏中坐标,但是我无法弄清楚如何将弹丸正确地移动到正确的方向。我正在尝试使用一个坡度来移动弹丸,但是它似乎并不想抓住正确的坡度,因此我最终使它们以完全错误的方向飞行。这是我正在使用的一些代码。在此方面的任何帮助将不胜感激,因为我对此有些不知所措。
注意:射弹不跟随鼠标。它应该保存坐标,然后朝那个方向前进,注意它也可以相同的速率经过给定的坐标。
实体创作
int[] mousePos = MouseManager.getCalculatedMouseCoordinates();
float deltaX = mousePos[0] - GameManager.x;
float deltaY = mousePos[1] - GameManager.y;
float m = deltaY/deltaX;
System.out.println(m);
GameManager.currentWorld.addEntity(new EntityProjectile(GameManager.x, GameManager.y, 30, m, 50, "fireball"));
弹丸类
package UnNamedRpg.Player.Entity;
public class EntityProjectile {
private double x, y;
private int entityID = -1;
private int speed;
private double headerX, headerY;
private int renderHeading;
private double range, currentRange = 0;
private String texture;
private double factor = -1;
public EntityProjectile(double startX, double startY, int speed, double headerX, double headerY, double range, String texture){
setX(startX);
setY(startY);
setSpeed(speed);
setHeaderX(headerX);
setHeaderY(headerY);
setTexture(texture);
setRange(range);
}
public void doTick(){
double vx = this.x - this.headerX;
double vy = this.y - this.headerY;
if(this.factor == -1){
double length = Math.sqrt((vx*vx) + (vy*vy));
double factor = this.speed / length;
this.factor = factor;
}
vx *= factor;
vy *= factor;
this.x = vx;
this.y = vy;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getRenderHeading() {
return renderHeading;
}
public void setRenderHeading(int renderHeading) {
this.renderHeading = renderHeading;
}
public int getEntityID() {
return entityID;
}
public void setEntityID(int entityID) {
this.entityID = entityID;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public String getTexture() {
return texture;
}
public void setTexture(String texture) {
this.texture = texture;
}
public double getRange() {
return range;
}
public void setRange(double range) {
this.range = range;
}
public double getCurrentRange() {
return currentRange;
}
public void setCurrentRange(double currentRange) {
this.currentRange = currentRange;
}
public double getHeaderX() {
return headerX;
}
public void setHeaderX(double headerX) {
this.headerX = headerX;
}
public double getHeaderY() {
return headerY;
}
public void setHeaderY(double headerY) {
this.headerY = headerY;
}
public double getFactor() {
return factor;
}
public void setFactor(double factor) {
this.factor = factor;
}
}
更新职位方法
-现在,每一个滴答声都在EntityProjectile类中调用,而不是在世界滴答声中发生。
使用一些基本的矢量数学,向给定点移动相对简单。您要移动的向量仅通过坐标减法即可计算:
vx = objectX - mouseX
vy = objectY - mouseY
但是您可能希望将对象移动到比bam慢一些,因此您需要将矢量缩放到所需的长度(每游戏滴答速度相等)。向量的当前长度由毕达哥拉斯sqrt(a * a + b * b)获得。要将向量缩放到给定的长度,只需将分量乘以所需的因子即可:
double targetLength = 5.0; // chosen arbitrarily
double length = Math.sqrt(vx * vx + vy * vy);
double factor = targetLength / length;
vx *= factor;
vy *= factor;
在那里,您有速度分量x,y可以用作每个游戏滴答的增量。5.0是对象每跳动的“速度”。
编辑:@Cyphereion关于向量的长度,从几何学上讲,是三角形的底面,请参见https://en.wikipedia.org/wiki/Pythagorean_theorem(被视为常识)。
一旦有了这些,您只需要通过计算比例因子来调整每个组件的长度,该比例因子可使基准线作为所需的“速度”长度出现。组件(vx,vy)的原始值表示一个矢量(请参见:https://en.wikipedia.org/wiki/Euclidean_vector#Representations),该矢量编码要移动的方向。
缩放矢量的长度可以调整将矢量分量作为增量应用到其位置时对象的移动速度(这只是矢量加法)。我交换了除法长度/ targetLength initailly(现已确定),所以速度变量的含义相反(较大=较慢,而不是较大=较快)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句