diff --git a/osu.Game/LAsEzExtensions/HUD/EzComRadarPanel.cs b/osu.Game/LAsEzExtensions/HUD/EzComRadarPanel.cs
index e3c82e79d6..e6acc06537 100644
--- a/osu.Game/LAsEzExtensions/HUD/EzComRadarPanel.cs
+++ b/osu.Game/LAsEzExtensions/HUD/EzComRadarPanel.cs
@@ -13,6 +13,9 @@ using osu.Framework.Graphics.Rendering;
using osu.Framework.Graphics.Textures;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
+using osu.Game.Graphics.Sprites;
+using osu.Game.LAsEzExtensions.Localization;
+using osu.Game.Localisation.SkinComponents;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Skinning;
@@ -24,10 +27,69 @@ using Triangle = osu.Framework.Graphics.Primitives.Triangle;
namespace osu.Game.LAsEzExtensions.HUD
{
+ ///
+ /// 雷达图面板,显示当前谱面参数的六边形图形化表示
+ ///
public partial class EzComRadarPanel : CompositeDrawable, ISerialisableDrawable
{
+ private const float axis_label_padding = 52f;
+ private const float axis_label_offset = 16f;
+
+ private float[] parameterRatios = new float[6];
+ private float[] parameterValues = new float[6];
+
+ private static readonly string[] default_axis_labels = { "BPM", "STAR", "CS", "OD", "HP", "AR" };
+
public bool UsesFixedAnchor { get; set; }
+ public float MaxBpm { get; set; } = 200f;
+
+ public float MaxStar { get; set; } = 10f;
+
+ public float MaxCs { get; set; } = 10f;
+
+ public float MaxOd { get; set; } = 10f;
+
+ public float MaxDr { get; set; } = 10f;
+
+ public float MaxAr { get; set; } = 10f;
+
+ [SettingSource(typeof(EzHUDStrings), nameof(EzHUDStrings.RADAR_BASE_LINE_COLOUR), nameof(EzHUDStrings.RADAR_BASE_LINE_COLOUR_TOOLTIP))]
+ public BindableColour4 BaseLineColour { get; } = new BindableColour4(new Color4(255, 255, 210, 110));
+
+ [SettingSource(typeof(EzHUDStrings), nameof(EzHUDStrings.RADAR_BASE_AREA_COLOUR), nameof(EzHUDStrings.RADAR_BASE_AREA_COLOUR_TOOLTIP))]
+ public BindableColour4 BaseAreaColour { get; } = new BindableColour4(new Color4(255, 255, 200, 30));
+
+ [SettingSource(typeof(EzHUDStrings), nameof(EzHUDStrings.RADAR_DATA_LINE_COLOUR), nameof(EzHUDStrings.RADAR_DATA_LINE_COLOUR_TOOLTIP))]
+ public BindableColour4 DataLineColour { get; } = new BindableColour4(new Color4(255, 230, 128, 230));
+
+ [SettingSource(typeof(EzHUDStrings), nameof(EzHUDStrings.RADAR_DATA_AREA_COLOUR), nameof(EzHUDStrings.RADAR_DATA_AREA_COLOUR_TOOLTIP))]
+ public BindableColour4 DataAreaColour { get; } = new BindableColour4(new Color4(255, 215, 0, 95));
+
+ public int AxisCount
+ {
+ get => chart?.AxisCount ?? parameterRatios.Length;
+ set
+ {
+ int clamped = Math.Max(3, value);
+
+ if (parameterRatios.Length != clamped)
+ {
+ Array.Resize(ref parameterRatios, clamped);
+ Array.Resize(ref parameterValues, clamped);
+ }
+
+ if (chart != null)
+ {
+ chart.AxisCount = clamped;
+ chart.SetData(parameterRatios);
+ }
+
+ ensureAxisTexts();
+ updateAxisTexts();
+ }
+ }
+
[Resolved]
private IBindable beatmap { get; set; } = null!;
@@ -44,18 +106,9 @@ namespace osu.Game.LAsEzExtensions.HUD
private CancellationTokenSource? difficultyCancellationSource;
private ModSettingChangeTracker? modSettingTracker;
- private readonly Bindable[] parameters = new Bindable[6];
-
- private Hexagon hexagon = new Hexagon();
- private Hexagon parameterHexagon = new Hexagon();
-
- // 定义各参数的最大值,用于归一化处理
- private const float max_bpm = 300f;
- private const float max_star = 12f;
- private const float max_cs = 10f;
- private const float max_od = 10f;
- private const float max_dr = 10f;
- private const float max_ar = 10f;
+ private Container? axisLabelContainer;
+ private RadarChart? chart;
+ private OsuSpriteText[] axisTexts = Array.Empty();
public EzComRadarPanel()
{
@@ -65,51 +118,48 @@ namespace osu.Game.LAsEzExtensions.HUD
}
[BackgroundDependencyLoader]
- private void load(TextureStore textures)
+ private void load()
{
InternalChildren = new Drawable[]
{
- hexagon = new Hexagon
+ chart = new RadarChart
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Colour = Color4.LightYellow,
- Size = new Vector2(200),
+ AxisCount = parameterRatios.Length,
+ Size = new Vector2(220),
+ GridLevels = 4,
+ GridColour = BaseLineColour.Value,
+ AxisColour = BaseLineColour.Value,
+ BaseFillColour = BaseAreaColour.Value,
+ DataFillColour = DataAreaColour.Value,
+ DataStrokeColour = DataLineColour.Value,
+ DataPointColour = DataLineColour.Value,
},
- parameterHexagon = new Hexagon
+ axisLabelContainer = new Container
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
- Colour = Color4.Gold,
- Size = new Vector2(200),
- Alpha = 0.5f,
- }
+ Size = new Vector2(220 + axis_label_padding * 2),
+ },
};
- // 调试用边框
- AddInternal(new Container
- {
- RelativeSizeAxes = Axes.Both,
- BorderColour = Color4.White,
- BorderThickness = 2,
- Masking = true,
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre
- });
+ ensureAxisTexts();
+ updateAxisTexts();
+ applyChartColours();
}
protected override void LoadComplete()
{
base.LoadComplete();
- hexagon.Invalidate(Invalidation.DrawNode);
- parameterHexagon.Invalidate(Invalidation.DrawNode);
+ BaseLineColour.BindValueChanged(_ => applyChartColours(), true);
+ BaseAreaColour.BindValueChanged(_ => applyChartColours(), true);
+ DataLineColour.BindValueChanged(_ => applyChartColours(), true);
+ DataAreaColour.BindValueChanged(_ => applyChartColours(), true);
- for (int i = 0; i < parameters.Length; i++)
- {
- parameters[i] = new BindableFloat();
- parameters[i].ValueChanged += _ => updatePanel();
- }
+ chart?.SetData(parameterRatios);
+ updateAxisTexts();
beatmap.BindValueChanged(b =>
{
@@ -120,14 +170,8 @@ namespace osu.Game.LAsEzExtensions.HUD
difficultyBindable = difficultyCache.GetBindableDifficulty(b.NewValue.BeatmapInfo, difficultyCancellationSource.Token);
difficultyBindable.BindValueChanged(d =>
{
- // 归一化参数到0-1 范围
- parameters[0].Value = (float)(beatmap.Value.BeatmapInfo.BPM / max_bpm);
- parameters[1].Value = (float)beatmap.Value.BeatmapInfo.StarRating / max_star;
- parameters[2].Value = beatmap.Value.BeatmapInfo.Difficulty.CircleSize / max_cs;
- parameters[3].Value = beatmap.Value.BeatmapInfo.Difficulty.OverallDifficulty / max_od;
- parameters[4].Value = beatmap.Value.BeatmapInfo.Difficulty.DrainRate / max_dr;
- parameters[5].Value = beatmap.Value.BeatmapInfo.Difficulty.ApproachRate / max_ar;
- });
+ updateParameterRatios(d.NewValue);
+ }, true);
}, true);
mods.BindValueChanged(m =>
@@ -135,41 +179,211 @@ namespace osu.Game.LAsEzExtensions.HUD
modSettingTracker?.Dispose();
modSettingTracker = new ModSettingChangeTracker(m.NewValue)
{
- SettingChanged = _ => updatePanel()
+ SettingChanged = _ => updateParameterRatios(difficultyBindable?.Value ?? default)
};
- updatePanel();
+ updateParameterRatios(difficultyBindable?.Value ?? default);
}, true);
- ruleset.BindValueChanged(_ => updatePanel());
-
- updatePanel();
+ ruleset.BindValueChanged(_ => updateParameterRatios(difficultyBindable?.Value ?? default), true);
}
- private void updatePanel()
+ private void updateParameterRatios(StarDifficulty difficulty)
{
- hexagon.UpdateVertices(true); // 基础六边形(固定最大范围)
- parameterHexagon.UpdateVertices(false, parameters); // 参数六边形
+ var beatmapInfo = beatmap.Value.BeatmapInfo;
+
+ if (parameterRatios.Length > 0)
+ {
+ parameterValues[0] = (float)beatmapInfo.BPM;
+ parameterRatios[0] = normalise(parameterValues[0], MaxBpm);
+ }
+
+ if (parameterRatios.Length > 1)
+ {
+ parameterValues[1] = (float)(difficulty.Stars > 0 ? difficulty.Stars : beatmapInfo.StarRating);
+ parameterRatios[1] = normalise(parameterValues[1], MaxStar);
+ }
+
+ if (parameterRatios.Length > 2)
+ {
+ parameterValues[2] = beatmapInfo.Difficulty.CircleSize;
+ parameterRatios[2] = normalise(parameterValues[2], MaxCs);
+ }
+
+ if (parameterRatios.Length > 3)
+ {
+ parameterValues[3] = beatmapInfo.Difficulty.OverallDifficulty;
+ parameterRatios[3] = normalise(parameterValues[3], MaxOd);
+ }
+
+ if (parameterRatios.Length > 4)
+ {
+ parameterValues[4] = beatmapInfo.Difficulty.DrainRate;
+ parameterRatios[4] = normalise(parameterValues[4], MaxDr);
+ }
+
+ if (parameterRatios.Length > 5)
+ {
+ parameterValues[5] = beatmapInfo.Difficulty.ApproachRate;
+ parameterRatios[5] = normalise(parameterValues[5], MaxAr);
+ }
+
+ chart?.SetData(parameterRatios);
+ updateAxisTexts();
+ }
+
+ private static float normalise(float value, float maxValue)
+ {
+ if (maxValue <= 0)
+ return 0;
+
+ return Math.Clamp(value / maxValue, 0, 1);
+ }
+
+ private void applyChartColours()
+ {
+ if (chart == null)
+ return;
+
+ chart.GridColour = BaseLineColour.Value;
+ chart.AxisColour = BaseLineColour.Value;
+ chart.BaseFillColour = BaseAreaColour.Value;
+ chart.DataStrokeColour = DataLineColour.Value;
+ chart.DataPointColour = DataLineColour.Value;
+ chart.DataFillColour = DataAreaColour.Value;
+ chart.Invalidate(Invalidation.DrawNode);
+
+ foreach (var text in axisTexts)
+ text.Colour = DataLineColour.Value;
+ }
+
+ private void ensureAxisTexts()
+ {
+ if (axisLabelContainer == null || chart == null)
+ return;
+
+ int axisCount = chart.AxisCount;
+ if (axisTexts.Length == axisCount)
+ return;
+
+ axisTexts = new OsuSpriteText[axisCount];
+ Drawable[] drawables = new Drawable[axisCount];
+
+ for (int i = 0; i < axisCount; i++)
+ {
+ axisTexts[i] = new OsuSpriteText
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ Colour = DataLineColour.Value,
+ };
+
+ drawables[i] = axisTexts[i];
+ }
+
+ axisLabelContainer.Clear();
+
+ foreach (var drawable in drawables)
+ axisLabelContainer.Add(drawable);
+ }
+
+ private void updateAxisTexts()
+ {
+ if (axisTexts.Length == 0 || chart == null || axisLabelContainer == null)
+ return;
+
+ axisLabelContainer.Size = chart.Size + new Vector2(axis_label_padding * 2);
+
+ float radius = Math.Min(chart.Size.X, chart.Size.Y) * 0.5f * chart.RadiusRatio;
+ int axisCount = Math.Max(3, chart.AxisCount);
+
+ for (int i = 0; i < axisCount && i < axisTexts.Length; i++)
+ {
+ float angle = MathHelper.DegreesToRadians(360f / axisCount * i - 90);
+ Vector2 direction = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
+ Vector2 position = direction * (radius + axis_label_offset);
+
+ axisTexts[i].Position = position;
+ axisTexts[i].Text = $"{getAxisLabel(i)}\n{formatAxisValue(i)}";
+ }
+ }
+
+ private string getAxisLabel(int index)
+ {
+ return index < default_axis_labels.Length ? default_axis_labels[index] : $"P{index + 1}";
+ }
+
+ private string formatAxisValue(int index)
+ {
+ if (index >= parameterValues.Length)
+ return "0";
+
+ float value = parameterValues[index];
+
+ return index switch
+ {
+ 0 => value.ToString("0"),
+ 1 => value.ToString("0.00"),
+ _ => value.ToString("0.0"),
+ };
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
difficultyCancellationSource?.Cancel();
+ difficultyBindable?.UnbindAll();
modSettingTracker?.Dispose();
}
}
- public partial class Hexagon : Container
+ public partial class RadarChart : Drawable
{
- private Vector2[] vertices = new Vector2[6];
+ private int axisCount = 6;
+ private float[] dataRatios = new float[6];
private Texture? whitePixel;
- private bool isBase;
- private Bindable[]? parameters;
- private readonly string[] parameterNames = { "BPM", "Star", "CS", "OD", "DR", "AR" };
- public Hexagon()
+ public int AxisCount
+ {
+ get => axisCount;
+ set
+ {
+ int clamped = Math.Max(3, value);
+
+ if (axisCount == clamped)
+ return;
+
+ axisCount = clamped;
+ Array.Resize(ref dataRatios, axisCount);
+ Invalidate(Invalidation.DrawNode);
+ }
+ }
+
+ public int GridLevels { get; set; } = 4;
+
+ public float RadiusRatio { get; set; } = 0.82f;
+
+ public float GridThickness { get; set; } = 1.5f;
+
+ public float AxisThickness { get; set; } = 1.5f;
+
+ public float DataOutlineThickness { get; set; } = 2.2f;
+
+ public float DataPointSize { get; set; } = 5f;
+
+ public Color4 GridColour { get; set; } = new Color4(255, 255, 210, 110);
+
+ public Color4 AxisColour { get; set; } = new Color4(255, 255, 210, 95);
+
+ public Color4 BaseFillColour { get; set; } = new Color4(255, 255, 200, 30);
+
+ public Color4 DataFillColour { get; set; } = new Color4(255, 215, 0, 95);
+
+ public Color4 DataStrokeColour { get; set; } = new Color4(255, 230, 128, 230);
+
+ public Color4 DataPointColour { get; set; } = new Color4(255, 242, 176, 255);
+
+ public RadarChart()
{
- RelativeSizeAxes = Axes.Both;
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
}
@@ -189,125 +403,227 @@ namespace osu.Game.LAsEzExtensions.HUD
return texture;
}
- public void UpdateVertices(bool isBase, Bindable[]? parameters = null)
+ public void SetData(IReadOnlyList ratios)
{
- this.isBase = isBase;
- this.parameters = parameters;
+ for (int i = 0; i < axisCount; i++)
+ dataRatios[i] = i < ratios.Count ? Math.Clamp(ratios[i], 0, 1) : 0;
+
Invalidate(Invalidation.DrawNode);
}
- protected override DrawNode CreateDrawNode() => new HexagonDrawNode(this);
+ protected override DrawNode CreateDrawNode() => new RadarChartDrawNode(this);
- private class HexagonDrawNode : DrawNode
+ private class RadarChartDrawNode : DrawNode
{
- private readonly Hexagon source;
- private readonly Vector2[] vertices = new Vector2[6];
- private Color4 color;
+ private readonly RadarChart source;
+
+ private float[] ratios = Array.Empty();
+ private int axisCount;
+
+ private int gridLevels;
+ private float radiusRatio;
+ private float gridThickness;
+ private float axisThickness;
+ private float dataOutlineThickness;
+ private float dataPointSize;
+
+ private Color4 gridColour;
+ private Color4 axisColour;
+ private Color4 baseFillColour;
+ private Color4 dataFillColour;
+ private Color4 dataStrokeColour;
+ private Color4 dataPointColour;
+
+ private Vector2 drawSize;
private Texture? texture;
- public HexagonDrawNode(Hexagon hexagon)
- : base(hexagon)
+ public RadarChartDrawNode(RadarChart chart)
+ : base(chart)
{
- source = hexagon;
+ source = chart;
}
public override void ApplyState()
{
base.ApplyState();
- color = source.Colour;
+
texture = source.whitePixel;
- // 获取基于相对尺寸的实际绘制区域
- var drawSize = source.DrawSize;
+ drawSize = source.DrawSize;
+ axisCount = source.AxisCount;
- float radius = Math.Min(drawSize.X, drawSize.Y) / 2 * 0.8f;
- Vector2 center = drawSize * 6;
+ if (ratios.Length != axisCount)
+ Array.Resize(ref ratios, axisCount);
- if (source.isBase)
- {
- // 基于本地坐标系(原点在中心)
- for (int i = 0; i < 6; i++)
- {
- float angle = MathHelper.DegreesToRadians(60 * i - 90);
- vertices[i] = new Vector2(
- radius * (float)Math.Cos(angle) + center.X,
- radius * (float)Math.Sin(angle) + center.Y
- );
- }
- }
- else if (source.parameters != null)
- {
- // 参数六边形(本地坐标系)
- for (int i = 0; i < 6; i++)
- {
- float value = Math.Clamp(source.parameters[i].Value, 0, 1);
- float angle = MathHelper.DegreesToRadians(60 * i - 90);
- vertices[i] = new Vector2(
- radius * value * (float)Math.Cos(angle) + center.X,
- radius * value * (float)Math.Sin(angle) + center.Y
- );
- }
- }
+ gridLevels = Math.Max(1, source.GridLevels);
+ radiusRatio = Math.Clamp(source.RadiusRatio, 0.1f, 1);
+ gridThickness = Math.Max(0.5f, source.GridThickness);
+ axisThickness = Math.Max(0.5f, source.AxisThickness);
+ dataOutlineThickness = Math.Max(0.5f, source.DataOutlineThickness);
+ dataPointSize = Math.Max(1, source.DataPointSize);
+
+ gridColour = source.GridColour;
+ axisColour = source.AxisColour;
+ baseFillColour = source.BaseFillColour;
+ dataFillColour = source.DataFillColour;
+ dataStrokeColour = source.DataStrokeColour;
+ dataPointColour = source.DataPointColour;
+
+ for (int i = 0; i < axisCount; i++)
+ ratios[i] = source.dataRatios[i];
}
protected override void Draw(IRenderer renderer)
{
- if (texture == null) return;
+ if (texture == null)
+ return;
- // 框架会自动应用以下变换矩阵:
- // DrawInfo.Matrix = 位置矩阵 × 缩放矩阵 × 旋转矩阵 × 锚点偏移
+ float radius = Math.Min(drawSize.X, drawSize.Y) * 0.5f * radiusRatio;
+ if (radius <= 0)
+ return;
- // 绘制时直接使用本地坐标系顶点即可
- // 填充六边形
- for (int i = 1; i < vertices.Length - 1; i++)
+ Vector2 center = drawSize * 0.5f;
+
+ renderer.PushLocalMatrix(DrawInfo.Matrix);
+
+ var outerVertices = createVertices(center, radius, 1);
+
+ drawPolygonFill(renderer, outerVertices, baseFillColour);
+
+ for (int level = 1; level <= gridLevels; level++)
{
- renderer.DrawTriangle(
- texture,
- new Triangle(
- vertices[0],
- vertices[i],
- vertices[(i + 1) % vertices.Length]
- ),
- color
+ float ratio = level / (float)gridLevels;
+ var levelVertices = createVertices(center, radius, ratio);
+ drawPolygonOutline(renderer, levelVertices, gridColour, gridThickness);
+ }
+
+ for (int i = 0; i < axisCount; i++)
+ drawLine(renderer, center, outerVertices[i], axisColour, axisThickness);
+
+ var dataVertices = createVertices(center, radius, ratios);
+
+ drawFanFill(renderer, center, dataVertices, dataFillColour);
+ drawPolygonOutline(renderer, dataVertices, dataStrokeColour, dataOutlineThickness);
+ drawPoints(renderer, dataVertices, dataPointColour, dataPointSize);
+
+ renderer.PopLocalMatrix();
+ }
+
+ private Vector2[] createVertices(Vector2 center, float radius, float ratio)
+ {
+ var vertices = new Vector2[axisCount];
+
+ for (int i = 0; i < axisCount; i++)
+ {
+ float angle = MathHelper.DegreesToRadians(360f / axisCount * i - 90);
+ vertices[i] = new Vector2(
+ center.X + radius * ratio * (float)Math.Cos(angle),
+ center.Y + radius * ratio * (float)Math.Sin(angle)
);
}
- // 边线绘制
- foreach (var quad in generateLineQuads())
+ return vertices;
+ }
+
+ private Vector2[] createVertices(Vector2 center, float radius, IReadOnlyList axisRatios)
+ {
+ var vertices = new Vector2[axisCount];
+
+ for (int i = 0; i < axisCount; i++)
{
- renderer.DrawQuad(
- texture,
- quad,
- color
+ float clampedRatio = Math.Clamp(axisRatios[i], 0, 1);
+ float angle = MathHelper.DegreesToRadians(360f / axisCount * i - 90);
+ vertices[i] = new Vector2(
+ center.X + radius * clampedRatio * (float)Math.Cos(angle),
+ center.Y + radius * clampedRatio * (float)Math.Sin(angle)
);
}
+
+ return vertices;
+ }
+
+ private void drawPolygonFill(IRenderer renderer, IReadOnlyList polygonVertices, Color4 colour)
+ {
+ for (int i = 1; i < polygonVertices.Count - 1; i++)
+ {
+ renderer.DrawTriangle(
+ texture!,
+ new Triangle(
+ polygonVertices[0],
+ polygonVertices[i],
+ polygonVertices[i + 1]),
+ colour);
+ }
}
- private IEnumerable generateLineQuads()
+ private void drawFanFill(IRenderer renderer, Vector2 center, IReadOnlyList polygonVertices, Color4 colour)
{
- const float line_thickness = 2f;
-
- for (int i = 0; i < vertices.Length; i++)
+ for (int i = 0; i < polygonVertices.Count; i++)
{
- Vector2 current = vertices[i];
- Vector2 next = vertices[(i + 1) % vertices.Length];
-
- Vector2 dir = next - current;
- float length = dir.Length;
- if (length < float.Epsilon) continue;
-
- dir.Normalize();
-
- Vector2 perpendicular = new Vector2(-dir.Y, dir.X) * line_thickness / 2;
-
- yield return new Quad(
- current - perpendicular,
- current + perpendicular,
- next - perpendicular,
- next + perpendicular
- );
+ renderer.DrawTriangle(
+ texture!,
+ new Triangle(
+ center,
+ polygonVertices[i],
+ polygonVertices[(i + 1) % polygonVertices.Count]),
+ colour);
}
}
+
+ private void drawPolygonOutline(IRenderer renderer, IReadOnlyList polygonVertices, Color4 colour, float thickness)
+ {
+ for (int i = 0; i < polygonVertices.Count; i++)
+ {
+ Vector2 start = polygonVertices[i];
+ Vector2 end = polygonVertices[(i + 1) % polygonVertices.Count];
+ drawLine(renderer, start, end, colour, thickness);
+ }
+ }
+
+ private void drawPoints(IRenderer renderer, IReadOnlyList polygonVertices, Color4 colour, float pointSize)
+ {
+ float half = pointSize * 0.5f;
+
+ for (int i = 0; i < polygonVertices.Count; i++)
+ {
+ Vector2 point = polygonVertices[i];
+
+ renderer.DrawTriangle(
+ texture!,
+ new Triangle(
+ new Vector2(point.X - half, point.Y - half),
+ new Vector2(point.X + half, point.Y - half),
+ new Vector2(point.X + half, point.Y + half)),
+ colour);
+
+ renderer.DrawTriangle(
+ texture!,
+ new Triangle(
+ new Vector2(point.X - half, point.Y - half),
+ new Vector2(point.X + half, point.Y + half),
+ new Vector2(point.X - half, point.Y + half)),
+ colour);
+ }
+ }
+
+ private void drawLine(IRenderer renderer, Vector2 start, Vector2 end, Color4 colour, float thickness)
+ {
+ Vector2 direction = end - start;
+ if (direction.LengthSquared <= float.Epsilon)
+ return;
+
+ direction.Normalize();
+ Vector2 perpendicular = new Vector2(-direction.Y, direction.X) * (thickness * 0.5f);
+
+ renderer.DrawQuad(
+ texture!,
+ new Quad(
+ start - perpendicular,
+ start + perpendicular,
+ end - perpendicular,
+ end + perpendicular),
+ colour);
+ }
}
}
}
diff --git a/osu.Game/LAsEzExtensions/Localization/EzHUDStrings.cs b/osu.Game/LAsEzExtensions/Localization/EzHUDStrings.cs
new file mode 100644
index 0000000000..df8f6357e3
--- /dev/null
+++ b/osu.Game/LAsEzExtensions/Localization/EzHUDStrings.cs
@@ -0,0 +1,34 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Localisation;
+
+namespace osu.Game.LAsEzExtensions.Localization
+{
+ public static class EzHUDStrings
+ {
+ public static readonly LocalisableString RADAR_BASE_LINE_COLOUR =
+ new EzLocalizationManager.EzLocalisableString("雷达底板线色", "Radar Base Line Colour");
+
+ public static readonly LocalisableString RADAR_BASE_LINE_COLOUR_TOOLTIP =
+ new EzLocalizationManager.EzLocalisableString("底板网格线和轴线的颜色", "Colour of base grid and axis lines.");
+
+ public static readonly LocalisableString RADAR_BASE_AREA_COLOUR =
+ new EzLocalizationManager.EzLocalisableString("雷达底板区色", "Radar Base Area Colour");
+
+ public static readonly LocalisableString RADAR_BASE_AREA_COLOUR_TOOLTIP =
+ new EzLocalizationManager.EzLocalisableString("底板填充区域的颜色", "Colour of base filled area.");
+
+ public static readonly LocalisableString RADAR_DATA_LINE_COLOUR =
+ new EzLocalizationManager.EzLocalisableString("雷达数据线色", "Radar Data Line Colour");
+
+ public static readonly LocalisableString RADAR_DATA_LINE_COLOUR_TOOLTIP =
+ new EzLocalizationManager.EzLocalisableString("数据轮廓线和顶点标记的颜色", "Colour of data outline and point markers.");
+
+ public static readonly LocalisableString RADAR_DATA_AREA_COLOUR =
+ new EzLocalizationManager.EzLocalisableString("雷达数据区色", "Radar Data Area Colour");
+
+ public static readonly LocalisableString RADAR_DATA_AREA_COLOUR_TOOLTIP =
+ new EzLocalizationManager.EzLocalisableString("数据填充区域的颜色", "Colour of data filled area.");
+ }
+}
diff --git a/osu.Game/Skinning/Ez2Skin.cs b/osu.Game/Skinning/Ez2Skin.cs
index 738bd61c7d..586f66e2c6 100644
--- a/osu.Game/Skinning/Ez2Skin.cs
+++ b/osu.Game/Skinning/Ez2Skin.cs
@@ -77,13 +77,7 @@ namespace osu.Game.Skinning
dim.Origin = Anchor.Centre;
dim.Position = new Vector2(-80, -150);
}
- })
- {
- // Children = new Drawable[]
- // {
- // new LAsSkinCom6DimPanel(),
- // }
- };
+ });
return songSelectComponents;
diff --git a/osu.Game/Skinning/EzStyleProSkin.cs b/osu.Game/Skinning/EzStyleProSkin.cs
index 3ab24aac7b..3a1700fc75 100644
--- a/osu.Game/Skinning/EzStyleProSkin.cs
+++ b/osu.Game/Skinning/EzStyleProSkin.cs
@@ -89,15 +89,9 @@ namespace osu.Game.Skinning
{
dim.Anchor = Anchor.BottomCentre;
dim.Origin = Anchor.Centre;
- dim.Position = new Vector2(-80, -150);
+ dim.Position = new Vector2(0, -150);
}
- })
- {
- // Children = new Drawable[]
- // {
- // new LAsSkinCom6DimPanel(),
- // }
- };
+ });
return songSelectComponents;
diff --git a/osu.Game/Skinning/SbISkin.cs b/osu.Game/Skinning/SbISkin.cs
index 7da3973ae7..1de7f5a2ee 100644
--- a/osu.Game/Skinning/SbISkin.cs
+++ b/osu.Game/Skinning/SbISkin.cs
@@ -69,20 +69,7 @@ namespace osu.Game.Skinning
case GlobalSkinnableContainers.SongSelect:
var songSelectComponents = new DefaultSkinComponentsContainer(c =>
{
- // var dim = c.OfType().FirstOrDefault();
- //
- // if (dim != null)
- // {
- // dim.Anchor = Anchor.Centre;
- // dim.Origin = Anchor.Centre;
- // }
- })
- {
- // Children = new Drawable[]
- // {
- // new LAsSkinCom6DimPanel(),
- // }
- };
+ });
return songSelectComponents;