Update stacking algorythm.

Revert previous commit. Curve should be re-created or updated.
No more extra updatePosition() calls.
This commit is contained in:
Pavel Kolchev 2015-03-30 13:02:38 +03:00
parent eadbdbee78
commit e441d3e4e1
2 changed files with 16 additions and 8 deletions

View File

@ -455,6 +455,11 @@ public class Slider implements HitObject {
public void updatePosition() { public void updatePosition() {
this.x = hitObject.getScaledX(); this.x = hitObject.getScaledX();
this.y = hitObject.getScaledY(); this.y = hitObject.getScaledY();
if (hitObject.getSliderType() == OsuHitObject.SLIDER_PASSTHROUGH && hitObject.getSliderX().length == 2)
this.curve = new CircumscribedCircle(hitObject, color);
else
this.curve = new LinearBezier(hitObject, color);
} }
@Override @Override

View File

@ -92,6 +92,9 @@ public class Game extends BasicGameState {
/** Stack time window of the previous object in ms. */ /** Stack time window of the previous object in ms. */
private static final int STACK_TIMEOUT = 1000; private static final int STACK_TIMEOUT = 1000;
/** Stack position offset modifier. */
private static final float STACK_OFFSET_MODIFIER = 0.05f;
/** The associated OsuFile object. */ /** The associated OsuFile object. */
private OsuFile osu; private OsuFile osu;
@ -1109,12 +1112,9 @@ public class Game extends BasicGameState {
} }
} }
// not a special case. stack moves up left // not a special case. stack moves up left
float x1 = hitObjectI.getX(); float distance = Utils.distance(hitObjectI.getX(), hitObjectI.getY(),
float y1 = hitObjectI.getY(); hitObjectN.getX(), hitObjectN.getY());
float x2 = hitObjectN.getX(); if (distance < STACK_LENIENCE) {
float y2 = hitObjectN.getY();
float distance = Utils.distance(x1, y1, x2, y2);
if (distance < STACK_LENIENCE * OsuHitObject.getXMultiplier()) {
hitObjectN.setStack(hitObjectI.getStack() + 1); hitObjectN.setStack(hitObjectI.getStack() + 1);
hitObjectI = hitObjectN; hitObjectI = hitObjectN;
} }
@ -1123,8 +1123,10 @@ public class Game extends BasicGameState {
// update hit objects positions // update hit objects positions
for (int i = 0; i < hitObjects.length; i++) { for (int i = 0; i < hitObjects.length; i++) {
if(osu.objects[i].getStack() != 0) {
hitObjects[i].updatePosition(); hitObjects[i].updatePosition();
} }
}
// load the first timingPoint // load the first timingPoint
if (!osu.timingPoints.isEmpty()) { if (!osu.timingPoints.isEmpty()) {
@ -1415,8 +1417,9 @@ public class Game extends BasicGameState {
HPDrainRate = Options.getFixedHP(); HPDrainRate = Options.getFixedHP();
// Stack modifier scales with hit object size // Stack modifier scales with hit object size
// StackOffset = HitObjectRadius / 10
int diameter = (int) (104 - (circleSize * 8)); int diameter = (int) (104 - (circleSize * 8));
OsuHitObject.setStackOffset(diameter * 0.05f); OsuHitObject.setStackOffset(diameter * STACK_OFFSET_MODIFIER);
// initialize objects // initialize objects
Circle.init(container, circleSize); Circle.init(container, circleSize);