我有一个非常简单的程序,你可以用你的W
,A
,
S
,D
和space
键进行拍摄。所有的拍摄和移动动画都可以工作,但是我不确定如何实现一个系统,在该系统中,程序会不断检查子弹是否已碰到节点(例如圆圈)。
我本以为可以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
相交。下面的片段添加了一个到,但你需要一个相同的,每个方向一个。实现是线性的,只是返回不变,但是您也可以查看此抛物线插值器。我还制作了一个类变量,可以访问。我毫不迟疑地将十几发子弹飞向空中。请注意,您不需要一个值:“将使用当时的当前目标值合成一个”。other
Shape.intersect()
Interpolator
KeyValue
Interpolator``shoot()``t
other``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个十六进制字符组成的字符串,则可以使用此正则表达式。 取