障碍物的移除速度比子弹动画通过的速度快
Obstacles are removed faster than the bullet animation passes
情况:坦克有一个Shot()
方法和一个代码,检查子弹发射后是否击中障碍物。子弹沿 X 坐标向上飞行。 do...while
循环检查子弹在没有障碍物的情况下可以行进多远。之后,子弹飞行本身的动画通过 TranslateTransition
发生。最后一个循环遍历所有游戏障碍并通过 intersects
检查接触,如果成功,则移除障碍。
do {
y = (int) (bulletObj.getImageBullet().getTranslateX() + register) / PlayField.BRICK_SIZE;
x = (int) bulletObj.getImageBullet().getTranslateY() / PlayField.BRICK_SIZE;
line = LevelData.LevelOne[x][y];
register += 1;
} while (line.equals("0"));
System.out.println(System.currentTimeMillis()); // 1643642047472 ms.
bulletTranslate = new TranslateTransition();
bulletTranslate.setFromX(bulletObj.getImageBullet().getTranslateX());
bulletTranslate.setToX(bulletObj.getImageBullet().getTranslateX() + register - 18);
bulletTranslate.setNode(bulletObj.getImageBullet());
bulletTranslate.setDuration(Duration.millis(register)); // Let register = 300 мs.
bulletTranslate.play();
System.out.println(System.currentTimeMillis()); // 1643642047474 ms.
bulletObj.getImageBullet().setTranslateX(bulletObj.getImageBullet().getTranslateX() + register - 18);
for (GameObject platform: PlayField.platforms) {
if (platform.getImage().getBoundsInParent().intersects(bulletObj.getImageBullet().getBoundsInParent()))
{
System.out.println(System.currentTimeMillis()); // 1643642047474 ms.
tankRoot.getChildren().remove(platform.getImage());
PlayField.platforms.remove(platform);
LevelData.LevelOne[x][y] = "0";
break;
}
}
一切正常,但只有一个问题。
问题是障碍物体的移除速度比动画子弹通过的速度快
而且联系后必须同时删除
如何解决问题?
拍摄前
射击后,物体在子弹飞行过程中消失
P.S 抱歉,我用了 google 翻译。
正如@jewelsea 所建议的,您需要提供 minimal reproducible example 才能获得适当的帮助。
话虽如此,根据您提供的代码,以下是我的初步分析。请注意,这是通过阅读代码进行的粗略分析。所以一切都只是一个假设 ;)
第一部分代码(do-while)是判断子弹需要移动的距离(判断register
的值)
第二部分是启动子弹动画从其当前位置平移(使用 register
值)。
第三部分是给bullet设置最终translate值,最后是检查bounds是否相交并删除节点。
我认为第三部分(代码行下方)是不需要的,可能是导致您出现问题的原因。您正在将值更新为最终值并立即检查它是否相交..这将是真实的并将立即删除。
bulletObj.getImageBullet().setTranslateX(bulletObj.getImageBullet().getTranslateX() + register - 18);
尝试将您的 'for' 循环代码移动到翻译的 onFinished
。有点像..
bulletTranslate = new TranslateTransition();
bulletTranslate.setFromX(bulletObj.getImageBullet().getTranslateX());
bulletTranslate.setToX(bulletObj.getImageBullet().getTranslateX() + register - 18);
bulletTranslate.setNode(bulletObj.getImageBullet());
bulletTranslate.setDuration(Duration.millis(register)); // Let register = 300 мs.
bulletTranslate.setOnFinished(e->{
for (GameObject platform: PlayField.platforms) {
if (platform.getImage().getBoundsInParent().intersects(bulletObj.getImageBullet().getBoundsInParent()))
{
tankRoot.getChildren().remove(platform.getImage());
PlayField.platforms.remove(platform);
LevelData.LevelOne[x][y] = "0";
break;
}
}
});
bulletTranslate.play();
情况:坦克有一个Shot()
方法和一个代码,检查子弹发射后是否击中障碍物。子弹沿 X 坐标向上飞行。 do...while
循环检查子弹在没有障碍物的情况下可以行进多远。之后,子弹飞行本身的动画通过 TranslateTransition
发生。最后一个循环遍历所有游戏障碍并通过 intersects
检查接触,如果成功,则移除障碍。
do {
y = (int) (bulletObj.getImageBullet().getTranslateX() + register) / PlayField.BRICK_SIZE;
x = (int) bulletObj.getImageBullet().getTranslateY() / PlayField.BRICK_SIZE;
line = LevelData.LevelOne[x][y];
register += 1;
} while (line.equals("0"));
System.out.println(System.currentTimeMillis()); // 1643642047472 ms.
bulletTranslate = new TranslateTransition();
bulletTranslate.setFromX(bulletObj.getImageBullet().getTranslateX());
bulletTranslate.setToX(bulletObj.getImageBullet().getTranslateX() + register - 18);
bulletTranslate.setNode(bulletObj.getImageBullet());
bulletTranslate.setDuration(Duration.millis(register)); // Let register = 300 мs.
bulletTranslate.play();
System.out.println(System.currentTimeMillis()); // 1643642047474 ms.
bulletObj.getImageBullet().setTranslateX(bulletObj.getImageBullet().getTranslateX() + register - 18);
for (GameObject platform: PlayField.platforms) {
if (platform.getImage().getBoundsInParent().intersects(bulletObj.getImageBullet().getBoundsInParent()))
{
System.out.println(System.currentTimeMillis()); // 1643642047474 ms.
tankRoot.getChildren().remove(platform.getImage());
PlayField.platforms.remove(platform);
LevelData.LevelOne[x][y] = "0";
break;
}
}
一切正常,但只有一个问题。
问题是障碍物体的移除速度比动画子弹通过的速度快
而且联系后必须同时删除
如何解决问题?
拍摄前
射击后,物体在子弹飞行过程中消失
P.S 抱歉,我用了 google 翻译。
正如@jewelsea 所建议的,您需要提供 minimal reproducible example 才能获得适当的帮助。
话虽如此,根据您提供的代码,以下是我的初步分析。请注意,这是通过阅读代码进行的粗略分析。所以一切都只是一个假设 ;)
第一部分代码(do-while)是判断子弹需要移动的距离(判断register
的值)
第二部分是启动子弹动画从其当前位置平移(使用 register
值)。
第三部分是给bullet设置最终translate值,最后是检查bounds是否相交并删除节点。
我认为第三部分(代码行下方)是不需要的,可能是导致您出现问题的原因。您正在将值更新为最终值并立即检查它是否相交..这将是真实的并将立即删除。
bulletObj.getImageBullet().setTranslateX(bulletObj.getImageBullet().getTranslateX() + register - 18);
尝试将您的 'for' 循环代码移动到翻译的 onFinished
。有点像..
bulletTranslate = new TranslateTransition();
bulletTranslate.setFromX(bulletObj.getImageBullet().getTranslateX());
bulletTranslate.setToX(bulletObj.getImageBullet().getTranslateX() + register - 18);
bulletTranslate.setNode(bulletObj.getImageBullet());
bulletTranslate.setDuration(Duration.millis(register)); // Let register = 300 мs.
bulletTranslate.setOnFinished(e->{
for (GameObject platform: PlayField.platforms) {
if (platform.getImage().getBoundsInParent().intersects(bulletObj.getImageBullet().getBoundsInParent()))
{
tankRoot.getChildren().remove(platform.getImage());
PlayField.platforms.remove(platform);
LevelData.LevelOne[x][y] = "0";
break;
}
}
});
bulletTranslate.play();