【问题标题】:Obstacles are removed faster than the bullet animation passes障碍物被移除的速度比子弹动画通过的速度更快
【发布时间】:2022-01-31 19:39:51
【问题描述】:

情况:坦克有一个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 抱歉,我用的是谷歌翻译。

【问题讨论】:

  • 如果您想获得调试帮助,您需要提供minimal reproducible example。请仔细研究链接页面,您不应提供整个应用程序,而应提供仅复制问题并仅通过复制和粘贴即可编译和运行的内容。需要提供复制所需的所有资源,无论是图像还是替换形状像圆形的图像。

标签: java javafx


【解决方案1】:

正如@jewelsea 建议的那样,您需要提供minimal reproducible example 以获得一些适当的帮助。

话虽如此,根据您提供的代码,以下是我的初步分析。请注意,这是通过阅读代码进行的粗略分析。所以一切都只是一个假设;)

代码的第一部分(do-while)是确定子弹需要行进的距离(确定register的值)

第二部分是启动子弹动画以从其当前位置平移(使用register值)。

第三部分是给子弹设置最终的translate值,最后是检查边界是否相交并删除节点。

我认为不需要第三部分(代码行下方),这可能是您的问题的原因。您正在将值更新为最终值并立即检查它是否相交。这将是真实的并且会立即删除。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2017-10-08
    • 2011-06-27
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多