Add judgement display upon hitting a note.
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
3973e122cf
commit
9d522eeca4
@ -2,6 +2,9 @@ package main.java.LLSIG;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.awt.font.FontRenderContext;
|
||||||
|
import java.awt.Font;
|
||||||
|
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
@ -13,6 +16,10 @@ public class Canvas extends JPanel{
|
|||||||
this.setSize(size);
|
this.setSize(size);
|
||||||
this.setMinimumSize(size);
|
this.setMinimumSize(size);
|
||||||
}
|
}
|
||||||
|
public Rectangle2D calculateStringBoundsFont(String msg, Font font) {
|
||||||
|
FontRenderContext frc = this.getFontMetrics(font).getFontRenderContext();
|
||||||
|
return font.getStringBounds(msg, frc);
|
||||||
|
}
|
||||||
public void paintComponent(Graphics g) {
|
public void paintComponent(Graphics g) {
|
||||||
|
|
||||||
final int MIDDLE_X = this.getWidth()/2;
|
final int MIDDLE_X = this.getWidth()/2;
|
||||||
@ -22,6 +29,7 @@ public class Canvas extends JPanel{
|
|||||||
final int NOTE_SIZE = 96;
|
final int NOTE_SIZE = 96;
|
||||||
final int LANE_SPACING_X = 100;
|
final int LANE_SPACING_X = 100;
|
||||||
final int NOTE_DISTANCE = (int)(LLSIG.WINDOW_SIZE.width/2)-NOTE_SIZE;
|
final int NOTE_DISTANCE = (int)(LLSIG.WINDOW_SIZE.width/2)-NOTE_SIZE;
|
||||||
|
final Color[] colorList = new Color[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
|
||||||
|
|
||||||
super.paintComponent(g);
|
super.paintComponent(g);
|
||||||
if (LLSIG.game!=null) {
|
if (LLSIG.game!=null) {
|
||||||
@ -39,10 +47,40 @@ public class Canvas extends JPanel{
|
|||||||
g.setColor(Color.GRAY);
|
g.setColor(Color.GRAY);
|
||||||
}
|
}
|
||||||
//g.fillRect(MIDDLE_X-JUDGEMENT_LINE_WIDTH/2+LANE_X_OFFSET,MIDDLE_Y-JUDGEMENT_LINE_HEIGHT/2,JUDGEMENT_LINE_WIDTH,JUDGEMENT_LINE_HEIGHT);
|
//g.fillRect(MIDDLE_X-JUDGEMENT_LINE_WIDTH/2+LANE_X_OFFSET,MIDDLE_Y-JUDGEMENT_LINE_HEIGHT/2,JUDGEMENT_LINE_WIDTH,JUDGEMENT_LINE_HEIGHT);
|
||||||
g.fillOval((int)(MIDDLE_X-Math.cos(Math.toRadians(22.5*i))*NOTE_DISTANCE-NOTE_SIZE/2),(int)(MIDDLE_Y+Math.sin(Math.toRadians(22.5*i))*NOTE_DISTANCE-NOTE_SIZE/2),NOTE_SIZE,NOTE_SIZE);
|
int NOTE_X=(int)(MIDDLE_X-Math.cos(Math.toRadians(22.5*i))*NOTE_DISTANCE-NOTE_SIZE/2);
|
||||||
|
int NOTE_Y=(int)(MIDDLE_Y+Math.sin(Math.toRadians(22.5*i))*NOTE_DISTANCE-NOTE_SIZE/2);
|
||||||
|
g.fillOval(NOTE_X,NOTE_Y,NOTE_SIZE,NOTE_SIZE);
|
||||||
g.setColor(NOTE_COLOR);
|
g.setColor(NOTE_COLOR);
|
||||||
|
|
||||||
Lane lane = LLSIG.game.lanes.get(i);
|
Lane lane = LLSIG.game.lanes.get(i);
|
||||||
|
if (LLSIG.game.PLAYING) {
|
||||||
|
if (LLSIG.game.musicPlayer.getPlayPosition()-lane.lastNote<500) {
|
||||||
|
switch (lane.lastRating) {
|
||||||
|
case PERFECT:
|
||||||
|
g.setColor(colorList[(LLSIG.game.frameCount/10)%colorList.length]);
|
||||||
|
break;
|
||||||
|
case EXCELLENT:
|
||||||
|
g.setColor(Color.YELLOW);
|
||||||
|
break;
|
||||||
|
case GREAT:
|
||||||
|
g.setColor(Color.GREEN);
|
||||||
|
break;
|
||||||
|
case EARLY:
|
||||||
|
g.setColor(Color.CYAN);
|
||||||
|
break;
|
||||||
|
case LATE:
|
||||||
|
g.setColor(Color.MAGENTA);
|
||||||
|
break;
|
||||||
|
case MISS:
|
||||||
|
g.setColor(Color.RED);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Rectangle2D textBounds = calculateStringBoundsFont(lane.lastRating.name(), g.getFont());
|
||||||
|
g.drawString(lane.lastRating.name(),(int)(NOTE_X-textBounds.getCenterX()),(int)(NOTE_Y+textBounds.getHeight()));
|
||||||
|
}
|
||||||
|
}
|
||||||
int noteCounter = 0;
|
int noteCounter = 0;
|
||||||
while (lane.noteExists(noteCounter)) {
|
while (lane.noteExists(noteCounter)) {
|
||||||
Note n = lane.getNote(noteCounter);
|
Note n = lane.getNote(noteCounter);
|
||||||
|
|||||||
@ -60,6 +60,11 @@ public class LLSIG implements KeyListener{
|
|||||||
gameLoop = new Thread() {
|
gameLoop = new Thread() {
|
||||||
public void run() {
|
public void run() {
|
||||||
frameCount++;
|
frameCount++;
|
||||||
|
for (int i=0;i<9;i++) {
|
||||||
|
Lane l =lanes.get(i);
|
||||||
|
l.markMissedNotes();
|
||||||
|
l.clearOutInactiveNotes();
|
||||||
|
}
|
||||||
window.repaint();
|
window.repaint();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -146,12 +151,14 @@ public class LLSIG implements KeyListener{
|
|||||||
if (l.noteExists()) {
|
if (l.noteExists()) {
|
||||||
Note n = l.getNote();
|
Note n = l.getNote();
|
||||||
int diff = n.getStartFrame()-LLSIG.game.musicPlayer.getPlayPosition();
|
int diff = n.getStartFrame()-LLSIG.game.musicPlayer.getPlayPosition();
|
||||||
if (Math.abs(diff)<=PERFECT_TIMING_WINDOW) {l.lastRating=TimingRating.PERFECT;} else
|
if (diff<=BAD_TIMING_WINDOW) {
|
||||||
if (Math.abs(diff)<=EXCELLENT_TIMING_WINDOW) {l.lastRating=TimingRating.EXCELLENT;} else
|
if (Math.abs(diff)<=PERFECT_TIMING_WINDOW) {l.lastRating=TimingRating.PERFECT;} else
|
||||||
if (Math.abs(diff)<=GREAT_TIMING_WINDOW) {l.lastRating=TimingRating.GREAT;} else
|
if (Math.abs(diff)<=EXCELLENT_TIMING_WINDOW) {l.lastRating=TimingRating.EXCELLENT;} else
|
||||||
if (Math.abs(diff)<=BAD_TIMING_WINDOW) {l.lastRating=Math.signum(diff)>0?TimingRating.EARLY:TimingRating.LATE;}
|
if (Math.abs(diff)<=GREAT_TIMING_WINDOW) {l.lastRating=TimingRating.GREAT;} else
|
||||||
l.lastNote=LLSIG.game.musicPlayer.getPlayPosition();
|
if (Math.abs(diff)<=BAD_TIMING_WINDOW) {l.lastRating=Math.signum(diff)>0?TimingRating.EARLY:TimingRating.LATE;}
|
||||||
n.active=false;
|
l.lastNote=LLSIG.game.musicPlayer.getPlayPosition();
|
||||||
|
n.active=false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keyState[lane]=true;
|
keyState[lane]=true;
|
||||||
|
|||||||
@ -60,4 +60,16 @@ public class Lane{
|
|||||||
}
|
}
|
||||||
System.out.println("Note added: "+n);
|
System.out.println("Note added: "+n);
|
||||||
}
|
}
|
||||||
|
public void markMissedNotes() {
|
||||||
|
if (LLSIG.game.PLAYING) {
|
||||||
|
noteChart.forEach((note)->{
|
||||||
|
int diff = note.getStartFrame()-LLSIG.game.musicPlayer.getPlayPosition();
|
||||||
|
if (diff<-LLSIG.BAD_TIMING_WINDOW) {
|
||||||
|
note.active=false;
|
||||||
|
lastRating = TimingRating.MISS;
|
||||||
|
lastNote = LLSIG.game.musicPlayer.getPlayPosition();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user