我正在尝试用JavaFX(焦土)为我的游戏制作动画镜头。有人告诉我,因为我不使用gameloop,最好的方法是使用插值器进行自定义转换,但是在观看了javadocs之后,我似乎无法弄清楚。这是被击中的子弹
public void shootBullet(int angle, int v0, double wind) throws ArtilleryException {
try {
double speed = v0;
Tank playerTank = GamePresenter.getPlayers()[0].getTank();
xValues.clear();
yValues.clear();
double cornerRadians = Math.toRadians(angle);
double endX = GameView.CANVAS_WIDTH;
for (int x = 0; x < endX - playerTank.getPosX(); x++) {
int y = (int) (-G / 2 / pow((speed * cos(cornerRadians) - wind), 2) * pow((x), 2) + (x) * sin(cornerRadians) / (cos(cornerRadians) - wind / speed) + playerTank.getPosY());
if (x + playerTank.getPosX() + Tank.getWIDTH() < GameView.CANVAS_WIDTH) {
xValues.add(x + playerTank.getPosX() + Tank.getWIDTH());//
yValues.add(-y + (playerTank.getPosY() + playerTank.getPosY()) - Tank.getHEIGHT() / 2);
}
}
} catch (NumberFormatException e) {
throw new ArtilleryException("Couldn't shoot");
}
}
我基本上想做的是通过xValue列表和yValue列表上的动画显示图像。有人能给我一些关于如何填写公共无效插值(双压裂)方法的基本指南吗?
你为什么不直接使用PathTranpse而不是构建你自己的。从你的x、y坐标,你可以很容易地创建一个Path对象,然后你可以使用PathTranplace沿着这个路径为ImageView设置动画。
解决方案:我决定使用路径转换
private PathTransition makePathTrans(List<Integer> xCor, List<Integer> yCor) {
view.getPath().getElements().clear();
view.getPath().getElements().add(new MoveTo(xCor.get(0), yCor.get(0)));
for (int i = 0; i < xCor.size(); i++) {
view.getPath().getElements().add(new LineTo(xCor.get(i), yCor.get(i)));
}
PathTransition pthTrans = new PathTransition(Duration.seconds(2), view.getPath(), view.getBullet());
pthTrans.setCycleCount(1);
pthTrans.setInterpolator(Interpolator.LINEAR);
pthTrans.setAutoReverse(false);
return pthTrans;
}
//in my presenter
view.getBullet().setVisible(true);
PathTransition shot = makePathTrans(xCor, yCor);
shot.play();