Implement hit object stacking algorithm.

This commit is contained in:
Pavel Kolchev
2015-03-28 15:11:43 +03:00
parent 16ec6c5e23
commit fbe87559c9
8 changed files with 207 additions and 26 deletions

View File

@@ -183,4 +183,13 @@ public class Circle implements HitObject {
@Override
public int getEndTime() { return hitObject.getTime(); }
@Override
public OsuHitObject getHitObject() { return hitObject; }
@Override
public void updatePosition() {
this.x = hitObject.getScaledX();
this.y = hitObject.getScaledY();
}
}

View File

@@ -53,6 +53,15 @@ public class DummyObject implements HitObject {
@Override
public boolean mousePressed(int x, int y, int trackPosition) { return false; }
@Override
public OsuHitObject getHitObject() { return hitObject; }
@Override
public void updatePosition() {
this.x = hitObject.getScaledX();
this.y = hitObject.getScaledY();
}
@Override
public float[] getPointAt(int trackPosition) { return new float[] { x, y }; }

View File

@@ -18,6 +18,7 @@
package itdelatrisu.opsu.objects;
import itdelatrisu.opsu.OsuHitObject;
import org.newdawn.slick.Graphics;
/**
@@ -64,4 +65,15 @@ public interface HitObject {
* @return the end time, in milliseconds
*/
public int getEndTime();
/**
* Return associated OsuHitObject.
* @return hit object as OsuHitObject
*/
public OsuHitObject getHitObject();
/**
* Updates position of hit object.
*/
public void updatePosition();
}

View File

@@ -146,6 +146,21 @@ public class Slider implements HitObject {
this.curve = new CircumscribedCircle(hitObject, color);
else
this.curve = new LinearBezier(hitObject, color);
// slider time calculations
this.sliderTime = game.getBeatLength() * (hitObject.getPixelLength() / sliderMultiplier) / 100f;
this.sliderTimeTotal = sliderTime * hitObject.getRepeatCount();
// ticks
float tickLengthDiv = 100f * sliderMultiplier / sliderTickRate / game.getTimingPointMultiplier();
int tickCount = (int) Math.ceil(hitObject.getPixelLength() / tickLengthDiv) - 1;
if (tickCount > 0) {
this.ticksT = new float[tickCount];
float tickTOffset = 1f / (tickCount + 1);
float t = tickTOffset;
for (int i = 0; i < tickCount; i++, t += tickTOffset)
ticksT[i] = t;
}
}
@Override
@@ -313,25 +328,6 @@ public class Slider implements HitObject {
@Override
public boolean update(boolean overlap, int delta, int mouseX, int mouseY, boolean keyPressed, int trackPosition) {
int repeatCount = hitObject.getRepeatCount();
// slider time and tick calculations
if (sliderTimeTotal == 0f) {
// slider time
this.sliderTime = game.getBeatLength() * (hitObject.getPixelLength() / sliderMultiplier) / 100f;
this.sliderTimeTotal = sliderTime * repeatCount;
// ticks
float tickLengthDiv = 100f * sliderMultiplier / sliderTickRate / game.getTimingPointMultiplier();
int tickCount = (int) Math.ceil(hitObject.getPixelLength() / tickLengthDiv) - 1;
if (tickCount > 0) {
this.ticksT = new float[tickCount];
float tickTOffset = 1f / (tickCount + 1);
float t = tickTOffset;
for (int i = 0; i < tickCount; i++, t += tickTOffset)
ticksT[i] = t;
}
}
int[] hitResultOffset = game.getHitResultOffsets();
boolean isAutoMod = GameMod.AUTO.isActive();
@@ -455,6 +451,20 @@ public class Slider implements HitObject {
return false;
}
@Override
public OsuHitObject getHitObject() { return hitObject; }
@Override
public void updatePosition() {
this.x = hitObject.getScaledX();
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
public float[] getPointAt(int trackPosition) {
if (trackPosition <= hitObject.getTime())

View File

@@ -263,6 +263,12 @@ public class Spinner implements HitObject {
return false;
}
@Override
public OsuHitObject getHitObject() { return hitObject; }
@Override
public void updatePosition() {}
@Override
public float[] getPointAt(int trackPosition) {
// get spinner time