Skip to content

Commit 9364f28

Browse files
committed
Ensure that objects are actually removed from scene on expiry
1 parent 3fc9ba2 commit 9364f28

3 files changed

Lines changed: 64 additions & 3 deletions

File tree

src/ru/nsu/ccfit/zuev/osu/game/GameplayHitCircle.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,32 @@ public void update(final float dt) {
308308
public void onExpire() {
309309
super.onExpire();
310310

311+
if (scene != null) {
312+
if (!startHit) {
313+
startHit = true;
314+
double mehWindow = beatmapCircle.hitWindow.getMehWindow() / 1000;
315+
listener.registerAccuracy(HitObjectType.Normal, mehWindow + 1);
316+
listener.onCircleHit(id, 10, position, false, (replayObjectData == null) ? 0 : replayObjectData.result, comboColor);
317+
}
318+
319+
for (int i = hitSamples.size() - 1; i >= 0; --i) {
320+
var sample = hitSamples.get(i);
321+
322+
sample.reset();
323+
GameplayHitSampleInfo.pool.free(sample);
324+
325+
hitSamples.remove(i);
326+
}
327+
328+
scene = null;
329+
}
330+
331+
circlePiece.clearEntityModifiers();
332+
approachCircle.clearEntityModifiers();
333+
334+
circlePiece.detachSelf();
335+
approachCircle.detachSelf();
336+
311337
GameObjectPool.getInstance().putCircle(this);
312338
}
313339

src/ru/nsu/ccfit/zuev/osu/game/GameplaySlider.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import com.rian.osu.mods.ModHidden;
3232
import com.rian.osu.mods.ModSynesthesia;
3333

34-
import org.anddev.andengine.entity.IEntity;
3534
import org.anddev.andengine.entity.scene.Scene;
3635
import org.anddev.andengine.util.MathUtils;
3736
import ru.nsu.ccfit.zuev.osu.Config;
@@ -655,10 +654,33 @@ private void removeFromScene() {
655654

656655
@Override
657656
public void onExpire() {
657+
if (scene != null) {
658+
if (!startHit) {
659+
double mehWindow = hitWindow.getMehWindow() / 1000;
660+
listener.registerAccuracy(HitObjectType.Slider, mehWindow + 1);
661+
listener.onSliderHit(id, 10, position, false, bodyColor, GameObjectListener.SLIDER_END, false);
662+
}
663+
664+
stopSlidingSamples();
665+
666+
for (int i = 0, iSize = nestedHitSamples.size(); i < iSize; ++i) {
667+
var hitSamples = nestedHitSamples.get(i);
668+
669+
for (int j = hitSamples.size() - 1; j >= 0; --j) {
670+
var sample = hitSamples.get(j);
671+
672+
sample.reset();
673+
GameplayHitSampleInfo.pool.free(sample);
674+
675+
hitSamples.remove(j);
676+
}
677+
}
678+
679+
scene = null;
680+
}
681+
658682
headCirclePiece.clearEntityModifiers();
659683
tailCirclePiece.clearEntityModifiers();
660-
sliderHeadLateMissFadeModifier = null;
661-
662684
startArrow.clearEntityModifiers();
663685
endArrow.clearEntityModifiers();
664686
approachCircle.clearEntityModifiers();
@@ -667,6 +689,18 @@ public void onExpire() {
667689
sliderBody.clearEntityModifiers();
668690
tickContainer.clearEntityModifiers();
669691

692+
headCirclePiece.detachSelf();
693+
tailCirclePiece.detachSelf();
694+
startArrow.detachSelf();
695+
endArrow.detachSelf();
696+
approachCircle.detachSelf();
697+
followCircle.detachSelf();
698+
ball.detachSelf();
699+
sliderBody.detachSelf();
700+
tickContainer.detachSelf();
701+
702+
sliderHeadLateMissFadeModifier = null;
703+
670704
GameObjectPool.getInstance().putSlider(this);
671705
}
672706

src/ru/nsu/ccfit/zuev/osu/game/GameplaySpinner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ public void update(final float dt) {
400400
public void onExpire() {
401401
super.onExpire();
402402

403+
removeFromScene();
403404
GameObjectPool.getInstance().putSpinner(this);
404405
}
405406

0 commit comments

Comments
 (0)