障碍物的移除速度比子弹动画通过的速度快

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();