当前位置: 首页 > 面试题库 >

不断检查子弹是否接触过节点

赵星华
2023-03-14
问题内容

我有一个非常简单的程序,你可以用你的WA
SDspace键进行拍摄。所有的拍摄和移动动画都可以工作,但是我不确定如何实现一个系统,在该系统中,程序会不断检查子弹是否已碰到节点(例如圆圈)。

我本以为可以ArrayList存储所有项目符号,然后使用TimerTask来检查项目符号是否接触到节点;但是我觉得那样会减慢程序的速度,并且子弹可以在TimerTask等待再次执行时通过它们。

任何建议都会有所帮助。

代码:Pastebin

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.animation.*;
import javafx.util.Duration;
public class functionalShooter extends Application {
    private String currentDirection = "W";
    public static void main(String[] args){ launch(args);   }
    @Override public void start(Stage stage) throws Exception{
        Pane root = new Pane();
        Scene scene = new Scene(root, 600, 400);
        stage.setScene(scene);
        stage.setResizable(false);
        stage.show();

        Circle player = new Circle(10);
        player.setLayoutX(300);
        player.setLayoutY(200);

        Circle other = new Circle(100, 100, 10);

        root.getChildren().addAll(player, other);

        //key events
        scene.setOnKeyPressed(event -> {
            switch(event.getCode()){
                case A:
                    player.setLayoutX(player.getLayoutX()-10);
                    currentDirection = "A";
                    break;
                case D:
                    player.setLayoutX(player.getLayoutX()+10);
                    currentDirection = "D";
                    break;
                case W:
                    player.setLayoutY(player.getLayoutY()-10);
                    currentDirection = "W";
                    break;
                case S:
                    player.setLayoutY(player.getLayoutY()+10);
                    currentDirection = "S";
                    break;
                case SPACE:
                    if (currentDirection.equals("D")){
                        Circle newCircle = new Circle(player.getLayoutX()+10, player.getLayoutY(), 5);
                        root.getChildren().add(newCircle);
                        shoot(newCircle);
                    }
                    else if (currentDirection.equals("A")){
                        Circle newCircle = new Circle(player.getLayoutX()-10, player.getLayoutY(), 5);
                        root.getChildren().add(newCircle);
                        shoot(newCircle);
                    }
                    else if (currentDirection.equals("S")){
                        Circle newCircle = new Circle(player.getLayoutX(), player.getLayoutY()+10, 5);
                        root.getChildren().add(newCircle);
                        shoot(newCircle);
                    }
                    else {
                        Circle newCircle = new Circle(player.getLayoutX(), player.getLayoutY()-10, 5);
                        root.getChildren().add(newCircle);
                        shoot(newCircle);
                    }
                    break;
            }
        });
    }

    private void shoot(Circle bullet){
        Timeline timeline = new Timeline();
        if (currentDirection.equals("D")){
            KeyValue start = new KeyValue(bullet.translateXProperty(), 0);
            KeyValue end = new KeyValue(bullet.translateXProperty(), 800);
            KeyFrame startF = new KeyFrame(Duration.ZERO, start);
            KeyFrame endF = new KeyFrame(Duration.seconds(10), end);
            timeline.getKeyFrames().addAll(startF, endF);
        }
        else if (currentDirection.equals("A")){
            KeyValue start = new KeyValue(bullet.translateXProperty(), 0);
            KeyValue end = new KeyValue(bullet.translateXProperty(), -800);
            KeyFrame startF = new KeyFrame(Duration.ZERO, start);
            KeyFrame endF = new KeyFrame(Duration.seconds(10), end);
            timeline.getKeyFrames().addAll(startF, endF);
        }
        else if (currentDirection.equals("S")){
            KeyValue start = new KeyValue(bullet.translateYProperty(), 0);
            KeyValue end = new KeyValue(bullet.translateYProperty(), 800);
            KeyFrame startF = new KeyFrame(Duration.ZERO, start);
            KeyFrame endF = new KeyFrame(Duration.seconds(10), end);
            timeline.getKeyFrames().addAll(startF, endF);
        }
        else{
            KeyValue start = new KeyValue(bullet.translateYProperty(), 0);
            KeyValue end = new KeyValue(bullet.translateYProperty(), -800);
            KeyFrame startF = new KeyFrame(Duration.ZERO, start);
            KeyFrame endF = new KeyFrame(Duration.seconds(10), end);
            timeline.getKeyFrames().addAll(startF, endF);
        }
        timeline.setAutoReverse(false);
        timeline.setCycleCount(1);
        timeline.play();
    }
}

