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

时间:2017-02-01 15:36:13

标签: java javafx graphics graphics2d

我目前正在制作一个简单的2D游戏,如飞扬的鸟。对于那些不熟悉这个的人来说,游戏是一个侧卷轴,玩家控制一个物体,试图在霓虹灯管之间飞行而不打它们。在这个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;
        } }

1 个答案:

答案 0 :(得分:0)

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

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()值为管道图像边缘与您希望发生碰撞的管道部分之间的长度(以像素为单位)。