当前位置: 首页 > 知识库问答 >
问题:

检测一个StackPane中的节点与另一个StackPane中的节点的冲突

韩羽
2023-03-14

作为前言,我对JavaFX编程非常陌生。(我们上学期在我的一堂课上介绍了JavaFX,在过去的一个月左右的时间里,我一直在努力用JavaFX制作一个简单的游戏。

我遇到的一个问题是试图检测一个StackPane中的窗格与另一个StackPane中的窗格的冲突。具体来说,我在Game类中有一个“Player”节点(“Player”扩展了抽象的“Sprite ”,后者扩展了StackPane)以及一些“Asset”节点(“Asset”是一个抽象的父类,类似于“Sprite”也扩展了StackPane)。“Player”和每个“Asset”节点都由ImageView和窗格对象组成,这些对象是节点的“边界”。

这是我试图跟踪游戏类中冲突的方式,但它不起作用:

protected void update() {
    // Call playerBoundsHandler in update cycle
    for (Asset asset : this.gameArea.getAssets()) {
        playerBoundsHandler(asset);
    } // for
} // update

private void playerBoundsHandler(Asset asset) {
    for (Pane boundary : asset.getAssetBoundaries()) {
        if (player.getPlayerStandingAreaBox()
        .getBoundsInParent()
        .intersects(boundary.getBoundsInParent())) {
            // do stuff here
        } // if
    } // for
} // playerBoundsHandler

我猜在这里使用getBoundsInParent()是有问题的,因为我试图跟踪两个单独节点中的子节点的交集,但我不知道解决方案是什么。是否需要使用GetBondsInLocal或其他方法做一些事情?

为了澄清起见,这里是Player类的相关部分:

/** 
* Player class constructor. 
* Player class extends "Sprite" (abstract class)
* which extends StackPane.
*/
public Player(double xSpawn, double ySpawn) {
    // Add Player Standing Box (a Pane situated at the feet of the Player sprite)  
    this.playerStandingAreaBox = new Pane();
    // width, height, etc. set here
    this.getChildren().add(playerStandingAreaBox);
    this.setAlignment(playerStandingAreaBox, Pos.BOTTOM_CENTER);
} // Player constructor

public Pane getPlayerStandingAreaBox() {
    return this.playerStandingAreaBox;
} // getPlayerStandingAreaBox

Asset子类遵循的设计与这里的Player类几乎相同。为了便于澄清,这里有一个“高速公路”类:

public class Highway extends Asset {

    public Highway(double translateX, double translateY) {
        // call super here
        setAssetBoundaries();
    } // Highway constructor

    @Override
    setAssetBoundaries() {
        Pane boundaryOne = new Pane();
        // set boundaryOne settings
        this.getChildren().add(boundaryOne);
        this.assetBoundaries.add(boundaryOne);
        Pane boundaryTwo = new Pane();
        // set boundaryTwo settings
        this.getChildren().add(boundaryTwo);
        this.assetBoundaries.add(boundaryTwo);
    } // setAssetBoundaries
 
    /**
    * assetBoundaries is an ArrayList<Asset> object also inherited.
    * getAssetBoundaries() is inherited from the "Asset" class
    * which returns assetBoundaries.
    */

下面的截图显示了我的玩家精灵(不要评判糟糕的像素艺术!我已经知道这家伙的右臂看起来很笨拙,步枪看起来很可笑!)他的站立框用红色突出显示,“高速公路”资产的边界在最顶部和最底部用黄色突出显示。我想在玩家的盒子与高速公路的一个盒子相交时注册。

球员与公路

共有1个答案

裴永年
2023-03-14

谢谢,James_D。下面的更改正是我想要它做的。

private void playerBoundsHandler(Asset asset) {
    for (Pane boundary : asset.getAssetBoundaries()) {
        Bounds boundaryBoundsInScene = boundary.localToScene(boundary.getBoundsInLocal());
        Bounds playerStandingBoxBoundsInScene = player.getPlayerStandingBoxArea()
            .localToScene(player.getPlayerStandingBoxArea().getBoundsInLocal());
        if (boundaryBoundsInScene.intersects(playerStandingBoundsInScene)) {
            // do stuff here
        } // if
    } // for
} // playerBoundsHandler
 类似资料:
  • 我正在尝试检查StackPane中节点的冲突检测。下面是我的代码: 在这里,如果我使用AnchorPane,碰撞检测就会工作。但在StackPane的情况下,我无法做到这一点。我猜这是因为堆栈窗格的坐标系统(如果我错了,请纠正我)。 所以请帮我实现上述两个矩形的碰撞检测。另外,如果我想更改节点的坐标,请提供一些建议(如果您知道),以便在StackPane内的节点上实现此类冲突检测。

  • 问题内容: 我正在一个项目中,用户对我们的代客服务的请求在另一端代客接受请求。 我正在使用Firebase作为后端,并应要求将客户uid保存在“ request”子项上。 当代客接受请求时,客户uid应从“请求”节点移至“进行中”节点。 我怎样才能做到这一点? 问题答案: 我建议使用这个: 这来自以下来源:https : //gist.github.com/katowulf/6099042。我在J

  • 最近,我已经完成了检测循环中第一个节点的算法,如下所述:- 注:本声明摘自以下网站:- http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html 步骤1:找到循环后,两个指针都指向在循环内的交汇点的公共节点, 步骤2:现在,在它们之间移动一个指针(比如乌龟)到列表的头部,保持野兔指针在循环内的交汇点的相同位置。 步

  • 我是Xpath的新手。 假设我有一个xml目录可以将商品导入电子商店: 目录的第一部分是商品类别列表,第二部分是商品列表。每种商品都有一个<代码> 从上面的代码中,我需要得到这样一个好的描述:类别:夹克;标签:D 标签、颜色和尺寸可直接从<代码> 所以我的目标是选择

  • 我最近正在评估图形数据库或任何其他数据库的一个特定要求: 通过一个查询中节点的直接子节点及其所有直接和间接子节点的聚合属性检索每个节点的前n个子节点的能力。结果应返回正确的层次结构。 实例 < code >每个节点都有一个属性,即它有多少个直接子节点。并且该树不超过8层。假设我想运行整个树的查询,通过每个级别的所有节点,它的前2个子节点有最多的直接和间接子节点。它将为我们提供以下信息: 我想知道是