JavaFX 游戏中的图形:帮我解决这个问题

Graphics in JavaFX game : Help me solve this

我目前正在制作一个简单的 2d 游戏,例如 flappy bird。对于那些不熟悉这个的人来说,这款游戏是一款横向卷轴游戏,玩家控制一个物体,试图在一排排霓虹灯管之间飞行而不撞到它们。在此 Example 您可以看到 UFO(initFrog) 并没有完全接触到霓虹灯管。但是,由于霓虹灯管上的发光效果是 .png 文件的一部分,因此 UFO 将其识别为交点。有一个计时器设置为在两者相交时停止(查看下面的最后一段代码)。

那么当 UFO 撞击霓虹灯本身时,我怎样才能让计时器停止,而不仅仅是霓虹灯发光?

    private Node initFrog() {
    ImageView falc = new ImageView();
    falc.setImage(milFalc);
    falc.setTranslateY(300-39);
    falc.setTranslateX(240);
    falc.setScaleX(.3);
    falc.setScaleY(.3);
    return falc;
    }

private Node ships() {
    int haut = (int)(Math.random()*600);
    ImageView sheep = new ImageView();
    sheep.setImage(Orbs);
    sheep.setTranslateY(haut-500);
    sheep.setTranslateX(800);
    sheep.setScaleX(.017);
    sheep.setScaleY(.017);
    root.getChildren().add(sheep);
    return sheep;
    }

private Node initNeon() {
    int haut = (int)(Math.random()*260);
    ImageView neona = new ImageView();
    neona.setImage(neon1);
    neona.setTranslateY(haut-200);
    neona.setTranslateX(800);
    neona.setRotate(90);
    neona.setScaleX(1.);
    neona.setScaleY(.8);
    root.getChildren().add(neona);
    return neona;
    }


 private Node SpawnzCar() {  
   int hauts = (int)(Math.random() *280);
    ImageView neona = new ImageView();
    neona.setImage(neon2);
    neona.setTranslateY(hauts+520);
    neona.setTranslateX(800);
    neona.setRotate(90);
    neona.setScaleX(1.);
    neona.setScaleY(.8);
    root.getChildren().add(neona);
    return neona;
 }  private void onUpdate() {

for (Node car : cars) 
    car.setTranslateX(car.getTranslateX() -  11); 
 if (Math.random() <= 0.07 ) {
    cars.add(SpawnzCar());
   // cars.add(ships());
    cars.add(initNeon());}
    checkState(); 
    }

private void checkState() {
    for (Node car : cars) {
     if (car.getBoundsInParent().intersects(frog.getBoundsInParent())) {
        frog.setTranslateX(frog.getTranslateX());
        timer.stop();
        frog.setTranslateY(frog.getTranslateY());
        return;
        } }

您可以使用坐标手动检查修改后的命中框,而不是测试 png 文件是否相互交叉。我没有看到您将 ufo 和管道的坐标值存储在哪里,所以我将使用伪代码作为示例。

public boolean isCollision(){
    if(ufo.getX() + ufo.width() > pipe.getX() + pipe.getOffSetWidth() && ufo.getX() < pipe.getX() + pipe.width() - pipe.getOffSetWidth()){
        if(\check for y value of height, this can be different depending on your way of storing pipes){
            return true;
        }
    } 
}

您希望 offSetWidth() 值是管道图像边缘与您希望发生碰撞的管道部分之间的像素长度。