问题答案:

您可以使用提供给每个相关对象的自定义样式检查bullet相交。下面的片段添加了一个到,但你需要一个相同的,每个方向一个。实现是线性的,只是返回不变,但是您也可以查看此抛物线插值器。我还制作了一个类变量,可以访问。我毫不迟疑地将十几发子弹飞向空中。请注意,您不需要一个值:“将使用当时的当前目标值合成一个”。otherShape.intersect()InterpolatorKeyValueInterpolator``shoot()``tother``shoot()``start

private Circle other = new Circle(100, 100, 10);
…
else {
    KeyValue end = new KeyValue(bullet.translateYProperty(), -800, new Interpolator() {
        @Override
        protected double curve(double t) {
            if (!Shape.intersect(bullet, other).getBoundsInLocal().isEmpty()) {
                System.out.println("Intersection");
            }
            return t;
        }
    });
    KeyFrame endF = new KeyFrame(Duration.seconds(10), end);
    timeline.getKeyFrames().addAll(endF);
}


 类似资料:
  • 我从我的网络商店API调用中获取XML,其结构非常像下面的示例: 其中有更多的参数,数量取决于许多外部因素。我正在尝试获取用户名,当id“111”和id“112”的值是我要查找的值时 上述代码按预期返回“userOne”和“userTwo”。 问题是,Id“111”要么有值“Param 1 is on”要么什么都没有,如果没有值,它就不会显示在XML中。所以我需要一个表达式来检查id为“111”的

  • 我有以下课程: 我正在尝试实现一种方法: 这将检查是否是的祖先(任何深度,直到根)。 我需要一个密码查询。

  • 问题内容: 基本上,我有一个服务器循环,用于管理与一个单独客户端的连接。在循环的某一时刻,如果存在ClientSocket,它将尝试读取以检查客户端是否仍然连接: 问题是,一旦创建了套接字,应用程序将挂起读取,我假设正在等待永远不会到来的数据,因为客户端永远不会发送到服务器。在此之前还可以,因为正确处理了断开连接(客户端断开连接后读取将最终失败),并且循环将尝试重新建立连接。但是,我现在添加了上面

  • 问题内容: 我有一个附加到事件的处理程序,我希望它仅在由人触发而不是由trigger()方法触发时执行。我该如何区分? 例如, 问题答案: 您可以检查:如果已定义,则点击是人为的: 我在jsfiddle中的例子:

  • 我已经有我的categorybitmasks设置,希望是正确的,但我下面的代码应该有我的子弹和敌人接触,然后删除对方。什么也没发生,它们只是碰撞,仍然停留在屏幕上 func didBeginContact(联系人:SKPhysicsContact!){ bullet.physicsBody?.categoryBitMask=CollisionTypes.bullet.rawValuebullet.

  • 问题内容: 如何使用Node的驱动程序检查ObjectID是否有效 我试过了 : 但是我不断收到异常,而不是对或错。(例外只是一个“ throw e; // process.nextTick错误,或“第一次滴答”中的“ error”事件” 问题答案: 不知道函数来自哪里,但是不在node-mongodb- native中 。 如果要检查由24个十六进制字符组成的字符串,则可以使用此正则表达式。 取