Merge pull request #108 from MinaRelayer/fix/ktv-lyric-scroll

fix: 修复 KTV 模式长歌词错位[AI]
This commit is contained in:
Color_yr authored and GitHub committed 2026-06-20 19:49:50 +08:00
commit b9b22f48c0
17 files changed
+69 -15

No files matched your search

@@ -285,7 +285,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (TextItem item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -283,7 +283,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -195,7 +195,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -202,7 +202,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -196,7 +196,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -204,7 +204,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -191,7 +191,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -190,7 +190,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (TextItem item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -285,7 +285,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (TextItem item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -283,7 +283,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -282,7 +282,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -203,7 +203,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -196,7 +196,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -204,7 +204,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -192,7 +192,7 @@ public class CoreRenderTarget extends TextFrameBuffer {
for (var item : texts) {
Point2f point = AllMusicHud.getPos(Math.min(maxWidth, item.textWidth), item.textHeight, x, y, dir);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, offsetX % item.textWidth, item.scale);
drawLoop(alpha, point.x, point.y + item.y, 0, item.y, item.textWidth, item.textHeight, maxWidth, getOffset(item) % item.textWidth, item.scale);
}
}
@@ -76,6 +76,7 @@ public class AllMusicHud {
private HudPosObj save;
private float lyricState = 0.0f;
private long lyricTime = -1;
private int lyricWidth;
private int pgOffset;
private float picScale;
private BufferedImage bg2;
@@ -235,6 +236,24 @@ public class AllMusicHud {
if (save == null || ktv == null || lyricTime == -1) return;
lyricTime += 10;
kUpdate();
updateKtvOffset();
}
private void updateKtvOffset() {
if (ktv == null || save == null || lyricWidth <= 0) {
lyricRender.clearKtvOffset();
lyricKtvRender.clearKtvOffset();
return;
}
float offset = 0;
int maxWidth = save.lyric.maxWidth;
if (maxWidth > 0 && lyricWidth > maxWidth) {
offset = (lyricWidth - maxWidth) * lyricState;
}
lyricRender.setKtvOffset(offset);
lyricKtvRender.setKtvOffset(offset);
}
private void loopTick() {
@@ -508,6 +527,8 @@ public class AllMusicHud {
allWidth = Math.max(allWidth, AllMusicCore.bridge.getTextWidth(item));
}
lyricWidth = allWidth;
lyricKtvRender.resize(allWidth, allHeight);
lyricKtvRender.use();
for (String item : temp) {
@@ -519,6 +540,7 @@ public class AllMusicHud {
}
lyricKtvRender.unUse();
} else {
lyricWidth = 0;
lyricKtvRender.clear();
}
@@ -612,6 +634,10 @@ public class AllMusicHud {
public void setKtv(long time, KtvLyricObj pack2) {
ktv = pack2;
lyricTime = time;
if (pack2 == null) {
lyricRender.clearKtvOffset();
lyricKtvRender.clearKtvOffset();
}
}
public void setTime(long time, long now) {
@@ -11,6 +11,10 @@ public abstract class TextFrameBuffer {
protected int nowWidth, nowHeight;
protected long offsetX;
protected boolean isDraw;
/**
* KTV模式下的强制滚动偏移,>=0 时优先使用
*/
protected float ktvOffset = -1;
// 最大公约数(GCD)
public static long gcd(long a, long b) {
@@ -59,6 +63,30 @@ public abstract class TextFrameBuffer {
}
}
/**
* 设置KTV模式下的强制滚动偏移
*/
public void setKtvOffset(float offset) {
this.ktvOffset = offset;
}
/**
* 清除KTV模式下的强制滚动偏移,恢复默认滚动
*/
public void clearKtvOffset() {
this.ktvOffset = -1;
}
/**
* 获取当前应使用的水平滚动偏移
*/
protected float getOffset(TextItem item) {
if (ktvOffset >= 0) {
return ktvOffset;
}
return offsetX % item.textWidth;
}
public static class TextItem {
public final float renderWidth;
public final float renderHeight;