作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况如下图所示: enter image description here
这是一个简单的游戏,我需要使用键盘上的“←”或“→”来移动玩家的砖 block ,但是当我这样做时,应用程序的焦点只是移动到levelPane或infoPane,有什么办法可以明确只允许 gamePane 接收键盘输入,并且只有当我使用鼠标并单击它时,关卡 Pane 才会获得焦点?
Javafx 代码如下:
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("Game.fxml"));
Parent page = loader.load();
Scene scene = new Scene(page);
Pane levelPane = (Pane)loader.getNamespace().get("levelPane");
Pane gamePane = (Pane)loader.getNamespace().get("gamePane");
Pane infoPane = (Pane)loader.getNamespace().get("infoPane");
Button lv1 = (Button)loader.getNamespace().get("level1");
Button lv2 = (Button)loader.getNamespace().get("level2");
Button lv3 = (Button)loader.getNamespace().get("level3");
Button lv4 = (Button)loader.getNamespace().get("level4");
Button lv5 = (Button)loader.getNamespace().get("level5");
Label info = (Label)loader.getNamespace().get("info");
levelPane.setFocusTraversable(false);
infoPane.setFocusTraversable(false);
//gamePane.setFocusTraversable(true);
gamePane.requestFocus();
Circle ball = new Circle(10, Color.CADETBLUE);
ball.relocate(5, 5);
Rectangle playerBrick = new Rectangle(Data.PLAYER_BRICK_LENGTH,Data.PLAYER_BRICK_WEIGTH,Color.BLACK);
playerBrick.setArcWidth(20);
playerBrick.setArcHeight(20);
playerBrick.setX(150);
playerBrick.setY(350);
ArryList<Rectangle> breakableBricks = new ArryList<Rectangle>();
for (int i = 0; i < Data.BRICK_COUNT ; i++){
breakableBricks.add(new Rectangle(Data.B_B_LENGTH,Data.B_B_WEIGTH,Color.RED));
breakableBricks[i].setArcWidth(20);
breakableBricks[i].setArcHeight(20);
if(i%5 == 0){
pixelCountY += Data.B_B_WEIGTH + 10;
}
playerBrick.setX(pixelCountX);
playerBrick.setY(pixelCountY);
pixelCountX += Data.B_B_LENGTH + 10;
}
gamePane.getChildren().add(ball);
gamePane.getChildren().add(playerBrick);
gamePane.setBorder(new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT)));
gamePane.setOnKeyPressed(new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event){
switch (event.getCode()){
case LEFT: goLeft = true;break;
case RIGHT: goRight = true;break;
}
}
});
gamePane.setOnKeyReleased(new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event){
switch (event.getCode()){
case LEFT: goLeft = false;break;
case RIGHT: goRight = false;break;
}
}
});
primaryStage.setScene(scene);
primaryStage.show();
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(20),new EventHandler<ActionEvent>() {
double dx = Data.HORIZONTAL_VELOCITY; //Step on x or velocity
double dy = Data.VERTICAL_VELOCITY; //Step on y
double playerBrickSpeed = Data.PLAYER_BRICK_S;//Player Brick moving speed
@Override
public void handle(ActionEvent t) {
//move the ball
ball.setLayoutX(ball.getLayoutX() + dx);
ball.setLayoutY(ball.getLayoutY() + dy);
Bounds bounds = gamePane.getBoundsInLocal();
Bounds brickB = playerBrick.getLayoutBounds();
//If the ball reaches the left or right border make the step negative
if(ball.getLayoutX() <= (bounds.getMinX() + ball.getRadius()) ||
ball.getLayoutX() >= (bounds.getMaxX() - ball.getRadius()) ){
dx = -dx;
}
//If the ball reeaches the brick's wall makes the ball bounce
if(ball.getLayoutY() < brickB.getMaxY() & ball.getLayoutY() > brickB.getMinY()){
if(ball.getLayoutX() > brickB.getMinX() - Data.HORIZONTAL_VELOCITY & ball.getLayoutX() < brickB.getMinX() + Data.HORIZONTAL_VELOCITY || ball.getLayoutX() > brickB.getMaxX() - Data.HORIZONTAL_VELOCITY & ball.getLayoutX() < brickB.getMaxX() + Data.HORIZONTAL_VELOCITY ){
dx = -dx;
}
}
if(ball.getLayoutX() > brickB.getMinX() & ball.getLayoutX() < brickB.getMaxX()){
if(ball.getLayoutY() < brickB.getMaxY() + Data.VERTICAL_VELOCITY & ball.getLayoutY() > brickB.getMaxY() - Data.VERTICAL_VELOCITY || ball.getLayoutY() > brickB.getMinY() - Data.VERTICAL_VELOCITY & ball.getLayoutY() < brickB.getMinY() + Data.VERTICAL_VELOCITY){
dy = -dy;
}
}
//If the ball reaches the bottom or top border make the step negative
if((ball.getLayoutY() >= (bounds.getMaxY() - ball.getRadius())) ||
(ball.getLayoutY() <= (bounds.getMinY() + ball.getRadius()))){
dy = -dy;
}
//Moving the player's brick
if(goRight & brickB.getMaxX() < bounds.getMaxX() + Data.PLAYER_BRICK_S & goRight & brickB.getMaxX() < bounds.getMaxX() - Data.PLAYER_BRICK_S){
playerBrick.setX(playerBrick.getX() + Data.PLAYER_BRICK_S);
}
if(goLeft & brickB.getMinX() > bounds.getMinX() + Data.PLAYER_BRICK_S & goLeft & brickB.getMinX() > bounds.getMinX() - Data.PLAYER_BRICK_S){
playerBrick.setX(playerBrick.getX() - Data.PLAYER_BRICK_S);
}
}
}));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}
最佳答案
除非您显示代码,否则没有多大帮助,但我认为您应该使用 GamePane.requestFocus()
或 brick.requestFocus()
来制作 GamePane
/brick
监听您的键盘输入。
根据Javadoc for Node 、node.requestFocus()方法
Requests that this Node get the input focus, and that this Node's top-level ancestor become the focused window.
关于JavaFX - 如何将键盘输入集中在 Hbox 与其他 Pane 中包含的一个 Pane 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671798/
我是一名优秀的程序员,十分优秀!