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