Как исправить исключение IndexOutOfBounds, когда javafx повторно вычисляет границы Parent / Node Bounds - PullRequest
0 голосов
/ 11 мая 2019

Я делаю приложение / игру для javafx и мне нужно одновременно обновлять вид персонажа.Каждый цикл движения я обновляю ImageView персонажа следующим образом:

if (inBounds(direction) && !Collisions.collides(newHitbox, hitbox)) {
        this.setX(direction.getX() * this.getVelocity() + (int) this.view.getX());
        this.setY(direction.getY() * this.getVelocity() + (int) this.view.getY());
        this.hitbox.setX(direction.getX() * this.getVelocity() + this.hitbox.getX());
        this.hitbox.setY(direction.getY() * this.getVelocity() + this.hitbox.getY());
    }

Я использую таблицу спрайтов для иллюзии движения, поэтому я обновляю окно просмотра каждые четыре цикла.

Дляхотя все работает нормально, но в какой-то момент я получаю следующую ошибку:

java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 3
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:458)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
at javafx.scene.Parent.updateCachedBounds(Parent.java:1701)
at javafx.scene.Parent.recomputeBounds(Parent.java:1645)
at javafx.scene.Parent.doComputeGeomBounds(Parent.java:1498)
at javafx.scene.Parent.access$200(Parent.java:79)
at javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
at com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(RegionHelper.java:78)
at com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(RegionHelper.java:62)
at javafx.scene.layout.Region.doComputeGeomBounds(Region.java:3289)
at javafx.scene.layout.Region.access$300(Region.java:147)
at javafx.scene.layout.Region$1.doComputeGeomBounds(Region.java:168)
at com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(RegionHelper.java:89)
at com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:115)
at javafx.scene.Node.updateGeomBounds(Node.java:3837)
at javafx.scene.Node.getGeomBounds(Node.java:3799)
at javafx.scene.Node.updateBounds(Node.java:771)
at javafx.scene.Parent.updateBounds(Parent.java:1832)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2497)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:412)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:411)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:438)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:519)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:499)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:492)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:320)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run$$$capture(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
at java.base/java.lang.Thread.run(Thread.java:834)

Поскольку это не происходит последовательно, я предполагаю, что в какой-то момент потоки пытаются получить доступ к родителю своего ImageView в то же времявремя и что-то ломается.

Мне не удалось локализовать ошибку, поскольку сообщение об ошибке не говорит мне много о том, где в моем коде это происходит.Я пытался синхронизировать методы, которые обновляют представление, а также часть кода, синхронизированную с объектом Parent в качестве их монитора, но это никак не помогло.

Лично я ими не пользуюсьГраницы, которые обновляются, поэтому, если бы была возможность отключить перерасчет, это могло бы сработать.

...