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() 值是管道图像边缘与您希望发生碰撞的管道部分之间的像素长度。
我目前正在制作一个简单的 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() 值是管道图像边缘与您希望发生碰撞的管道部分之间的像素长度。