add pulse effect to main menu logo
This commit is contained in:
parent
1dd2204cf2
commit
7ba5305534
BIN
res/logo2pulse.png
Normal file
BIN
res/logo2pulse.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
|
@ -308,6 +308,12 @@ public enum GameImage {
|
||||||
return img.getScaledCopy(0.75f);
|
return img.getScaledCopy(0.75f);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
MENU_LOGO_PULSE ("logo2pulse", "png", false, true) {
|
||||||
|
@Override
|
||||||
|
protected Image process_sub(Image img, int w, int h) {
|
||||||
|
return img.getScaledCopy(0.75f);
|
||||||
|
}
|
||||||
|
},
|
||||||
MENU_PLAY ("menu-play2", "png", false, false) {
|
MENU_PLAY ("menu-play2", "png", false, false) {
|
||||||
@Override
|
@Override
|
||||||
protected Image process_sub(Image img, int w, int h) {
|
protected Image process_sub(Image img, int w, int h) {
|
||||||
|
|
|
@ -217,6 +217,17 @@ public class MusicController {
|
||||||
return (float) ((((trackPosition - beatTime) * 100.0) % beatLength) / beatLength);
|
return (float) ((((trackPosition - beatTime) * 100.0) % beatLength) / beatLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current beat length
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Float getBeatLength() {
|
||||||
|
if (!updateTimingPoint())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return lastTimingPoint.getBeatLength();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the progress of the current measure.
|
* Gets the progress of the current measure.
|
||||||
* @return a measure progress value [0,1) where 0 marks the start of the measure and
|
* @return a measure progress value [0,1) where 0 marks the start of the measure and
|
||||||
|
|
|
@ -37,6 +37,8 @@ import java.awt.Desktop;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
import org.lwjgl.opengl.Display;
|
import org.lwjgl.opengl.Display;
|
||||||
|
@ -125,6 +127,9 @@ public class MainMenu extends BaseOpsuState {
|
||||||
/** The star fountain. */
|
/** The star fountain. */
|
||||||
private StarFountain starFountain;
|
private StarFountain starFountain;
|
||||||
|
|
||||||
|
private LinkedList<PulseData> pulseData = new LinkedList<>();
|
||||||
|
private float lastPulseProgress;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void revalidate() {
|
protected void revalidate() {
|
||||||
programStartTime = System.currentTimeMillis();
|
programStartTime = System.currentTimeMillis();
|
||||||
|
@ -262,11 +267,25 @@ public class MainMenu extends BaseOpsuState {
|
||||||
|
|
||||||
// draw logo (pulsing)
|
// draw logo (pulsing)
|
||||||
Color color = OPTION_COLOR_MAIN_MENU_LOGO.state ? Cursor.lastCursorColor : Color.white;
|
Color color = OPTION_COLOR_MAIN_MENU_LOGO.state ? Cursor.lastCursorColor : Color.white;
|
||||||
|
for (PulseData pd : this.pulseData) {
|
||||||
|
final float progress = OUT_CUBIC.calc(pd.position / 1000f);
|
||||||
|
final float scale = pd.initialScale + (0.432f * progress);
|
||||||
|
final Image p = GameImage.MENU_LOGO_PULSE.getImage().getScaledCopy(scale);
|
||||||
|
p.setAlpha(0.15f * (1f - IN_QUAD.calc(progress)));
|
||||||
|
p.drawCentered(logo.getX(), logo.getY(), color);
|
||||||
|
}
|
||||||
Float position = MusicController.getBeatProgress();
|
Float position = MusicController.getBeatProgress();
|
||||||
|
Float beatLength = MusicController.getBeatLength();
|
||||||
boolean renderPiece = position != null;
|
boolean renderPiece = position != null;
|
||||||
if (position == null) {
|
if (position == null) {
|
||||||
position = System.currentTimeMillis() % 1000 / 1000f;
|
position = System.currentTimeMillis() % 1000 / 1000f;
|
||||||
|
beatLength = 1000f;
|
||||||
}
|
}
|
||||||
|
final float hoverScale = logo.getCurrentHoverExpandValue();
|
||||||
|
if (position < this.lastPulseProgress) {
|
||||||
|
this.pulseData.add(new PulseData((int) (position*beatLength), hoverScale));
|
||||||
|
}
|
||||||
|
this.lastPulseProgress = position;
|
||||||
final float smoothExpandProgress;
|
final float smoothExpandProgress;
|
||||||
if (position < 0.05f) {
|
if (position < 0.05f) {
|
||||||
smoothExpandProgress = 1f - IN_CUBIC.calc(position / 0.05f);
|
smoothExpandProgress = 1f - IN_CUBIC.calc(position / 0.05f);
|
||||||
|
@ -274,7 +293,6 @@ public class MainMenu extends BaseOpsuState {
|
||||||
smoothExpandProgress = (position - 0.05f) / 0.95f;
|
smoothExpandProgress = (position - 0.05f) / 0.95f;
|
||||||
}
|
}
|
||||||
logo.draw(color, 0.9726f + smoothExpandProgress * 0.0274f);
|
logo.draw(color, 0.9726f + smoothExpandProgress * 0.0274f);
|
||||||
final float hoverScale = logo.getCurrentHoverExpandValue();
|
|
||||||
if (renderPiece) {
|
if (renderPiece) {
|
||||||
Image piece = GameImage.MENU_LOGO_PIECE.getImage();
|
Image piece = GameImage.MENU_LOGO_PIECE.getImage();
|
||||||
piece = piece.getScaledCopy(hoverScale);
|
piece = piece.getScaledCopy(hoverScale);
|
||||||
|
@ -365,6 +383,15 @@ public class MainMenu extends BaseOpsuState {
|
||||||
public void preRenderUpdate() {
|
public void preRenderUpdate() {
|
||||||
int delta = displayContainer.renderDelta;
|
int delta = displayContainer.renderDelta;
|
||||||
|
|
||||||
|
final Iterator<PulseData> pulseDataIter = this.pulseData.iterator();
|
||||||
|
while (pulseDataIter.hasNext()) {
|
||||||
|
final PulseData pd = pulseDataIter.next();
|
||||||
|
pd.position += delta;
|
||||||
|
if (pd.position > 1000) {
|
||||||
|
pulseDataIter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UI.update(delta);
|
UI.update(delta);
|
||||||
if (MusicController.trackEnded())
|
if (MusicController.trackEnded())
|
||||||
nextTrack(false); // end of track: go to next track
|
nextTrack(false); // end of track: go to next track
|
||||||
|
@ -748,4 +775,14 @@ public class MainMenu extends BaseOpsuState {
|
||||||
}
|
}
|
||||||
displayContainer.switchState(state);
|
displayContainer.switchState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class PulseData {
|
||||||
|
private int position;
|
||||||
|
private float initialScale;
|
||||||
|
|
||||||
|
private PulseData(int position, float initialScale) {
|
||||||
|
this.position = position;
|
||||||
|
this.initialScale = initialScale;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user