又写了一堆屎山
|
@ -1,10 +1,10 @@
|
||||||
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Boards
|
namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
{
|
{
|
||||||
public partial class Board:IBoard
|
public partial class Board : IBoard
|
||||||
{
|
{
|
||||||
private int[,] Bd = { { } };//y,x
|
private int[,] Bd = { { } };//y,x
|
||||||
private Dictionary<int, List<(int, int)>> board_Index = new Dictionary<int, List<(int, int)>>();
|
private Dictionary<int, List<(int, int)>> boardIndex = new Dictionary<int, List<(int, int)>>();
|
||||||
private int[] Vals_per_Image { get; set; } = Array.Empty<int>();
|
private int[] Vals_per_Image { get; set; } = Array.Empty<int>();
|
||||||
private int total;
|
private int total;
|
||||||
private int Total
|
private int Total
|
||||||
|
@ -17,7 +17,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
{
|
{
|
||||||
total = value;
|
total = value;
|
||||||
if (Total == 0)
|
if (Total == 0)
|
||||||
Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finish_Type = FinishArgs.Finish_Type.All_done });
|
Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.All_done });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private Board_funcs board_Funcs = new Board_funcs();
|
private Board_funcs board_Funcs = new Board_funcs();
|
||||||
|
@ -41,10 +41,10 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
for (int i = 0; i < sum; i++)
|
for (int i = 0; i < sum; i++)
|
||||||
{
|
{
|
||||||
Bd[cur_height, cur_width] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
Bd[cur_height, cur_width] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
||||||
if (board_Index.TryGetValue(Bd[cur_height, cur_width], out var index))
|
if (boardIndex.TryGetValue(Bd[cur_height, cur_width], out var index))
|
||||||
index.Add((cur_width, cur_height));
|
index.Add((cur_width, cur_height));
|
||||||
else
|
else
|
||||||
board_Index.Add(Bd[cur_height, cur_width], new List<(int, int)> { (cur_width, cur_height) });
|
boardIndex.Add(Bd[cur_height, cur_width], new List<(int, int)> { (cur_width, cur_height) });
|
||||||
cur_width++;
|
cur_width++;
|
||||||
if (cur_width > width)
|
if (cur_width > width)
|
||||||
{
|
{
|
||||||
|
@ -56,7 +56,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
}
|
}
|
||||||
public int[,] remake_board()
|
public int[,] remake_board()
|
||||||
{
|
{
|
||||||
board_Index.Clear();
|
boardIndex.Clear();
|
||||||
var rand = new Random();
|
var rand = new Random();
|
||||||
int[] temp_val_per_Image = (int[])Vals_per_Image.Clone();
|
int[] temp_val_per_Image = (int[])Vals_per_Image.Clone();
|
||||||
int types = Vals_per_Image.Length;
|
int types = Vals_per_Image.Length;
|
||||||
|
@ -68,10 +68,10 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
if (Bd[i, j] != -1)
|
if (Bd[i, j] != -1)
|
||||||
{
|
{
|
||||||
Bd[i, j] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
Bd[i, j] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
||||||
if (board_Index.TryGetValue(Bd[i, j], out var index))
|
if (boardIndex.TryGetValue(Bd[i, j], out var index))
|
||||||
index.Add((j, i));
|
index.Add((j, i));
|
||||||
else
|
else
|
||||||
board_Index.Add(Bd[i, j], new List<(int, int)> { (j, i) });
|
boardIndex.Add(Bd[i, j], new List<(int, int)> { (j, i) });
|
||||||
}
|
}
|
||||||
return Bd;
|
return Bd;
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,9 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
{
|
{
|
||||||
int type = Bd[y, x];
|
int type = Bd[y, x];
|
||||||
Bd[y, x] = -1;
|
Bd[y, x] = -1;
|
||||||
if (!board_Index[type].Remove((x, y)))
|
if (type == -1)
|
||||||
|
return;
|
||||||
|
if (!boardIndex[type].Remove((x, y)))
|
||||||
throw new Exception("Val not Found in board_Index");
|
throw new Exception("Val not Found in board_Index");
|
||||||
Vals_per_Image[type]--;
|
Vals_per_Image[type]--;
|
||||||
Total--;
|
Total--;
|
||||||
|
@ -258,7 +260,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
public List<List<(int, int)>> get_tip((int, int) start)
|
public List<List<(int, int)>> get_tip((int, int) start)
|
||||||
{
|
{
|
||||||
List<List<(int, int)>> ans = new List<List<(int, int)>>();
|
List<List<(int, int)>> ans = new List<List<(int, int)>>();
|
||||||
if (board_Index.TryGetValue(Bd[start.Item2, start.Item1], out var tip))
|
if (boardIndex.TryGetValue(Bd[start.Item2, start.Item1], out var tip))
|
||||||
foreach (var pos in tip)
|
foreach (var pos in tip)
|
||||||
{
|
{
|
||||||
var (result, path) = test(start, pos);
|
var (result, path) = test(start, pos);
|
||||||
|
@ -267,6 +269,19 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
}
|
}
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public (int, int) GetRandomBlock()
|
||||||
|
{
|
||||||
|
Random random = new();
|
||||||
|
int k = random.Next(0, boardIndex.Count);
|
||||||
|
for (int i = 0; i < boardIndex.Count(); i++)
|
||||||
|
{
|
||||||
|
if (boardIndex[k + i].Count != 0)
|
||||||
|
return boardIndex[k + i][random.Next(0, boardIndex[k + i].Count)];
|
||||||
|
}
|
||||||
|
return (-1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
public (int, int) size { get; set; }//width,height
|
public (int, int) size { get; set; }//width,height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
}
|
}
|
||||||
public (int, int) size { get; set; }//width,height
|
public (int, int) size { get; set; }//width,height
|
||||||
Dictionary<(int,int),Node>Index = new Dictionary<(int,int), Node>();//width,height
|
Dictionary<(int,int),Node>Index = new Dictionary<(int,int), Node>();//width,height
|
||||||
private Dictionary<int, List<(int, int)>> board_Index = new Dictionary<int, List<(int, int)>>();
|
private Dictionary<int, List<(int, int)>> boardIndex = new Dictionary<int, List<(int, int)>>();
|
||||||
Board_funcs board_Funcs = new Board_funcs();
|
Board_funcs board_Funcs = new Board_funcs();
|
||||||
private int total;
|
private int total;
|
||||||
private int Total
|
private int Total
|
||||||
|
@ -48,7 +48,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
{
|
{
|
||||||
total = value;
|
total = value;
|
||||||
if (Total == 0)
|
if (Total == 0)
|
||||||
Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finish_Type = FinishArgs.Finish_Type.All_done });
|
Etcs.gameModeForm?.Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.All_done });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private int[] Vals_per_Image { get; set; } = Array.Empty<int>();
|
private int[] Vals_per_Image { get; set; } = Array.Empty<int>();
|
||||||
|
@ -72,7 +72,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new Exception("Val not Found in Index");
|
throw new Exception("Val not Found in Index");
|
||||||
if (!board_Index[type].Remove((x, y)))
|
if (!boardIndex[type].Remove((x, y)))
|
||||||
throw new Exception("Val not Found in board_Index");
|
throw new Exception("Val not Found in board_Index");
|
||||||
Vals_per_Image[type]--;
|
Vals_per_Image[type]--;
|
||||||
Total--;
|
Total--;
|
||||||
|
@ -82,7 +82,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
public List<List<(int, int)>> get_tip((int, int) start)
|
public List<List<(int, int)>> get_tip((int, int) start)
|
||||||
{
|
{
|
||||||
List<List<(int, int)>> ans = new List<List<(int, int)>>();
|
List<List<(int, int)>> ans = new List<List<(int, int)>>();
|
||||||
if (board_Index.TryGetValue(Index[start].value, out var tip))
|
if (boardIndex.TryGetValue(Index[start].value, out var tip))
|
||||||
foreach (var pos in tip)
|
foreach (var pos in tip)
|
||||||
{
|
{
|
||||||
var (result, path) = test(start, pos);
|
var (result, path) = test(start, pos);
|
||||||
|
@ -120,10 +120,10 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
for (int i = 0; i < sum; i++)
|
for (int i = 0; i < sum; i++)
|
||||||
{
|
{
|
||||||
Bd[cur_height, cur_width] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
Bd[cur_height, cur_width] = board_Funcs.getval(ref temp_val_per_Image, ref last_val, types);
|
||||||
if (board_Index.TryGetValue(Bd[cur_height, cur_width], out var index))
|
if (boardIndex.TryGetValue(Bd[cur_height, cur_width], out var index))
|
||||||
index.Add((cur_width, cur_height));
|
index.Add((cur_width, cur_height));
|
||||||
else
|
else
|
||||||
board_Index.Add(Bd[cur_height, cur_width], new List<(int, int)> { (cur_width, cur_height) });
|
boardIndex.Add(Bd[cur_height, cur_width], new List<(int, int)> { (cur_width, cur_height) });
|
||||||
Index[(cur_width, cur_height)].value = Bd[cur_height, cur_width];
|
Index[(cur_width, cur_height)].value = Bd[cur_height, cur_width];
|
||||||
cur_width++;
|
cur_width++;
|
||||||
if (cur_width > width)
|
if (cur_width > width)
|
||||||
|
@ -151,7 +151,7 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
|
|
||||||
public int[,] remake_board()
|
public int[,] remake_board()
|
||||||
{
|
{
|
||||||
board_Index.Clear();
|
boardIndex.Clear();
|
||||||
int[] temp_val_per_Image = (int[])Vals_per_Image.Clone();
|
int[] temp_val_per_Image = (int[])Vals_per_Image.Clone();
|
||||||
var (width, height) = size;
|
var (width, height) = size;
|
||||||
int[,] Bd = new int[height + 2, width + 2];
|
int[,] Bd = new int[height + 2, width + 2];
|
||||||
|
@ -165,10 +165,10 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
continue;
|
continue;
|
||||||
node.value = board_Funcs.getval(ref temp_val_per_Image, ref last_val, Etcs.Images_size());
|
node.value = board_Funcs.getval(ref temp_val_per_Image, ref last_val, Etcs.Images_size());
|
||||||
Bd[node.y,node.x] = node.value;
|
Bd[node.y,node.x] = node.value;
|
||||||
if(board_Index.TryGetValue(node.value,out var list))
|
if(boardIndex.TryGetValue(node.value,out var list))
|
||||||
list.Add((node.x, node.y));
|
list.Add((node.x, node.y));
|
||||||
else
|
else
|
||||||
board_Index.Add(node.value, new List<(int, int)> { (node.x, node.y) });
|
boardIndex.Add(node.value, new List<(int, int)> { (node.x, node.y) });
|
||||||
}
|
}
|
||||||
return Bd;
|
return Bd;
|
||||||
}
|
}
|
||||||
|
@ -308,5 +308,17 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public (int, int) GetRandomBlock()
|
||||||
|
{
|
||||||
|
Random random = new();
|
||||||
|
int k = random.Next(0, boardIndex.Count);
|
||||||
|
for(int i = 0;i<boardIndex.Count(); i++)
|
||||||
|
{
|
||||||
|
if (boardIndex[k + i].Count != 0)
|
||||||
|
return boardIndex[k + i][random.Next(0, boardIndex[k + i].Count)];
|
||||||
|
}
|
||||||
|
return (-1, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,5 +14,6 @@ namespace CDSAE3_Lian_Lian_Kan.Boards
|
||||||
public void decrease(params (int, int)[] poss);
|
public void decrease(params (int, int)[] poss);
|
||||||
public List<List<(int, int)>> get_tip((int, int) start);
|
public List<List<(int, int)>> get_tip((int, int) start);
|
||||||
public (int, int) size { get; set; }//width,height
|
public (int, int) size { get; set; }//width,height
|
||||||
|
public (int, int) GetRandomBlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,11 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="FftSharp" Version="1.1.6" />
|
||||||
<PackageReference Include="NAudio" Version="2.2.1" />
|
<PackageReference Include="NAudio" Version="2.2.1" />
|
||||||
|
<PackageReference Include="OpenCvSharp4" Version="4.9.0.20240103" />
|
||||||
|
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.9.0.20240103" />
|
||||||
|
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.9.0.20240103" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -41,6 +45,10 @@
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Forms\AudioVisualizer\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>
|
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -65,11 +66,18 @@ namespace CDSAE3_Lian_Lian_Kan
|
||||||
easy = 0,
|
easy = 0,
|
||||||
normal = 1,
|
normal = 1,
|
||||||
hard = 2,
|
hard = 2,
|
||||||
custom = 3
|
custom = 3,
|
||||||
|
challenge = 4
|
||||||
|
}
|
||||||
|
public enum Algorithm
|
||||||
|
{
|
||||||
|
Array = 0,
|
||||||
|
Graph = 1
|
||||||
}
|
}
|
||||||
public enum Theme
|
public enum Theme
|
||||||
{
|
{
|
||||||
fruit = 0
|
fruit = 0,
|
||||||
|
code = 1
|
||||||
}
|
}
|
||||||
public enum Direction
|
public enum Direction
|
||||||
{
|
{
|
||||||
|
@ -106,26 +114,30 @@ namespace CDSAE3_Lian_Lian_Kan
|
||||||
{8,100.0/10 },
|
{8,100.0/10 },
|
||||||
{9,100.0/5 },
|
{9,100.0/5 },
|
||||||
{10,100.0/3 }};
|
{10,100.0/3 }};
|
||||||
|
public static string curAlbum = "C418";
|
||||||
public static int cus_height = 1, cus_width = 1;
|
public static int cus_height = 1, cus_width = 1;
|
||||||
|
public static Algorithm curAlgorithm = Algorithm.Array;
|
||||||
public static Dictionary<string, ThemeInfo> themes { get; set; } = JsonSerializer.Deserialize<ThemeInfos>(File.ReadAllText("Resources\\sources.json"), new JsonSerializerOptions()
|
public static Dictionary<string, ThemeInfo> themes { get; set; } = JsonSerializer.Deserialize<ThemeInfos>(File.ReadAllText("Resources\\sources.json"), new JsonSerializerOptions()
|
||||||
{Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
|
{Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
|
||||||
})!.Themes!.ToDictionary(x => x.Name);
|
})!.Themes!.ToDictionary(x => x.Name);
|
||||||
public static System.Timers.Timer hunderd_millsecond_timer { get; set; } = new System.Timers.Timer(100) { AutoReset = true, Enabled = true };
|
public static System.Timers.Timer hunderd_millsecond_timer { get; set; } = new System.Timers.Timer(100) { AutoReset = true, Enabled = true };
|
||||||
public static Difficulty current_difficulty { get; set; } = Difficulty.normal;
|
public static Difficulty current_difficulty { get; set; } = Difficulty.normal;
|
||||||
public static Theme current_block_theme { get; set; }
|
public static Theme current_block_theme { get; set; } = Theme.fruit;
|
||||||
public static ThemeInfo currentThemeInfo { get; set; } = themes["Fruit"];
|
public static ThemeInfo currentThemeInfo { get; set; } = themes["Fruit"];
|
||||||
public static Image trans_Image { get; set; } = Resources.trans;
|
public static Image trans_Image { get; set; } = Resources.trans;
|
||||||
public static (int, int) get_length_width() => current_difficulty != Difficulty.custom ? (7 * (1 + (int)current_difficulty), 4 * (1 + (int)current_difficulty)) : (cus_width, cus_height);
|
public static (int, int) get_length_width() => current_difficulty == Difficulty.challenge ? (18, 9) : (current_difficulty != Difficulty.custom ? (7 * (1 + (int)current_difficulty), 4 * (1 + (int)current_difficulty)) : (cus_width, cus_height));
|
||||||
public static List<Image> block_Images { get; set; } = new List<Image> { Resources.Apple, Resources.Banana, Resources.Beetroot, Resources.Cherry, Resources.Corn, Resources.Eggplant, Resources.Grape, Resources.Pear, Resources.Strawberry, Resources.Watermelon };
|
public static ConcurrentBag<Image> fruit_Images { get; set; } = new() { Resources.Apple, Resources.Banana, Resources.Beetroot, Resources.Cherry, Resources.Corn, Resources.Eggplant, Resources.Grape, Resources.Pear, Resources.Strawberry, Resources.Watermelon };
|
||||||
public static List<Image> disappear_Images { get; set; } = new List<Image> { Resources.Gapple, Resources.Gbanana, Resources.Gbeetroot, Resources.Gcherry, Resources.Gcorn, Resources.Geggplant, Resources.Ggrape, Resources.Gpear, Resources.Gstrawberry, Resources.Gwatermelon };
|
public static ConcurrentBag<Image> disappear_fruit_Images { get; set; } = new () { Resources.Gapple, Resources.Gbanana, Resources.Gbeetroot, Resources.Gcherry, Resources.Gcorn, Resources.Geggplant, Resources.Ggrape, Resources.Gpear, Resources.Gstrawberry, Resources.Gwatermelon };
|
||||||
public static List<Image> direction_Images { get; set; } = new List<Image> { Resources.trans, Resources.u, Resources.r, Resources.ur, Resources.d, Resources.ud, Resources.dr, Resources.udr, Resources.l, Resources.ul, Resources.lr, Resources.ulr, Resources.dl, Resources.udl, Resources.dlr, Resources.udlr };
|
public static ConcurrentBag<Image> code_Images { get; set; } = new() { Resources.cpp, Resources.cSharp, Resources.go, Resources.java, Resources.kotlin, Resources.python, Resources.ruby, Resources.rust, Resources.vue};
|
||||||
public static List<Image> tip_direction_Image { get; set; } = new List<Image> { Resources.trans, Resources.tip_u, Resources.tip_r, Resources.tip_ur, Resources.tip_d, Resources.tip_ud, Resources.tip_dr, Resources.tip_udr, Resources.tip_l, Resources.tip_ul, Resources.tip_lr, Resources.tip_ulr, Resources.tip_dl, Resources.tip_udl, Resources.tip_dlr, Resources.tip_udlr };
|
public static ConcurrentBag<Image> disappear_code_Images { get; set; } = new() { Resources.Gcpp, Resources.GcSharp, Resources.Ggo, Resources.Gjava, Resources.Gkotlin, Resources.Gpython, Resources.Gruby, Resources.Grust, Resources.Gvue };
|
||||||
public static Image get_block_Image(int t) => block_Images[t];
|
public static ConcurrentDictionary<Direction, Image> direction_Images { get; set; } = new ConcurrentDictionary<Direction, Image>(new List<Image> { Resources.trans, Resources.u, Resources.r, Resources.ur, Resources.d, Resources.ud, Resources.dr, Resources.udr, Resources.l, Resources.ul, Resources.lr, Resources.ulr, Resources.dl, Resources.udl, Resources.dlr, Resources.udlr }.Select((value, index) => new { Index = (Direction)index, Value = value }).ToDictionary(item => item.Index, item => item.Value));
|
||||||
public static Image get_disappear_Images(int t) => disappear_Images[t];
|
public static ConcurrentDictionary<Direction,Image> direction_Images_white_version { get; set; } = new ConcurrentDictionary<Direction,Image> (new List<Image>(){ Resources.trans, Resources.w_u, Resources.w_r, Resources.w_ur, Resources.w_d, Resources.w_ud, Resources.w_dr, Resources.w_udr, Resources.w_l, Resources.w_ul, Resources.w_lr, Resources.w_ulr, Resources.w_dl, Resources.w_udl, Resources.w_dlr, Resources.w_udlr }.Select((value, index) => new { Index = (Direction)index, Value = value }).ToDictionary(item => item.Index, item => item.Value));
|
||||||
public static Image get_direction_Image(Direction direction) => direction_Images[(int)direction];
|
public static ConcurrentDictionary<Direction,Image> tip_direction_Image { get; set; } = new ConcurrentDictionary<Direction, Image>(new List<Image>{ Resources.trans, Resources.tip_u, Resources.tip_r, Resources.tip_ur, Resources.tip_d, Resources.tip_ud, Resources.tip_dr, Resources.tip_udr, Resources.tip_l, Resources.tip_ul, Resources.tip_lr, Resources.tip_ulr, Resources.tip_dl, Resources.tip_udl, Resources.tip_dlr, Resources.tip_udlr }.Select((value, index) => new { Index = (Direction)index, Value = value }).ToDictionary(item => item.Index, item => item.Value));
|
||||||
public static int Images_size() => current_block_theme switch { Theme.fruit => 10, _ => 0, };
|
public static Image get_block_Image(int t) => current_block_theme == Theme.fruit ? fruit_Images.ElementAt(t) : code_Images.ElementAt(t);
|
||||||
public static Image get_tip_direction_Image(Direction direction) => tip_direction_Image[(int)direction];
|
public static Image get_disappear_Images(int t) => current_block_theme == Theme.fruit ? disappear_fruit_Images.ElementAt(t) : disappear_code_Images.ElementAt(t);
|
||||||
|
public static Image get_direction_Image(Direction direction) => current_difficulty != Difficulty.challenge ? direction_Images.GetOrAdd(direction, (dire) => null!) : direction_Images_white_version.GetOrAdd(direction,(dire)=>null!);
|
||||||
|
public static int Images_size() => current_block_theme switch { Theme.fruit => fruit_Images.Count(), Theme.code => code_Images.Count(), _ => 0 };
|
||||||
|
public static Image get_tip_direction_Image(Direction direction) => tip_direction_Image.GetOrAdd(direction, (dire) => null!);
|
||||||
public static LianLianKan? form { get; set; }
|
public static LianLianKan? form { get; set; }
|
||||||
public static IGameControl? gameForm { get; set; }//gameBoard
|
public static IGameControl? gameForm { get; set; }//gameBoard
|
||||||
public static IGameMode? gameModeForm { get; set; }//entireGame
|
public static IGameMode? gameModeForm { get; set; }//entireGame
|
||||||
|
@ -135,7 +147,8 @@ namespace CDSAE3_Lian_Lian_Kan
|
||||||
public static Color sel_Color { get; set; } = Color.FromArgb(0, 122, 204);
|
public static Color sel_Color { get; set; } = Color.FromArgb(0, 122, 204);
|
||||||
public static Color mouse_upper_color { get; set; } = Color.FromArgb(97, 97, 108);
|
public static Color mouse_upper_color { get; set; } = Color.FromArgb(97, 97, 108);
|
||||||
public static Dictionary<string, List<string>> musics { get; set; } = new Dictionary<string, List<string>> { { "C418", new List<string> { "C418 - Beginning 2", "C418 - Floating Trees", "C418 - Moog City 2", "C418 - Mutation" } },
|
public static Dictionary<string, List<string>> musics { get; set; } = new Dictionary<string, List<string>> { { "C418", new List<string> { "C418 - Beginning 2", "C418 - Floating Trees", "C418 - Moog City 2", "C418 - Mutation" } },
|
||||||
{"Sea Power",new List<string>{ "Sea Power - Advesperascit", "Sea Power - Burn, Baby, Burn", "Sea Power - Detective Arriving on the Scene", "Sea Power - Disco Elysium, Pt 1", "Sea Power - Disco Elysium, Pt 2", "Sea Power - Ecstatic Vibrations, Totally Transcendent", "Sea Power - Hope in Work and Joy in Leisure", "Sea Power - Ignus Nilsen Waltz", "Sea Power - Instrument of Surrender", "Sea Power - Krenel, Downwell, Somatosensor", "Sea Power - La Revacholiere", "Sea Power - Live With Me", "Sea Power - Martinaise, Terminal B", "Sea Power - Miss Oranje Disco Dancer", "Sea Power - Off We Go Into the Wild Pale Yonder", "Sea Power - Ployhedrons", "Sea Power - Precinct 41 Major Crime Unit", "Sea Power - Rue de Saint-Gislaine", "Sea Power - Saint-Brune 1147", "Sea Power - The Cryptozoologists", "Sea Power - The Doomed Commercial Area", "Sea Power - The Field Autopsy", "Sea Power - The Insulindian Miracle", "Sea Power - Tiger King", "Sea Power - We Are Not Checkmated", "Sea Power - Whirling In Rags 12Pm", "Sea Power - Whirling in Rags 8am", "Sea Power - Whirling in Rags 8pm", "Sea Power - Your Body Betrays Your Degeneracy", "Sea Power - Zaum" } } };
|
{"Sea Power",new List<string>{ "Sea Power - Advesperascit", "Sea Power - Burn, Baby, Burn", "Sea Power - Detective Arriving on the Scene", "Sea Power - Disco Elysium, Pt 1", "Sea Power - Disco Elysium, Pt 2", "Sea Power - Ecstatic Vibrations, Totally Transcendent", "Sea Power - Hope in Work and Joy in Leisure", "Sea Power - Ignus Nilsen Waltz", "Sea Power - Instrument of Surrender", "Sea Power - Krenel, Downwell, Somatosensor", "Sea Power - La Revacholiere", "Sea Power - Live With Me", "Sea Power - Martinaise, Terminal B", "Sea Power - Miss Oranje Disco Dancer", "Sea Power - Off We Go Into the Wild Pale Yonder", "Sea Power - Ployhedrons", "Sea Power - Precinct 41 Major Crime Unit", "Sea Power - Rue de Saint-Gislaine", "Sea Power - Saint-Brune 1147", "Sea Power - The Cryptozoologists", "Sea Power - The Doomed Commercial Area", "Sea Power - The Field Autopsy", "Sea Power - The Insulindian Miracle", "Sea Power - Tiger King", "Sea Power - We Are Not Checkmated", "Sea Power - Whirling In Rags 12Pm", "Sea Power - Whirling in Rags 8am", "Sea Power - Whirling in Rags 8pm", "Sea Power - Your Body Betrays Your Degeneracy", "Sea Power - Zaum" } } ,
|
||||||
|
{"Tatsh",new List<string>{ "Tatsh - Xenolith" } } };
|
||||||
public static Audio_res_manager audio_Res_Manager { get; set; } = new Audio_res_manager();
|
public static Audio_res_manager audio_Res_Manager { get; set; } = new Audio_res_manager();
|
||||||
public static Song_Audio_processer song_Audio_Processer { get; set; } = new Song_Audio_processer();
|
public static Song_Audio_processer song_Audio_Processer { get; set; } = new Song_Audio_processer();
|
||||||
public static Info_Audio_processer info_Audio_Processer { get; set; } = new Info_Audio_processer();
|
public static Info_Audio_processer info_Audio_Processer { get; set; } = new Info_Audio_processer();
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using OpenCvSharp;
|
||||||
|
using OpenCvSharp.Extensions;
|
||||||
|
|
||||||
|
namespace CDSAE3_Lian_Lian_Kan.Extensions
|
||||||
|
{
|
||||||
|
|
||||||
|
public static class BitmapExtensions
|
||||||
|
{
|
||||||
|
public static Bitmap GaussianBlur(this Bitmap Bmp)
|
||||||
|
{
|
||||||
|
Mat src = BitmapConverter.ToMat(Bmp);
|
||||||
|
Mat dest = new Mat();
|
||||||
|
Cv2.Blur(src, dest, new OpenCvSharp.Size(50,50));
|
||||||
|
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
namespace AudioVisualizer
|
||||||
|
{
|
||||||
|
partial class MainWindow
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
components = new System.ComponentModel.Container();
|
||||||
|
dataTimer = new System.Windows.Forms.Timer(components);
|
||||||
|
drawingPanel = new Panel();
|
||||||
|
drawingTimer = new System.Windows.Forms.Timer(components);
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// dataTimer
|
||||||
|
//
|
||||||
|
dataTimer.Interval = 30;
|
||||||
|
dataTimer.Tick += DataTimer_Tick;
|
||||||
|
//
|
||||||
|
// drawingPanel
|
||||||
|
//
|
||||||
|
drawingPanel.Dock = DockStyle.Fill;
|
||||||
|
drawingPanel.Location = new Point(0, 0);
|
||||||
|
drawingPanel.Name = "drawingPanel";
|
||||||
|
drawingPanel.Size = new Size(880, 432);
|
||||||
|
drawingPanel.TabIndex = 0;
|
||||||
|
drawingPanel.MouseDoubleClick += DrawingPanel_MouseDoubleClick;
|
||||||
|
//
|
||||||
|
// drawingTimer
|
||||||
|
//
|
||||||
|
drawingTimer.Interval = 30;
|
||||||
|
drawingTimer.Tick += DrawingTimer_Tick;
|
||||||
|
//
|
||||||
|
// MainWindow
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
BackColor = Color.Black;
|
||||||
|
ClientSize = new Size(880, 432);
|
||||||
|
Controls.Add(drawingPanel);
|
||||||
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
|
Name = "MainWindow";
|
||||||
|
Text = "Music Visualizer";
|
||||||
|
FormClosed += MainWindow_FormClosed;
|
||||||
|
Load += MainWindow_Load;
|
||||||
|
ResumeLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Timer dataTimer;
|
||||||
|
private Panel drawingPanel;
|
||||||
|
private System.Windows.Forms.Timer drawingTimer;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,466 @@
|
||||||
|
using LibAudioVisualizer;
|
||||||
|
using NAudio.CoreAudioApi;
|
||||||
|
using NAudio.Wave;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace AudioVisualizer
|
||||||
|
{
|
||||||
|
public partial class MainWindow : Form
|
||||||
|
{
|
||||||
|
WasapiCapture capture; // 音频捕获
|
||||||
|
Visualizer visualizer; // 可视化
|
||||||
|
double[]? spectrumData; // 频谱数据
|
||||||
|
|
||||||
|
Color[] allColors; // 渐变颜色
|
||||||
|
|
||||||
|
public MainWindow()
|
||||||
|
{
|
||||||
|
capture = new WasapiLoopbackCapture(); // 捕获电脑发出的声音
|
||||||
|
visualizer = new Visualizer(256); // 新建一个可视化器, 并使用 256 个采样进行傅里叶变换
|
||||||
|
|
||||||
|
allColors = GetAllHsvColors(); // 获取所有的渐变颜色 (HSV 颜色)
|
||||||
|
|
||||||
|
capture.WaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(8192, 1); // 指定捕获的格式, 单声道, 32位深度, IeeeFloat 编码, 8192采样率
|
||||||
|
capture.DataAvailable += Capture_DataAvailable; // 订阅事件
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取 HSV 中所有的基础颜色 (饱和度和明度均为最大值)
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>所有的 HSV 基础颜色(共 256 * 6 个, 并且随着索引增加, 颜色也会渐变)</returns>
|
||||||
|
private Color[] GetAllHsvColors()
|
||||||
|
{
|
||||||
|
Color[] result = new Color[256 * 6];
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[i] = Color.FromArgb(255, i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[256 + i] = Color.FromArgb(255 - i, 255, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[512 + i] = Color.FromArgb(0, 255, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[768 + i] = Color.FromArgb(0, 255 - i, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[1024 + i] = Color.FromArgb(i, 0, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
result[1280 + i] = Color.FromArgb(255, 0, 255 - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当捕获有数据的时候, 就怼到可视化器里面
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
private void Capture_DataAvailable(object? sender, WaveInEventArgs e)
|
||||||
|
{
|
||||||
|
int length = e.BytesRecorded / 4; // 采样的数量 (每一个采样是 4 字节)
|
||||||
|
double[] result = new double[length]; // 声明结果
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
result[i] = BitConverter.ToSingle(e.Buffer, i * 4); // 取出采样值
|
||||||
|
|
||||||
|
visualizer.PushSampleData(result); // 将新的采样存储到 可视化器 中
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用来刷新频谱数据以及实现频谱数据缓动
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
private void DataTimer_Tick(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
double[] newSpectrumData = visualizer.GetSpectrumData(); // 从可视化器中获取频谱数据
|
||||||
|
newSpectrumData = Visualizer.GetBlurry(newSpectrumData, 2); // 平滑频谱数据
|
||||||
|
|
||||||
|
spectrumData = newSpectrumData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 绘制一个渐变的 波浪
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g">绘图目标</param>
|
||||||
|
/// <param name="down">下方颜色</param>
|
||||||
|
/// <param name="up">上方颜色</param>
|
||||||
|
/// <param name="spectrumData">频谱数据</param>
|
||||||
|
/// <param name="pointCount">波浪中, 点的数量</param>
|
||||||
|
/// <param name="drawingWidth">波浪的宽度</param>
|
||||||
|
/// <param name="xOffset">波浪的起始X坐标</param>
|
||||||
|
/// <param name="yOffset">波浪的其实Y坐标</param>
|
||||||
|
/// <param name="scale">频谱的缩放(使用负值可以翻转波浪)</param>
|
||||||
|
private void DrawGradient(Graphics g, Color down, Color up, double[] spectrumData, int pointCount, int drawingWidth, float xOffset, float yOffset, double scale)
|
||||||
|
{
|
||||||
|
GraphicsPath path = new GraphicsPath();
|
||||||
|
|
||||||
|
PointF[] points = new PointF[pointCount + 2];
|
||||||
|
for (int i = 0; i < pointCount; i++)
|
||||||
|
{
|
||||||
|
double x = i * drawingWidth / pointCount + xOffset;
|
||||||
|
double y = spectrumData[i * spectrumData.Length / pointCount] * scale + yOffset;
|
||||||
|
points[i + 1] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
points[0] = new PointF(xOffset, yOffset);
|
||||||
|
points[points.Length - 1] = new PointF(xOffset + drawingWidth, yOffset);
|
||||||
|
|
||||||
|
path.AddCurve(points);
|
||||||
|
|
||||||
|
float upP = (float)points.Min(v => v.Y);
|
||||||
|
|
||||||
|
if (Math.Abs(upP - yOffset) < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
using Brush brush = new LinearGradientBrush(new PointF(0, yOffset), new PointF(0, upP), down, up);
|
||||||
|
g.FillPath(brush, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 绘制渐变的条形
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g">绘图目标</param>
|
||||||
|
/// <param name="down">下方颜色</param>
|
||||||
|
/// <param name="up">上方颜色</param>
|
||||||
|
/// <param name="spectrumData">频谱数据</param>
|
||||||
|
/// <param name="stripCount">条形的数量</param>
|
||||||
|
/// <param name="drawingWidth">绘图的宽度</param>
|
||||||
|
/// <param name="xOffset">绘图的起始 X 坐标</param>
|
||||||
|
/// <param name="yOffset">绘图的起始 Y 坐标</param>
|
||||||
|
/// <param name="spacing">条形与条形之间的间隔(像素)</param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
private void DrawGradientStrips(Graphics g, Color down, Color up, double[] spectrumData, int stripCount, int drawingWidth, float xOffset, float yOffset, float spacing, double scale)
|
||||||
|
{
|
||||||
|
float stripWidth = (drawingWidth - spacing * stripCount) / stripCount;
|
||||||
|
PointF[] points = new PointF[stripCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
double x = stripWidth * i + spacing * i + xOffset;
|
||||||
|
double y = spectrumData[i * spectrumData.Length / stripCount] * scale; // height
|
||||||
|
points[i] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float upP = (float)points.Min(v => v.Y < 0 ? yOffset + v.Y : yOffset);
|
||||||
|
float downP = (float)points.Max(v => v.Y < 0 ? yOffset : yOffset + v.Y);
|
||||||
|
|
||||||
|
if (downP < yOffset)
|
||||||
|
downP = yOffset;
|
||||||
|
|
||||||
|
if (Math.Abs(upP - downP) < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
using Brush brush = new LinearGradientBrush(new PointF(0, downP), new PointF(0, upP), down, up);
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
PointF p = points[i];
|
||||||
|
float y = yOffset;
|
||||||
|
float height = p.Y;
|
||||||
|
|
||||||
|
if (height < 0)
|
||||||
|
{
|
||||||
|
y += height;
|
||||||
|
height = -height;
|
||||||
|
}
|
||||||
|
|
||||||
|
g.FillRectangle(brush, new RectangleF(p.X, y, stripWidth, height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画曲线
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g"></param>
|
||||||
|
/// <param name="pen"></param>
|
||||||
|
/// <param name="spectrumData"></param>
|
||||||
|
/// <param name="pointCount"></param>
|
||||||
|
/// <param name="drawingWidth"></param>
|
||||||
|
/// <param name="xOffset"></param>
|
||||||
|
/// <param name="yOffset"></param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
private void DrawCurve(Graphics g, Pen pen, double[] spectrumData, int pointCount, int drawingWidth, double xOffset, double yOffset, double scale)
|
||||||
|
{
|
||||||
|
PointF[] points = new PointF[pointCount];
|
||||||
|
for (int i = 0; i < pointCount; i++)
|
||||||
|
{
|
||||||
|
double x = i * drawingWidth / pointCount + xOffset;
|
||||||
|
double y = spectrumData[i * spectrumData.Length / pointCount] * scale + yOffset;
|
||||||
|
points[i] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
g.DrawCurve(pen, points);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画简单的圆环线条
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g"></param>
|
||||||
|
/// <param name="brush"></param>
|
||||||
|
/// <param name="spectrumData"></param>
|
||||||
|
/// <param name="stripCount"></param>
|
||||||
|
/// <param name="xOffset"></param>
|
||||||
|
/// <param name="yOffset"></param>
|
||||||
|
/// <param name="radius"></param>
|
||||||
|
/// <param name="spacing"></param>
|
||||||
|
/// <param name="rotation"></param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
private void DrawCircleStrips(Graphics g, Brush brush, double[] spectrumData, int stripCount, double xOffset, double yOffset, double radius, double spacing, double rotation, double scale)
|
||||||
|
{
|
||||||
|
double rotationAngle = Math.PI / 180 * rotation;
|
||||||
|
double blockWidth = MathF.PI * 2 / stripCount; // angle
|
||||||
|
double stripWidth = blockWidth - MathF.PI / 180 * spacing; // angle
|
||||||
|
PointF[] points = new PointF[stripCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
double x = blockWidth * i + rotationAngle; // angle
|
||||||
|
double y = spectrumData[i * spectrumData.Length / stripCount] * scale; // height
|
||||||
|
points[i] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
PointF p = points[i];
|
||||||
|
double sinStart = Math.Sin(p.X);
|
||||||
|
double sinEnd = Math.Sin(p.X + stripWidth);
|
||||||
|
double cosStart = Math.Cos(p.X);
|
||||||
|
double cosEnd = Math.Cos(p.X + stripWidth);
|
||||||
|
|
||||||
|
PointF[] polygon = new PointF[]
|
||||||
|
{
|
||||||
|
new PointF((float)(cosStart * radius + xOffset), (float)(sinStart * radius + yOffset)),
|
||||||
|
new PointF((float)(cosEnd * radius + xOffset), (float)(sinEnd * radius + yOffset)),
|
||||||
|
new PointF((float)(cosEnd * (radius + p.Y) + xOffset), (float)(sinEnd * (radius + p.Y) + yOffset)),
|
||||||
|
new PointF((float)(cosStart * (radius + p.Y) + xOffset), (float)(sinStart * (radius + p.Y) + yOffset)),
|
||||||
|
};
|
||||||
|
|
||||||
|
g.FillPolygon(brush, polygon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画圆环渐变条
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g"></param>
|
||||||
|
/// <param name="inner"></param>
|
||||||
|
/// <param name="outer"></param>
|
||||||
|
/// <param name="spectrumData"></param>
|
||||||
|
/// <param name="stripCount"></param>
|
||||||
|
/// <param name="xOffset"></param>
|
||||||
|
/// <param name="yOffset"></param>
|
||||||
|
/// <param name="radius"></param>
|
||||||
|
/// <param name="spacing"></param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
private void DrawCircleGradientStrips(Graphics g, Color inner, Color outer, double[] spectrumData, int stripCount, double xOffset, double yOffset, double radius, double spacing, double rotation, double scale)
|
||||||
|
{
|
||||||
|
double rotationAngle = Math.PI / 180 * rotation;
|
||||||
|
double blockWidth = Math.PI * 2 / stripCount; // angle
|
||||||
|
double stripWidth = blockWidth - MathF.PI / 180 * spacing; // angle
|
||||||
|
PointF[] points = new PointF[stripCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
double x = blockWidth * i + rotationAngle; // angle
|
||||||
|
double y = spectrumData[i * spectrumData.Length / stripCount] * scale; // height
|
||||||
|
points[i] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
double maxHeight = points.Max(v => v.Y);
|
||||||
|
double outerRadius = radius + maxHeight;
|
||||||
|
|
||||||
|
PointF[] polygon = new PointF[4];
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
PointF p = points[i];
|
||||||
|
double sinStart = Math.Sin(p.X);
|
||||||
|
double sinEnd = Math.Sin(p.X + stripWidth);
|
||||||
|
double cosStart = Math.Cos(p.X);
|
||||||
|
double cosEnd = Math.Cos(p.X + stripWidth);
|
||||||
|
|
||||||
|
PointF
|
||||||
|
p1 = new PointF((float)(cosStart * radius + xOffset),(float)(sinStart * radius + yOffset)),
|
||||||
|
p2 = new PointF((float)(cosEnd * radius + xOffset),(float)(sinEnd * radius + yOffset)),
|
||||||
|
p3 = new PointF((float)(cosEnd * (radius + p.Y) + xOffset), (float)(sinEnd * (radius + p.Y) + yOffset)),
|
||||||
|
p4 = new PointF((float)(cosStart * (radius + p.Y) + xOffset), (float)(sinStart * (radius + p.Y) + yOffset));
|
||||||
|
|
||||||
|
polygon[0] = p1;
|
||||||
|
polygon[1] = p2;
|
||||||
|
polygon[2] = p3;
|
||||||
|
polygon[3] = p4;
|
||||||
|
|
||||||
|
|
||||||
|
PointF innerP = new PointF((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2);
|
||||||
|
PointF outerP = new PointF((p3.X + p4.X) / 2, (p3.Y + p4.Y) / 2);
|
||||||
|
|
||||||
|
Vector2 offset = new Vector2(outerP.X - innerP.X, outerP.Y - innerP.Y);
|
||||||
|
if (MathF.Sqrt(offset.X * offset.X + offset.Y * offset.Y) < 1) // 渐变笔刷两点之间距离不能太小
|
||||||
|
continue;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using LinearGradientBrush brush = new LinearGradientBrush(innerP, outerP, inner, outer); // 这里有玄学 bug, 这个 线性笔刷会 OutMemoryException
|
||||||
|
g.FillPolygon(brush, polygon); // 但是实际上不应该有这个异常...
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画简单的线条
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g"></param>
|
||||||
|
/// <param name="brush"></param>
|
||||||
|
/// <param name="spectrumData"></param>
|
||||||
|
/// <param name="stripCount"></param>
|
||||||
|
/// <param name="drawingWidth"></param>
|
||||||
|
/// <param name="xOffset"></param>
|
||||||
|
/// <param name="yOffset"></param>
|
||||||
|
/// <param name="spacing"></param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
private void DrawStrips(Graphics g, Brush brush, double[] spectrumData, int stripCount, int drawingWidth, float xOffset, float yOffset, float spacing, double scale)
|
||||||
|
{
|
||||||
|
float stripWidth = (drawingWidth - spacing * stripCount) / stripCount;
|
||||||
|
PointF[] points = new PointF[stripCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
double x = stripWidth * i + spacing * i + xOffset;
|
||||||
|
double y = spectrumData[i * spectrumData.Length / stripCount] * scale; // height
|
||||||
|
points[i] = new PointF((float)x, (float)y);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < stripCount; i++)
|
||||||
|
{
|
||||||
|
PointF p = points[i];
|
||||||
|
float y = yOffset;
|
||||||
|
float height = p.Y;
|
||||||
|
|
||||||
|
if (height < 0)
|
||||||
|
{
|
||||||
|
y += height;
|
||||||
|
height = -height;
|
||||||
|
}
|
||||||
|
|
||||||
|
g.FillRectangle(brush, new RectangleF(p.X, y, stripWidth, height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画渐变的边框
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="g"></param>
|
||||||
|
/// <param name="inner"></param>
|
||||||
|
/// <param name="outer"></param>
|
||||||
|
/// <param name="area"></param>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
/// <param name="width"></param>
|
||||||
|
private void DrawGradientBorder(Graphics g, Color inner, Color outer, Rectangle area, double scale, float width)
|
||||||
|
{
|
||||||
|
int thickness = (int)(width * scale);
|
||||||
|
if (thickness < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Rectangle rect = new Rectangle(area.X, area.Y, area.Width, area.Height);
|
||||||
|
|
||||||
|
Rectangle up = new Rectangle(rect.Location, new Size(rect.Width, thickness));
|
||||||
|
Rectangle down = new Rectangle(new Point(rect.X, (int)(rect.X + rect.Height - scale * width)), new Size(rect.Width, thickness));
|
||||||
|
Rectangle left = new Rectangle(rect.Location, new Size(thickness, rect.Height));
|
||||||
|
Rectangle right = new Rectangle(new Point((int)(rect.X + rect.Width - scale * width), rect.Y), new Size(thickness, rect.Height));
|
||||||
|
|
||||||
|
LinearGradientBrush upB = new LinearGradientBrush(up, outer, inner, LinearGradientMode.Vertical);
|
||||||
|
LinearGradientBrush downB = new LinearGradientBrush(down, inner, outer, LinearGradientMode.Vertical);
|
||||||
|
LinearGradientBrush leftB = new LinearGradientBrush(left, outer, inner, LinearGradientMode.Horizontal);
|
||||||
|
LinearGradientBrush rightB = new LinearGradientBrush(right, inner, outer, LinearGradientMode.Horizontal);
|
||||||
|
|
||||||
|
upB.WrapMode = downB.WrapMode = leftB.WrapMode = rightB.WrapMode = WrapMode.TileFlipXY;
|
||||||
|
|
||||||
|
g.FillRectangle(upB, up);
|
||||||
|
g.FillRectangle(downB, down);
|
||||||
|
g.FillRectangle(leftB, left);
|
||||||
|
g.FillRectangle(rightB, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
int colorIndex = 0;
|
||||||
|
double rotation = 0;
|
||||||
|
BufferedGraphics? oldBuffer;
|
||||||
|
private void DrawingTimer_Tick(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (spectrumData == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
rotation += 0.1;
|
||||||
|
colorIndex++;
|
||||||
|
|
||||||
|
Color color1 = allColors[colorIndex % allColors.Length];
|
||||||
|
Color color2 = allColors[(colorIndex + 200) % allColors.Length];
|
||||||
|
|
||||||
|
double[] bassArea = Visualizer.TakeSpectrumOfFrequency(spectrumData, capture.WaveFormat.SampleRate, 250); // 低频区域
|
||||||
|
double bassScale = bassArea.Average() * 100; // 低音导致的缩放 (比例数)
|
||||||
|
double extraScale = Math.Min(drawingPanel.Width, drawingPanel.Height) / 6; // 低音导致的缩放 (乘上窗口大小)
|
||||||
|
|
||||||
|
Rectangle border = new Rectangle(Point.Empty, drawingPanel.Size);
|
||||||
|
|
||||||
|
BufferedGraphics buffer = BufferedGraphicsManager.Current.Allocate(drawingPanel.CreateGraphics(), drawingPanel.ClientRectangle);
|
||||||
|
Graphics g = buffer.Graphics;
|
||||||
|
|
||||||
|
if (oldBuffer != null)
|
||||||
|
{
|
||||||
|
//oldBuffer.Render(buffer.Graphics); // 如果你想要实现 "留影" 效果, 就取消注释这段代码, 并且将 g.Clear 改为 g.FillRectange(xxx, 半透明的黑色)
|
||||||
|
oldBuffer.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
using Pen pen = new Pen(Color.Pink); // 画音频采样波形用的笔
|
||||||
|
|
||||||
|
g.SmoothingMode = SmoothingMode.HighQuality; // 嗨嗨害, 那必须得是高质量绘图
|
||||||
|
g.Clear(drawingPanel.BackColor);
|
||||||
|
|
||||||
|
//DrawGradientBorder(g, Color.FromArgb(0, color1), color2, border, bassScale, drawingPanel.Width / 10);
|
||||||
|
DrawGradientStrips(g, color1, color2, spectrumData, spectrumData.Length, drawingPanel.Width, 0, drawingPanel.Height, 3, -drawingPanel.Height * 50);
|
||||||
|
//DrawCircleGradientStrips(g, color1, color2, spectrumData, spectrumData.Length, drawingPanel.Width / 2, drawingPanel.Height / 2, MathF.Min(drawingPanel.Width, drawingPanel.Height) / 4 + extraScale * bassScale, 1, rotation, drawingPanel.Width / 6 * 10);
|
||||||
|
|
||||||
|
//DrawCurve(g, pen, visualizer.SampleData, visualizer.SampleData.Length, drawingPanel.Width, 0, drawingPanel.Height / 2, MathF.Min(drawingPanel.Height / 10, 100));
|
||||||
|
|
||||||
|
buffer.Render();
|
||||||
|
|
||||||
|
oldBuffer = buffer; // 保存一下 buffer (之所以不全局只使用一个 Buffer 是因为,,, 用户可能调整窗口大小, 所以每一帧都必须适应)
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainWindow_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
capture.StartRecording();
|
||||||
|
dataTimer.Start();
|
||||||
|
drawingTimer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainWindow_FormClosed(object sender, FormClosedEventArgs e)
|
||||||
|
{
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawingPanel_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
WindowState = WindowState != FormWindowState.Maximized ? FormWindowState.Maximized : FormWindowState.Normal;
|
||||||
|
FormBorderStyle = WindowState == FormWindowState.Maximized ? FormBorderStyle.None : FormBorderStyle.Sizable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,126 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="dataTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="drawingTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>197, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
|
@ -0,0 +1,106 @@
|
||||||
|
namespace LibDynamics
|
||||||
|
{
|
||||||
|
public class SecondOrderDynamics
|
||||||
|
{
|
||||||
|
private double xp;// previous input
|
||||||
|
private double y, yd; // state variables
|
||||||
|
private double _w, _z, _d, k1, k2, k3; // dynamics constants
|
||||||
|
private double _r;
|
||||||
|
private double _f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 频率
|
||||||
|
/// - 即速度, 单位是赫兹(Hz)
|
||||||
|
/// - 不会影响输出结果的形状, 会影响 '震荡频率'
|
||||||
|
/// </summary>
|
||||||
|
public double F
|
||||||
|
{
|
||||||
|
get => _f; set
|
||||||
|
{
|
||||||
|
_f = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 阻尼 <br />
|
||||||
|
/// - 当为 0 时, 输出将永远震荡不衰减 <br />
|
||||||
|
/// - 当大于 0 小于 1 时, 输出会超出结果, 并逐渐趋于目标 <br />
|
||||||
|
/// - 当为 1 时, 输出的曲线是趋向结果, 并正好在指定频率对应时间内抵达结果 <br />
|
||||||
|
/// - 当大于 1 时, 输出值同样时取向结果, 但速度会更慢, 无法在指定频率对应时间内抵达结果 <br />
|
||||||
|
/// </summary>
|
||||||
|
public double Z
|
||||||
|
{
|
||||||
|
get => _z; set
|
||||||
|
{
|
||||||
|
_z = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始响应
|
||||||
|
/// - 当为 0 时, 数据需要进行 '加速' 来开始运动 <br />
|
||||||
|
/// - 当为 1 时, 数据会立即开始响应 <br />
|
||||||
|
/// - 当大于 1 时, 输出会因为 '速度过快' 而超出目标结果 <br />
|
||||||
|
/// - 当小于 0 时, 输出会 '预测运动', 即 '抬手动作'. 例如目标是 '加' 时, 输出会先进行 '减', 再进行 '加',
|
||||||
|
/// - 当运动目标为机械时, 通常取值为 2
|
||||||
|
/// </summary>
|
||||||
|
public double R
|
||||||
|
{
|
||||||
|
get => _r; set
|
||||||
|
{
|
||||||
|
_r = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SecondOrderDynamics(double f, double z, double r, double x0)
|
||||||
|
{
|
||||||
|
//compute constants
|
||||||
|
InitMotionValues(f, z, r);
|
||||||
|
|
||||||
|
// initialize variables
|
||||||
|
xp = x0;
|
||||||
|
y = x0;
|
||||||
|
yd = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitMotionValues(double f, double z, double r)
|
||||||
|
{
|
||||||
|
_w = 2 * Math.PI * f;
|
||||||
|
_z = z;
|
||||||
|
_d = _w * Math.Sqrt(Math.Abs(z * z - 1));
|
||||||
|
k1 = z / (Math.PI * f);
|
||||||
|
k2 = 1 / ((2 * Math.PI * f) * (2 * Math.PI * f));
|
||||||
|
k3 = r * z / (2 * Math.PI * f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double Update(double deltaTime, double x)
|
||||||
|
{
|
||||||
|
double xd = (x - xp) / deltaTime;
|
||||||
|
double k1_stable, k2_stable;
|
||||||
|
|
||||||
|
if (_w * deltaTime < _z)
|
||||||
|
{
|
||||||
|
k1_stable = k1;
|
||||||
|
k2_stable = Math.Max(Math.Max(k2, deltaTime * deltaTime / 2 + deltaTime * k1 / 2), deltaTime * k1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double t1 = Math.Exp(-_z * _w * deltaTime);
|
||||||
|
double alpha = 2 * t1 * (_z <= 1 ? Math.Cos(deltaTime * _d) : Math.Cosh(deltaTime * _d));
|
||||||
|
double beta = t1 * t1;
|
||||||
|
double t2 = deltaTime / (1 + beta - alpha);
|
||||||
|
k1_stable = (1 - beta) * t2;
|
||||||
|
k2_stable = deltaTime * t2;
|
||||||
|
}
|
||||||
|
|
||||||
|
y = y + deltaTime * yd;
|
||||||
|
yd = yd + deltaTime * (x + k3 * xd - y - k1_stable * yd) / k2_stable;
|
||||||
|
|
||||||
|
xp = x;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,126 @@
|
||||||
|
namespace LibDynamics
|
||||||
|
{
|
||||||
|
public class SecondOrderDynamicsForArray
|
||||||
|
{
|
||||||
|
private double[] xps, xds;// previous input
|
||||||
|
private double[] ys, yds; // state variables
|
||||||
|
private double _w, _z, _d, k1, k2, k3; // dynamics constants
|
||||||
|
private double _r;
|
||||||
|
private double _f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 频率
|
||||||
|
/// - 即速度, 单位是赫兹(Hz)
|
||||||
|
/// - 不会影响输出结果的形状, 会影响 '震荡频率'
|
||||||
|
/// </summary>
|
||||||
|
public double F
|
||||||
|
{
|
||||||
|
get => _f; set
|
||||||
|
{
|
||||||
|
_f = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 阻尼 <br />
|
||||||
|
/// - 当为 0 时, 输出将永远震荡不衰减 <br />
|
||||||
|
/// - 当大于 0 小于 1 时, 输出会超出结果, 并逐渐趋于目标 <br />
|
||||||
|
/// - 当为 1 时, 输出的曲线是趋向结果, 并正好在指定频率对应时间内抵达结果 <br />
|
||||||
|
/// - 当大于 1 时, 输出值同样时取向结果, 但速度会更慢, 无法在指定频率对应时间内抵达结果 <br />
|
||||||
|
/// </summary>
|
||||||
|
public double Z
|
||||||
|
{
|
||||||
|
get => _z; set
|
||||||
|
{
|
||||||
|
_z = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始响应
|
||||||
|
/// - 当为 0 时, 数据需要进行 '加速' 来开始运动 <br />
|
||||||
|
/// - 当为 1 时, 数据会立即开始响应 <br />
|
||||||
|
/// - 当大于 1 时, 输出会因为 '速度过快' 而超出目标结果 <br />
|
||||||
|
/// - 当小于 0 时, 输出会 '预测运动', 即 '抬手动作'. 例如目标是 '加' 时, 输出会先进行 '减', 再进行 '加',
|
||||||
|
/// - 当运动目标为机械时, 通常取值为 2
|
||||||
|
/// </summary>
|
||||||
|
public double R
|
||||||
|
{
|
||||||
|
get => _r; set
|
||||||
|
{
|
||||||
|
_r = value;
|
||||||
|
InitMotionValues(_f, _z, _r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="f"></param>
|
||||||
|
/// <param name="z"></param>
|
||||||
|
/// <param name="r"></param>
|
||||||
|
/// <param name="x0"></param>
|
||||||
|
/// <param name="size">Array size</param>
|
||||||
|
public SecondOrderDynamicsForArray(double f, double z, double r, double x0, int size)
|
||||||
|
{
|
||||||
|
//compute constants
|
||||||
|
InitMotionValues(f, z, r);
|
||||||
|
|
||||||
|
// initialize variables
|
||||||
|
xps = new double[size];
|
||||||
|
ys = new double[size];
|
||||||
|
|
||||||
|
xds = new double[size];
|
||||||
|
yds = new double[size];
|
||||||
|
|
||||||
|
Array.Fill(xps, x0);
|
||||||
|
Array.Fill(ys, x0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitMotionValues(double f, double z, double r)
|
||||||
|
{
|
||||||
|
_w = 2 * Math.PI * f;
|
||||||
|
_z = z;
|
||||||
|
_d = _w * Math.Sqrt(Math.Abs(z * z - 1));
|
||||||
|
k1 = z / (Math.PI * f);
|
||||||
|
k2 = 1 / ((2 * Math.PI * f) * (2 * Math.PI * f));
|
||||||
|
k3 = r * z / (2 * Math.PI * f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double[] Update(double deltaTime, double[] xs)//xps p for past,xds d for delta,xs current val
|
||||||
|
{
|
||||||
|
if (xs.Length != xps.Length)
|
||||||
|
throw new ArgumentException();
|
||||||
|
|
||||||
|
for (int i = 0; i < xds.Length; i++)
|
||||||
|
xds[i] = (xs[i] - xps[i]) / deltaTime;
|
||||||
|
double k1_stable, k2_stable;
|
||||||
|
if (_w * deltaTime < _z)
|
||||||
|
{
|
||||||
|
k1_stable = k1;
|
||||||
|
k2_stable = Math.Max(Math.Max(k2, deltaTime * deltaTime / 2 + deltaTime * k1 / 2), deltaTime * k1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double t1 = Math.Exp(-_z * _w * deltaTime);
|
||||||
|
double alpha = 2 * t1 * (_z <= 1 ? Math.Cos(deltaTime * _d) : Math.Cosh(deltaTime * _d));
|
||||||
|
double beta = t1 * t1;
|
||||||
|
double t2 = deltaTime / (1 + beta - alpha);
|
||||||
|
k1_stable = (1 - beta) * t2;
|
||||||
|
k2_stable = deltaTime * t2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ys.Length; i++)
|
||||||
|
{
|
||||||
|
ys[i] = ys[i] + deltaTime * yds[i];
|
||||||
|
yds[i] = yds[i] + deltaTime * (xs[i] + k3 * xds[i] - ys[i] - k1_stable * yds[i]) / k2_stable;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < xps.Length; i++)
|
||||||
|
xps[i] = xs[i];
|
||||||
|
return ys;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,227 @@
|
||||||
|
using LibDynamics;
|
||||||
|
using FftComplex = FftSharp.Complex;
|
||||||
|
using FftTransform = FftSharp.Transform;
|
||||||
|
|
||||||
|
namespace LibAudioVisualizer
|
||||||
|
{
|
||||||
|
public class Visualizer
|
||||||
|
{
|
||||||
|
//private int _m;
|
||||||
|
private double[] _sampleData;
|
||||||
|
private DateTime _lastTime;
|
||||||
|
private SecondOrderDynamicsForArray _dynamics;
|
||||||
|
private int _size;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 采样数据
|
||||||
|
/// </summary>
|
||||||
|
public double[] SampleData => _sampleData;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 尺寸
|
||||||
|
/// </summary>
|
||||||
|
public int Size
|
||||||
|
{
|
||||||
|
get => _size; set
|
||||||
|
{
|
||||||
|
if (!(Get2Flag(value)))
|
||||||
|
throw new ArgumentException("长度必须是 2 的 n 次幂");
|
||||||
|
|
||||||
|
_size = value;
|
||||||
|
_sampleData = new double[value];
|
||||||
|
_dynamics = new SecondOrderDynamicsForArray(1, 1, 1, 0, value / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int OutputSize => Size / 2;
|
||||||
|
|
||||||
|
public Visualizer(int size)
|
||||||
|
{
|
||||||
|
if (!(Get2Flag(size)))
|
||||||
|
throw new ArgumentException("大小必须是 2 的 n 次幂", nameof(size));
|
||||||
|
|
||||||
|
_lastTime = DateTime.Now;
|
||||||
|
_sampleData = new double[size];
|
||||||
|
_dynamics = new SecondOrderDynamicsForArray(1, 1, 1, 0, size / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断是否是 2 的整数次幂
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="num"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private bool Get2Flag(int num)
|
||||||
|
{
|
||||||
|
if (num < 1)
|
||||||
|
return false;
|
||||||
|
return (num & num - 1) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PushSampleData(double[] waveData)
|
||||||
|
{
|
||||||
|
if (waveData.Length > _sampleData.Length)
|
||||||
|
{
|
||||||
|
Array.Copy(waveData, waveData.Length - _sampleData.Length, _sampleData, 0, _sampleData.Length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Array.Copy(_sampleData, waveData.Length, _sampleData, 0, _sampleData.Length - waveData.Length);
|
||||||
|
Array.Copy(waveData, 0, _sampleData, _sampleData.Length - waveData.Length, waveData.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PushSampleData(double[] waveData, int count)
|
||||||
|
{
|
||||||
|
if (count > _sampleData.Length)
|
||||||
|
{
|
||||||
|
Array.Copy(waveData, count - _sampleData.Length, _sampleData, 0, _sampleData.Length);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Array.Copy(_sampleData, count, _sampleData, 0, _sampleData.Length - count);
|
||||||
|
Array.Copy(waveData, 0, _sampleData, _sampleData.Length - count, count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取频谱数据 (数据已经删去共轭部分)
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public double[] GetSpectrumData()
|
||||||
|
{
|
||||||
|
DateTime now = DateTime.Now;
|
||||||
|
double deltaTime = (now - _lastTime).TotalSeconds;
|
||||||
|
_lastTime = now;
|
||||||
|
|
||||||
|
int len = _sampleData.Length;
|
||||||
|
FftComplex[] data = new FftComplex[len];
|
||||||
|
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
data[i] = new FftComplex(_sampleData[i], 0);
|
||||||
|
|
||||||
|
FftTransform.FFT(data);
|
||||||
|
|
||||||
|
int halfLen = len / 2;
|
||||||
|
double[] spectrum = new double[halfLen]; // 傅里叶变换结果左右对称, 只需要取一半
|
||||||
|
for (int i = 0; i < halfLen; i++)
|
||||||
|
spectrum[i] = data[i].Magnitude / len;
|
||||||
|
|
||||||
|
var window = new FftSharp.Windows.Bartlett();
|
||||||
|
window.Create(halfLen);
|
||||||
|
window.ApplyInPlace(spectrum, false);
|
||||||
|
|
||||||
|
//return spectrum;
|
||||||
|
return _dynamics.Update(deltaTime, spectrum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取指定频率内的频谱数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="spectrum">源频谱数据</param>
|
||||||
|
/// <param name="sampleRate">采样率</param>
|
||||||
|
/// <param name="frequency">目标频率</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static double[] TakeSpectrumOfFrequency(double[] spectrum, double sampleRate, double frequency)
|
||||||
|
{
|
||||||
|
double frequencyPerSampe = sampleRate / spectrum.Length;
|
||||||
|
|
||||||
|
int lengthInNeed = (int)(Math.Min(frequency / frequencyPerSampe, spectrum.Length));
|
||||||
|
double[] result = new double[lengthInNeed];
|
||||||
|
Array.Copy(spectrum, 0, result, 0, lengthInNeed);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 简单的数据模糊
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">数据</param>
|
||||||
|
/// <param name="radius">模糊半径</param>
|
||||||
|
/// <returns>结果</returns>
|
||||||
|
public static double[] GetBlurry(double[] data, int radius)
|
||||||
|
{
|
||||||
|
double[] GetWeights(int radius)
|
||||||
|
{
|
||||||
|
double Gaussian(double x) => Math.Pow(Math.E, (-4 * x * x)); // 憨批高斯函数
|
||||||
|
|
||||||
|
int len = 1 + radius * 2; // 长度
|
||||||
|
int end = len - 1; // 最后的索引
|
||||||
|
double radiusF = (double)radius; // 半径浮点数
|
||||||
|
double[] weights = new double[len]; // 权重
|
||||||
|
|
||||||
|
for (int i = 0; i <= radius; i++) // 先把右边的权重算出来
|
||||||
|
weights[radius + i] = Gaussian(i / radiusF);
|
||||||
|
for (int i = 0; i < radius; i++) // 把右边的权重拷贝到左边
|
||||||
|
weights[i] = weights[end - i];
|
||||||
|
|
||||||
|
double total = weights.Sum();
|
||||||
|
for (int i = 0; i < len; i++) // 使权重合为 0
|
||||||
|
weights[i] = weights[i] / total;
|
||||||
|
|
||||||
|
return weights;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyWeights(double[] buffer, double[] weights)
|
||||||
|
{
|
||||||
|
int len = buffer.Length;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
buffer[i] = buffer[i] * weights[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double[] weights = GetWeights(radius);
|
||||||
|
double[] buffer = new double[1 + radius * 2];
|
||||||
|
|
||||||
|
double[] result = new double[data.Length];
|
||||||
|
if (data.Length < radius)
|
||||||
|
{
|
||||||
|
Array.Fill(result, data.Average());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < radius; i++)
|
||||||
|
{
|
||||||
|
Array.Fill(buffer, data[i], 0, radius + 1); // 填充缺省
|
||||||
|
for (int j = 0; j < radius; j++) //
|
||||||
|
{
|
||||||
|
buffer[radius + 1 + j] = data[i + j];
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyWeights(buffer, weights);
|
||||||
|
result[i] = buffer.Sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = radius; i < data.Length - radius; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < radius; j++) //
|
||||||
|
{
|
||||||
|
buffer[j] = data[i - j];
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[radius] = data[i];
|
||||||
|
|
||||||
|
for (int j = 0; j < radius; j++) //
|
||||||
|
{
|
||||||
|
buffer[radius + j + 1] = data[i + j];
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyWeights(buffer, weights);
|
||||||
|
result[i] = buffer.Sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = data.Length - radius; i < data.Length; i++)
|
||||||
|
{
|
||||||
|
Array.Fill(buffer, data[i], 0, radius + 1); // 填充缺省
|
||||||
|
for (int j = 0; j < radius; j++) //
|
||||||
|
{
|
||||||
|
buffer[radius + 1 + j] = data[i - j];
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyWeights(buffer, weights);
|
||||||
|
result[i] = buffer.Sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,7 +16,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
public void SetEffect(Color begin, Color end, bool havePicture, Image? picture)
|
public void SetEffect(Color begin, Color end)
|
||||||
{
|
{
|
||||||
BackColor = begin;
|
BackColor = begin;
|
||||||
this.begin = begin;
|
this.begin = begin;
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
{
|
||||||
|
partial class Challenge_Mode
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
AudioVisualizerPanel = new Panel();
|
||||||
|
game_Panel = new Panel();
|
||||||
|
PausePanel = new Panel();
|
||||||
|
返回主菜单 = new Label();
|
||||||
|
继续游戏 = new Label();
|
||||||
|
游戏暂停 = new Label();
|
||||||
|
timeLine = new TimeLine();
|
||||||
|
PausePanel.SuspendLayout();
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// AudioVisualizerPanel
|
||||||
|
//
|
||||||
|
AudioVisualizerPanel.Location = new Point(0, 849);
|
||||||
|
AudioVisualizerPanel.Name = "AudioVisualizerPanel";
|
||||||
|
AudioVisualizerPanel.Size = new Size(1440, 109);
|
||||||
|
AudioVisualizerPanel.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// game_Panel
|
||||||
|
//
|
||||||
|
game_Panel.BackColor = Color.FromArgb(50, 0, 0, 0);
|
||||||
|
game_Panel.Location = new Point(30, 52);
|
||||||
|
game_Panel.Name = "game_Panel";
|
||||||
|
game_Panel.Size = new Size(1380, 776);
|
||||||
|
game_Panel.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// PausePanel
|
||||||
|
//
|
||||||
|
PausePanel.BackColor = Color.FromArgb(0, 0, 0);
|
||||||
|
PausePanel.Controls.Add(返回主菜单);
|
||||||
|
PausePanel.Controls.Add(继续游戏);
|
||||||
|
PausePanel.Controls.Add(游戏暂停);
|
||||||
|
PausePanel.Dock = DockStyle.Fill;
|
||||||
|
PausePanel.Location = new Point(0, 0);
|
||||||
|
PausePanel.Name = "PausePanel";
|
||||||
|
PausePanel.Size = new Size(1440, 960);
|
||||||
|
PausePanel.TabIndex = 2;
|
||||||
|
//
|
||||||
|
// 返回主菜单
|
||||||
|
//
|
||||||
|
返回主菜单.AutoSize = true;
|
||||||
|
返回主菜单.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
返回主菜单.Font = new Font("Microsoft YaHei UI", 20F);
|
||||||
|
返回主菜单.ForeColor = Color.White;
|
||||||
|
返回主菜单.Location = new Point(151, 342);
|
||||||
|
返回主菜单.Name = "返回主菜单";
|
||||||
|
返回主菜单.Size = new Size(222, 52);
|
||||||
|
返回主菜单.TabIndex = 5;
|
||||||
|
返回主菜单.Text = "返回主菜单";
|
||||||
|
返回主菜单.Visible = false;
|
||||||
|
返回主菜单.Click += 退出_Click;
|
||||||
|
返回主菜单.MouseEnter += CanClickLabel_MouseEnter;
|
||||||
|
返回主菜单.MouseLeave += CanClickLabel_MouseLeave;
|
||||||
|
//
|
||||||
|
// 继续游戏
|
||||||
|
//
|
||||||
|
继续游戏.AutoSize = true;
|
||||||
|
继续游戏.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
继续游戏.Font = new Font("Microsoft YaHei UI", 20F);
|
||||||
|
继续游戏.ForeColor = Color.White;
|
||||||
|
继续游戏.Location = new Point(151, 253);
|
||||||
|
继续游戏.Name = "继续游戏";
|
||||||
|
继续游戏.Size = new Size(182, 52);
|
||||||
|
继续游戏.TabIndex = 4;
|
||||||
|
继续游戏.Text = "继续游戏";
|
||||||
|
继续游戏.Visible = false;
|
||||||
|
继续游戏.Click += 继续游戏_Click;
|
||||||
|
继续游戏.MouseEnter += CanClickLabel_MouseEnter;
|
||||||
|
继续游戏.MouseLeave += CanClickLabel_MouseLeave;
|
||||||
|
//
|
||||||
|
// 游戏暂停
|
||||||
|
//
|
||||||
|
游戏暂停.AutoSize = true;
|
||||||
|
游戏暂停.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
游戏暂停.Font = new Font("Microsoft YaHei UI", 25F);
|
||||||
|
游戏暂停.ForeColor = Color.FromArgb(192, 192, 255);
|
||||||
|
游戏暂停.Location = new Point(127, 127);
|
||||||
|
游戏暂停.Name = "游戏暂停";
|
||||||
|
游戏暂停.Size = new Size(228, 65);
|
||||||
|
游戏暂停.TabIndex = 3;
|
||||||
|
游戏暂停.Text = "游戏暂停";
|
||||||
|
游戏暂停.Visible = false;
|
||||||
|
//
|
||||||
|
// timeLine
|
||||||
|
//
|
||||||
|
timeLine.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
timeLine.Location = new Point(0, 0);
|
||||||
|
timeLine.Name = "timeLine";
|
||||||
|
timeLine.Size = new Size(1440, 10);
|
||||||
|
timeLine.TabIndex = 6;
|
||||||
|
//
|
||||||
|
// Challenge_Mode
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
BackColor = Color.Black;
|
||||||
|
ClientSize = new Size(1440, 960);
|
||||||
|
Controls.Add(timeLine);
|
||||||
|
Controls.Add(game_Panel);
|
||||||
|
Controls.Add(AudioVisualizerPanel);
|
||||||
|
Controls.Add(PausePanel);
|
||||||
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
|
KeyPreview = true;
|
||||||
|
Name = "Challenge_Mode";
|
||||||
|
Text = "Challenge_Mode";
|
||||||
|
PausePanel.ResumeLayout(false);
|
||||||
|
PausePanel.PerformLayout();
|
||||||
|
ResumeLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private Panel AudioVisualizerPanel;
|
||||||
|
private Panel game_Panel;
|
||||||
|
private Panel PausePanel;
|
||||||
|
private Label 游戏暂停;
|
||||||
|
private Label 返回主菜单;
|
||||||
|
private Label 继续游戏;
|
||||||
|
private TimeLine timeLine;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,291 @@
|
||||||
|
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Timers;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using CDSAE3_Lian_Lian_Kan.Extensions;
|
||||||
|
using Timer = System.Timers.Timer;
|
||||||
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||||||
|
using CDSAE3_Lian_Lian_Kan.Sound;
|
||||||
|
using CDSAE3_Lian_Lian_Kan;
|
||||||
|
|
||||||
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
{
|
||||||
|
public partial class Challenge_Mode : Form, IGameMode
|
||||||
|
{
|
||||||
|
GameControl gameControl;
|
||||||
|
public Challenge_Mode()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
timer = new Timer { Interval = 500, AutoReset = true, Enabled = false };
|
||||||
|
timer.Elapsed += TimerTick;
|
||||||
|
Etcs.current_difficulty = Etcs.Difficulty.challenge;
|
||||||
|
Etcs.loadFinished = false;
|
||||||
|
gameControl = new GameControl((t) => Challenge_Mode_LoadAsync(this,new EventArgs()));
|
||||||
|
game_Panel.Controls.Add(gameControl);
|
||||||
|
gameControl.Dock = DockStyle.Fill;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//这里是行动的起源
|
||||||
|
Timer timer;
|
||||||
|
double curTime = 0;
|
||||||
|
int score = 0;
|
||||||
|
private void TimerTick(object? sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
curTime += 0.1;
|
||||||
|
timeLine.set_progress(curTime / 140);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Challenge_Mode_LoadAsync(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
bool loopStop = false;
|
||||||
|
PausePanel.BringToFront();
|
||||||
|
int oriSongVolume = Etcs.Song_Volume;
|
||||||
|
{
|
||||||
|
while (Etcs.Song_Volume != 0)
|
||||||
|
{
|
||||||
|
Etcs.Song_Volume = Math.Max(Etcs.Song_Volume - 7, 0);
|
||||||
|
Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume);
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Action<string, AudioPlayer> loopPlay = null!;
|
||||||
|
loopPlay = (s, player) =>
|
||||||
|
{
|
||||||
|
if (!loopStop)
|
||||||
|
Etcs.song_Audio_Processer.set_song("Ambient", 50, loopPlay);
|
||||||
|
};
|
||||||
|
Etcs.info_Audio_Processer.playMusicClip("Ambient", 50, loopPlay);
|
||||||
|
Label label = new Label { TextAlign = ContentAlignment.MiddleCenter, Font = new Font("Microsoft YaHei UI", 20F), ForeColor = Color.White, BackColor = Color.FromArgb(0, 0, 0, 0), AutoSize = false, Size = new Size(1220, 55), Location = new Point(110, 330) };
|
||||||
|
Controls.Add(label);
|
||||||
|
label.BringToFront();
|
||||||
|
string[] strings = { "你也许意识到了", "连连看的实现并不如其规则那样简单", "忙碌的CLR,处理着数以千计的事件", "委托,反射,线程冲突不断发生在各处", "代码的堆叠已经到达极限", "这是最后的连连看,集中精力,不要犯错,在歌曲结束前击败它" };
|
||||||
|
//4* 7 28s 18s in game 10s
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
label.Text = strings[i];
|
||||||
|
Etcs.info_Audio_Processer.playMusicClip("Message", 60);
|
||||||
|
await Task.Delay(4000);
|
||||||
|
if (i == 2)
|
||||||
|
{
|
||||||
|
loopStop = true;
|
||||||
|
while (Etcs.Song_Volume != 0)
|
||||||
|
{
|
||||||
|
Etcs.Song_Volume = Math.Max(Etcs.Song_Volume - 7, 0);
|
||||||
|
Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume);
|
||||||
|
await Task.Delay(100);
|
||||||
|
}
|
||||||
|
Etcs.song_Audio_Processer.pause_song();
|
||||||
|
Etcs.song_Audio_Processer.set_albums("Tatsh");
|
||||||
|
Etcs.song_Audio_Processer.set_song(Etcs.song_Audio_Processer.get_next_song());
|
||||||
|
Thread thread = new Thread(async () =>
|
||||||
|
{
|
||||||
|
for (int n = 0; n < 8; n++)
|
||||||
|
{
|
||||||
|
Etcs.Song_Volume += 7;
|
||||||
|
Etcs.song_Audio_Processer.volume_change(Etcs.Song_Volume);
|
||||||
|
await Task.Delay(500);
|
||||||
|
}
|
||||||
|
await Task.Delay(9000);
|
||||||
|
foreach (var item in new Label[] { 返回主菜单, 继续游戏, 游戏暂停 })
|
||||||
|
Invoke(() => item.Visible = true);
|
||||||
|
|
||||||
|
});
|
||||||
|
thread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_pauseAllow = true;
|
||||||
|
label.SendToBack();
|
||||||
|
label.Visible = false;
|
||||||
|
|
||||||
|
label.Dispose();
|
||||||
|
}
|
||||||
|
PausePanel.Visible = false;
|
||||||
|
Etcs.song_Audio_Processer.SongFinished += Song_Audio_Processer_SongFinished;
|
||||||
|
ShowAudioVisualizer();
|
||||||
|
Etcs.hunderd_millsecond_timer.Elapsed += TimerTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Song_Audio_Processer_SongFinished(Sound.Song_Audio_processer s, Sound.SongFinishedEventArgs e)
|
||||||
|
{
|
||||||
|
foreach (var item in new Label[] { 返回主菜单, 继续游戏, 游戏暂停 })
|
||||||
|
item.Visible = false;
|
||||||
|
PausePanel.Visible = true;
|
||||||
|
PausePanel.BackgroundImage = Properties.Resources.trans;
|
||||||
|
for(int i=0;i<200;i+=10)
|
||||||
|
{
|
||||||
|
Color animRed = Color.FromArgb(i, 0, 0);
|
||||||
|
game_Panel.BackColor = animRed;
|
||||||
|
PausePanel.BackColor = animRed;
|
||||||
|
await Task.Delay(10);
|
||||||
|
}
|
||||||
|
PausePanel.BringToFront();
|
||||||
|
for(int i= 200;i<260;i+=10)
|
||||||
|
{
|
||||||
|
Color animRed = Color.FromArgb(i, 0, 0);
|
||||||
|
PausePanel.BackColor = animRed;
|
||||||
|
await Task.Delay(10);
|
||||||
|
}
|
||||||
|
Etcs.info_Audio_Processer.playMusicClip("failed");
|
||||||
|
Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.Time_out });
|
||||||
|
}
|
||||||
|
int cur_score = 0;
|
||||||
|
public void Finished_Handler(object sender, FinishArgs e)
|
||||||
|
{
|
||||||
|
BeginInvoke(() =>
|
||||||
|
{
|
||||||
|
switch (e.finishType)
|
||||||
|
{
|
||||||
|
case FinishArgs.FinishType.All_done:
|
||||||
|
DoPause();
|
||||||
|
Form form = new FinishedMessageBox(cur_score, (int)curTime);
|
||||||
|
form.FormClosed += ((sender, args) =>
|
||||||
|
{
|
||||||
|
Dispose();
|
||||||
|
Close();
|
||||||
|
Etcs.form?.change_form(Etcs.charts, false, null, null);
|
||||||
|
});
|
||||||
|
form.ShowDialog();
|
||||||
|
break;
|
||||||
|
case FinishArgs.FinishType.Time_out:
|
||||||
|
退出_Click(this, new EventArgs());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
private bool _pauseState = false;
|
||||||
|
private bool search_mode;
|
||||||
|
private int search_left_use_time;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 需要测试!!
|
||||||
|
/// </summary>
|
||||||
|
private bool _pauseAllow = false;
|
||||||
|
private void DoPause()
|
||||||
|
{
|
||||||
|
if (!_pauseAllow)
|
||||||
|
return;
|
||||||
|
timer.Enabled = false;
|
||||||
|
Etcs.song_Audio_Processer.pause_song();
|
||||||
|
_pauseState = true;
|
||||||
|
Bitmap bit = new Bitmap(Width, Height);
|
||||||
|
Graphics g = Graphics.FromImage(bit);
|
||||||
|
g.CompositingQuality = CompositingQuality.HighQuality;
|
||||||
|
g.CopyFromScreen(Etcs.form!.Left+5, Etcs.form!.Top+43, 0, 0, new Size(Width, Height));
|
||||||
|
PausePanel.BringToFront();
|
||||||
|
Rectangle rectangle = new Rectangle(0, 0, bit.Width,bit.Height);
|
||||||
|
PausePanel.BackgroundImage= bit.GaussianBlur();
|
||||||
|
PausePanel.Visible = true;
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
private void DePause()
|
||||||
|
{
|
||||||
|
Etcs.song_Audio_Processer.resume_song();
|
||||||
|
_pauseState = false;
|
||||||
|
timer.Enabled = true;
|
||||||
|
PausePanel.Visible = false;
|
||||||
|
PausePanel.SendToBack();
|
||||||
|
}
|
||||||
|
public void TogglePause()
|
||||||
|
{
|
||||||
|
if (_pauseState)
|
||||||
|
DePause();
|
||||||
|
else
|
||||||
|
DoPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowAudioVisualizer()
|
||||||
|
{
|
||||||
|
Form audioVisualizer = new AudioVisualizer.MainWindow();
|
||||||
|
audioVisualizer.TopLevel = false;
|
||||||
|
audioVisualizer.Dock = DockStyle.Fill;
|
||||||
|
AudioVisualizerPanel.Controls.Add(audioVisualizer);
|
||||||
|
audioVisualizer.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void 继续游戏_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
DePause();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void 退出_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Dispose();
|
||||||
|
Close();
|
||||||
|
Etcs.hunderd_millsecond_timer.Elapsed -= TimerTick;
|
||||||
|
Etcs.gameMenuForm!.playFormToMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CanClickLabel_MouseEnter(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
(sender as Label)!.BackColor = Color.FromArgb(100, 100, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CanClickLabel_MouseLeave(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
(sender as Label)!.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void De_pause(object sender, EventArgs e) { }
|
||||||
|
|
||||||
|
public void Score_Change(object sender, ChangeScoreArgs e)
|
||||||
|
{
|
||||||
|
if (e.add)
|
||||||
|
{
|
||||||
|
score += e.score;
|
||||||
|
if(search_mode)
|
||||||
|
{
|
||||||
|
search_left_use_time--;
|
||||||
|
if(search_left_use_time==0)
|
||||||
|
{
|
||||||
|
search_mode = false;
|
||||||
|
gameControl.Search_Handler(this, new SearchEventArgs { set_search = false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
score = Math.Min(0, score - e.score);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTheme() {
|
||||||
|
Etcs.current_block_theme = Etcs.Theme.code;
|
||||||
|
Etcs.gameModeForm = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DoSearch()
|
||||||
|
{
|
||||||
|
gameControl.Search_Handler(this, new SearchEventArgs { set_search = true });
|
||||||
|
search_mode = true;
|
||||||
|
search_left_use_time = 3;
|
||||||
|
}
|
||||||
|
private void DoRemake()
|
||||||
|
{
|
||||||
|
Task.Run(() => gameControl.Exchange_Handler(this, new EventArgs()));
|
||||||
|
}
|
||||||
|
public void GetGift_Handler(object sender, GiftArgs e)
|
||||||
|
{
|
||||||
|
Etcs.info_Audio_Processer.playMusicClip("HitSong");
|
||||||
|
switch (e.giftType)
|
||||||
|
{
|
||||||
|
case GiftArgs.GiftType.Search:
|
||||||
|
DoSearch();
|
||||||
|
break;
|
||||||
|
case GiftArgs.GiftType.ReMake:
|
||||||
|
DoRemake();
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,39 +0,0 @@
|
||||||
namespace CDSAE3_Lian_Lian_Kan
|
|
||||||
{
|
|
||||||
partial class Challenge_Mode_MenuForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.components = new System.ComponentModel.Container();
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
|
||||||
this.Text = "Challenge_Mode_MenuForm";
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace CDSAE3_Lian_Lian_Kan
|
|
||||||
{
|
|
||||||
public partial class Challenge_Mode_MenuForm : Form
|
|
||||||
{
|
|
||||||
public Challenge_Mode_MenuForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -121,7 +121,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
Thread thread= new Thread(()=>Invoke(()=>tablePanel.Controls.Clear()));
|
Thread thread= new Thread(()=>Invoke(()=>tablePanel.Controls.Clear()));
|
||||||
_left = _top = 0;
|
_left = _top = 0;
|
||||||
await Etcs.form!.change_form((Etcs.gameMenuForm as Form)!, false, null, null, false, null);
|
await Etcs.form!.change_form((Etcs.gameMenuForm as Form)!, false, null, null);
|
||||||
thread.Start();
|
thread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,29 +28,14 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
playPanel = new TableLayoutPanel();
|
|
||||||
initWorker = new System.ComponentModel.BackgroundWorker();
|
initWorker = new System.ComponentModel.BackgroundWorker();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// playPanel
|
|
||||||
//
|
|
||||||
playPanel.BackColor = Color.FromArgb(0, 0, 0, 0);
|
|
||||||
playPanel.ColumnCount = 1;
|
|
||||||
playPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
|
|
||||||
playPanel.Dock = DockStyle.Fill;
|
|
||||||
playPanel.Location = new Point(0, 0);
|
|
||||||
playPanel.Name = "playPanel";
|
|
||||||
playPanel.RowCount = 1;
|
|
||||||
playPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 50F));
|
|
||||||
playPanel.Size = new Size(1400, 800);
|
|
||||||
playPanel.TabIndex = 1;
|
|
||||||
//
|
|
||||||
// GameControl
|
// GameControl
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(11F, 24F);
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
AutoScaleMode = AutoScaleMode.Font;
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
BackColor = Color.FromArgb(0, 0, 0, 0);
|
BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
Controls.Add(playPanel);
|
|
||||||
Name = "GameControl";
|
Name = "GameControl";
|
||||||
Size = new Size(1400, 800);
|
Size = new Size(1400, 800);
|
||||||
Load += GameControl_Load;
|
Load += GameControl_Load;
|
||||||
|
@ -58,8 +43,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private TableLayoutPanel playPanel;
|
|
||||||
private System.ComponentModel.BackgroundWorker initWorker;
|
private System.ComponentModel.BackgroundWorker initWorker;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using CDSAE3_Lian_Lian_Kan.Boards;
|
using CDSAE3_Lian_Lian_Kan.Boards;
|
||||||
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
||||||
|
using NAudio.Gui;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
@ -11,36 +12,54 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using static CDSAE3_Lian_Lian_Kan.Etcs;
|
||||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
|
||||||
|
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Forms
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
public partial class GameControl : UserControl, IGameControl
|
public partial class GameControl : UserControl, IGameControl
|
||||||
{
|
{
|
||||||
IBoard board = new Graph_Board();
|
IBoard board = Etcs.curAlgorithm switch
|
||||||
|
{
|
||||||
|
Algorithm.Array => new Board(),
|
||||||
|
Algorithm.Graph => new Graph_Board(),
|
||||||
|
_ => new Board()
|
||||||
|
};
|
||||||
IGameMode? iGameMode;
|
IGameMode? iGameMode;
|
||||||
Queue<((int, int), Single_Block)> queue = new Queue<((int, int), Single_Block)>();//y,x
|
Queue<((int, int), Single_Block)> queue = new Queue<((int, int), Single_Block)>();//y,x
|
||||||
bool do_search = false;
|
bool do_search = false;
|
||||||
List<Single_Block> hint_blocks = new List<Single_Block>();
|
List<Single_Block> hint_blocks = new List<Single_Block>();
|
||||||
|
bool doRandomGift = false;
|
||||||
|
bool doSubScore = false;
|
||||||
|
Dictionary<(int, int), (GiftArgs.GiftType, PictureBox)> giftBlock = new();
|
||||||
public GameControl()
|
public GameControl()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public GameControl(Action<int>loadFinished)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DoubleBuffered = true;
|
DoubleBuffered = true;
|
||||||
initWorker.WorkerReportsProgress = true;
|
initWorker.WorkerReportsProgress = true;
|
||||||
initWorker.WorkerSupportsCancellation = true;
|
initWorker.WorkerSupportsCancellation = true;
|
||||||
|
this.loadFinished = loadFinished;
|
||||||
initWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWorker);
|
initWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWorker);
|
||||||
initWorker.RunWorkerCompleted += InitWorker_RunWorkerCompleted;
|
initWorker.RunWorkerCompleted += InitWorker_RunWorkerCompleted;
|
||||||
Etcs.gameForm = this;
|
|
||||||
iGameMode = Etcs.gameModeForm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Action<int>? loadFinished = null;
|
||||||
private void InitWorker_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
|
private void InitWorker_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
|
||||||
{
|
{
|
||||||
Etcs.loadFinished = true;
|
Etcs.loadFinished = true;
|
||||||
|
loadFinished?.Invoke(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GameControl_Load(object sender, EventArgs e)
|
public void GameControl_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
if (Etcs.current_difficulty == Etcs.Difficulty.challenge)
|
||||||
|
doSubScore = doRandomGift = true;
|
||||||
|
Etcs.gameForm = this;
|
||||||
|
iGameMode = Etcs.gameModeForm;
|
||||||
Console.WriteLine("start");
|
Console.WriteLine("start");
|
||||||
Etcs.loadFinished = false;
|
Etcs.loadFinished = false;
|
||||||
initWorker.RunWorkerAsync();
|
initWorker.RunWorkerAsync();
|
||||||
|
@ -58,26 +77,35 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
|
||||||
void playPanel_set(int[,] bd)
|
void playPanel_set(int[,] bd)
|
||||||
{
|
{
|
||||||
playPanel.SuspendLayout();
|
SuspendLayout();
|
||||||
playPanel_size_change();
|
playPanel_size_change();
|
||||||
for (int i = 0; i < playPanel.RowCount; i++)
|
for (int i = 0; i < _row; i++)
|
||||||
for (int j = 0; j < playPanel.ColumnCount; j++)
|
for (int j = 0; j < _column; j++)
|
||||||
{
|
{
|
||||||
Console.WriteLine(i.ToString() + j.ToString());
|
Console.WriteLine(i.ToString() + j.ToString());
|
||||||
if (bd[i, j] == -1)
|
if (bd[i, j] == -1)
|
||||||
{
|
{
|
||||||
var x = new Single_Block(Etcs.trans_Image, (j, i));
|
var x = new Single_Block((j, i));
|
||||||
x.Dock = DockStyle.Fill;
|
AddItem(x, i, j);
|
||||||
Invoke(() => playPanel.Controls.Add(x, j, i));
|
_index.Add((j, i), x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var x = new Single_Block(bd[i, j], Etcs.def_Color, Etcs.sel_Color, (j, i));
|
var x = new Single_Block(bd[i, j], Etcs.def_Color, Etcs.sel_Color, (j, i));
|
||||||
x.Dock = DockStyle.Fill;
|
AddItem(x, i, j);
|
||||||
Invoke(() => playPanel.Controls.Add(x, j, i));
|
_index.Add((j, i), x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Invoke(() => playPanel.ResumeLayout());
|
Invoke(() => ResumeLayout());
|
||||||
|
}
|
||||||
|
private void AddItem(Single_Block x, int i, int j)
|
||||||
|
{
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
x.Size = new Size((int)single_width, (int)single_height);
|
||||||
|
x.Location = new Point((int)(j * single_width), (int)(i * single_height));
|
||||||
|
Controls.Add(x);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 由form和to两个点获取方向
|
/// 由form和to两个点获取方向
|
||||||
|
@ -111,14 +139,14 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
|
||||||
if (wait_time != 0)
|
if (wait_time != 0)
|
||||||
await Task.Delay(wait_time);
|
await Task.Delay(wait_time);
|
||||||
Control? control = playPanel.GetControlFromPosition(point.Item1, point.Item2);
|
Single_Block? control = _index.ContainsKey((point.Item1, point.Item2)) ? _index[(point.Item1, point.Item2)] : null;
|
||||||
if (control != null && control is Single_Block single_Block)
|
if (control != null)
|
||||||
{
|
{
|
||||||
if (is_hint)
|
if (is_hint)
|
||||||
single_Block.hint_path(direction);
|
control.hint_path(direction);
|
||||||
else
|
else
|
||||||
single_Block.to_path(direction);
|
control.to_path(direction);
|
||||||
blocks.Add(single_Block);
|
blocks.Add(control);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async Task to_path((int, int) from, (int, int) to, bool include_end, Etcs.Direction extra_Direction, List<Single_Block> blocks, int wait_time, bool is_hint)
|
async Task to_path((int, int) from, (int, int) to, bool include_end, Etcs.Direction extra_Direction, List<Single_Block> blocks, int wait_time, bool is_hint)
|
||||||
|
@ -212,6 +240,22 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
_ = Block_ClearAsync(path);
|
_ = Block_ClearAsync(path);
|
||||||
while (queue.Count() > 0)
|
while (queue.Count() > 0)
|
||||||
queue.Dequeue();
|
queue.Dequeue();
|
||||||
|
foreach (var item in new[] { posa, posb })
|
||||||
|
{
|
||||||
|
if (giftBlock.TryGetValue(item, out (GiftArgs.GiftType, PictureBox) result))
|
||||||
|
{
|
||||||
|
iGameMode!.GetGift_Handler(this, new GiftArgs { giftType = result.Item1 });
|
||||||
|
DeleteGiftPicture(item, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (doRandomGift)
|
||||||
|
{
|
||||||
|
Random random = new();
|
||||||
|
if (random.Next(0, 10) < 1)
|
||||||
|
{
|
||||||
|
SetGiftPicture(board.GetRandomBlock(), (GiftArgs.GiftType)(random.Next(1, 3) - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -220,6 +264,10 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
de_set_tip();
|
de_set_tip();
|
||||||
set_tip();
|
set_tip();
|
||||||
}
|
}
|
||||||
|
if (doSubScore)
|
||||||
|
{
|
||||||
|
iGameMode!.Score_Change(this, new ChangeScoreArgs { add = false, score = 200 });
|
||||||
|
}
|
||||||
queue.Enqueue((e.position, sender));
|
queue.Enqueue((e.position, sender));
|
||||||
sendera.deselect();
|
sendera.deselect();
|
||||||
}
|
}
|
||||||
|
@ -244,6 +292,38 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DeleteGiftPicture((int, int) item, (GiftArgs.GiftType, PictureBox) result)
|
||||||
|
{
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
result.Item2.Visible = false;
|
||||||
|
result.Item2.SendToBack();
|
||||||
|
result.Item2.Dispose();
|
||||||
|
giftBlock.Remove(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetGiftPicture((int, int)pos , GiftArgs.GiftType type)
|
||||||
|
{
|
||||||
|
var (picWidth, picHeight) = (single_width / 3, single_height / 3);
|
||||||
|
PictureBox picture = new PictureBox
|
||||||
|
{
|
||||||
|
Image = type switch
|
||||||
|
{
|
||||||
|
GiftArgs.GiftType.Search => Properties.Resources.w_search,
|
||||||
|
GiftArgs.GiftType.ReMake => Properties.Resources.w_exchange,
|
||||||
|
_ => Properties.Resources.trans
|
||||||
|
},
|
||||||
|
Size = new Size((int)picWidth, (int)picHeight),
|
||||||
|
SizeMode = PictureBoxSizeMode.Zoom,
|
||||||
|
Location = new Point((int)(((pos.Item1 + 1) * single_width) - picWidth), (int)(pos.Item2 * single_height))
|
||||||
|
};
|
||||||
|
Invoke(() => Controls.Add(picture));
|
||||||
|
Invoke(() => picture.BringToFront());
|
||||||
|
giftBlock.TryAdd(pos, (type, picture));
|
||||||
|
}
|
||||||
|
|
||||||
async Task Block_ClearAsync(List<(int, int)>? path)
|
async Task Block_ClearAsync(List<(int, int)>? path)
|
||||||
{
|
{
|
||||||
if (do_search == true)
|
if (do_search == true)
|
||||||
|
@ -253,45 +333,54 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
if (path == null)
|
if (path == null)
|
||||||
return;
|
return;
|
||||||
await path_drawerAsync(path, 20, blocks, false);
|
await path_drawerAsync(path, 20, blocks, false);
|
||||||
Control? controlA = playPanel.GetControlFromPosition(path[0].Item1, path[0].Item2), controlB = playPanel.GetControlFromPosition(path.Last().Item1, path.Last().Item2);
|
Single_Block? controlA = _index.ContainsKey((path[0].Item1, path[0].Item2)) ? _index[(path[0].Item1, path[0].Item2)] : null;
|
||||||
|
Single_Block? controlB = _index.ContainsKey((path.Last().Item1, path.Last().Item2)) ? _index[(path.Last().Item1, path.Last().Item2)] : null;
|
||||||
Etcs.info_Audio_Processer.play_random_break_soundScape();
|
Etcs.info_Audio_Processer.play_random_break_soundScape();
|
||||||
if (controlA != null && controlB != null && controlA is Single_Block single_BlockA && controlB is Single_Block single_BlockB)
|
if (controlA != null && controlB != null)
|
||||||
{
|
{
|
||||||
single_BlockA.destroyAsync();
|
controlA.destroyAsync();
|
||||||
single_BlockB.destroyAsync();
|
controlB.destroyAsync();
|
||||||
}
|
}
|
||||||
await Task.Delay(200);
|
await Task.Delay(200);
|
||||||
foreach (var control in blocks)
|
foreach (var control in blocks)
|
||||||
control.de_path();
|
control.de_path();
|
||||||
iGameMode?.Score_Add(this, new AddScoreArgs { score = (blocks.Count + 2) * 10 });
|
iGameMode?.Score_Change(this, new ChangeScoreArgs { score = (blocks.Count + 2) * 10 });
|
||||||
}
|
}
|
||||||
|
private int _row = 0, _column = 0;
|
||||||
|
private double single_width = 0, single_height = 0;
|
||||||
|
private Dictionary<(int, int), Single_Block> _index = new();
|
||||||
void playPanel_size_change()
|
void playPanel_size_change()
|
||||||
{
|
{
|
||||||
var (width, height) = board.size;
|
var (width, height) = board.size;
|
||||||
playPanel.RowCount = height + 2;
|
(_row, _column) = (height + 2, width + 2);
|
||||||
playPanel.ColumnCount = width + 2;
|
single_width = (double)Width / _column;
|
||||||
playPanel.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, 100F);
|
single_height = (double)Height / _row;
|
||||||
playPanel.RowStyles[0] = new RowStyle(SizeType.Percent, 100F);
|
|
||||||
for (int i = 0; i < width + 1; i++)
|
|
||||||
playPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
|
||||||
for (int i = 0; i < height + 1; i++)
|
|
||||||
playPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
|
||||||
}
|
}
|
||||||
public void Exchange_Handler(object? sender, EventArgs e)
|
public void Exchange_Handler(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
int[,] bd = board.remake_board();
|
int[,] bd = board.remake_board();
|
||||||
playPanel.SuspendLayout();
|
SuspendLayout();
|
||||||
for (int i = 0; i < bd.GetLength(0); i++)
|
for (int i = 0; i < bd.GetLength(0); i++)
|
||||||
for (int j = 0; j < bd.GetLength(1); j++)
|
for (int j = 0; j < bd.GetLength(1); j++)
|
||||||
if (bd[i, j] == -1)
|
if (bd[i, j] == -1)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Control? control = playPanel.GetControlFromPosition(j, i);
|
Single_Block? control = _index.ContainsKey((j, i)) ? _index[(j, i)] : null;
|
||||||
if (control != null && control is Single_Block single_Block)
|
if (control != null)
|
||||||
single_Block.Re_create(bd[i, j], null, null, null);
|
control.Re_create(bd[i, j], null, null, null);
|
||||||
}
|
}
|
||||||
playPanel.ResumeLayout();
|
int length = giftBlock.Count();
|
||||||
|
foreach (var item in giftBlock)
|
||||||
|
{
|
||||||
|
DeleteGiftPicture(item.Key, item.Value);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
Random random = new();
|
||||||
|
SetGiftPicture(board.GetRandomBlock(), (GiftArgs.GiftType)(random.Next(1, 3) - 1));
|
||||||
|
}
|
||||||
|
ResumeLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Search_Handler(object? sender, SearchEventArgs e)
|
public void Search_Handler(object? sender, SearchEventArgs e)
|
||||||
|
|
|
@ -6,23 +6,35 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Forms.Interface
|
namespace CDSAE3_Lian_Lian_Kan.Forms.Interface
|
||||||
{
|
{
|
||||||
public class AddScoreArgs : EventArgs
|
public class ChangeScoreArgs : EventArgs
|
||||||
{
|
{
|
||||||
|
public bool add { get; set; } = true; //1
|
||||||
public int score { get; set; }
|
public int score { get; set; }
|
||||||
}
|
}
|
||||||
|
public class GiftArgs:EventArgs
|
||||||
|
{
|
||||||
|
public enum GiftType
|
||||||
|
{
|
||||||
|
Search = 0,
|
||||||
|
ReMake = 1
|
||||||
|
}
|
||||||
|
public GiftType giftType { get; set; }
|
||||||
|
}
|
||||||
public class FinishArgs : EventArgs
|
public class FinishArgs : EventArgs
|
||||||
{
|
{
|
||||||
public enum Finish_Type
|
public enum FinishType
|
||||||
{
|
{
|
||||||
All_done = 0,
|
All_done = 0,
|
||||||
Time_out = 1
|
Time_out = 1
|
||||||
}
|
}
|
||||||
public Finish_Type finish_Type { get; set; }
|
public FinishType finishType { get; set; }
|
||||||
}
|
}
|
||||||
public interface IGameMode : IThemeChangeable
|
public interface IGameMode : IThemeChangeable
|
||||||
{
|
{
|
||||||
|
public void TogglePause();
|
||||||
public void De_pause(object sender, EventArgs e);
|
public void De_pause(object sender, EventArgs e);
|
||||||
public void Score_Add(object sender, AddScoreArgs e);
|
public void Score_Change(object sender, ChangeScoreArgs e);
|
||||||
public void Finished_Handler(object sender, FinishArgs e);
|
public void Finished_Handler(object sender, FinishArgs e);
|
||||||
|
public void GetGift_Handler(object sender, GiftArgs e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
exchange = new PictureBox();
|
exchange = new PictureBox();
|
||||||
upper_search = new Item();
|
upper_search = new Item();
|
||||||
game_Panel = new Panel();
|
game_Panel = new Panel();
|
||||||
gameControl = new GameControl();
|
|
||||||
((System.ComponentModel.ISupportInitialize)back).BeginInit();
|
((System.ComponentModel.ISupportInitialize)back).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)sp_button).BeginInit();
|
((System.ComponentModel.ISupportInitialize)sp_button).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)search).BeginInit();
|
((System.ComponentModel.ISupportInitialize)search).BeginInit();
|
||||||
|
@ -159,21 +158,11 @@
|
||||||
// game_Panel
|
// game_Panel
|
||||||
//
|
//
|
||||||
game_Panel.BackColor = Color.FromArgb(50, 0, 0, 0);
|
game_Panel.BackColor = Color.FromArgb(50, 0, 0, 0);
|
||||||
game_Panel.Controls.Add(gameControl);
|
|
||||||
game_Panel.Location = new Point(20, 143);
|
game_Panel.Location = new Point(20, 143);
|
||||||
game_Panel.Name = "game_Panel";
|
game_Panel.Name = "game_Panel";
|
||||||
game_Panel.Size = new Size(1400, 800);
|
game_Panel.Size = new Size(1400, 800);
|
||||||
game_Panel.TabIndex = 0;
|
game_Panel.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// gameControl
|
|
||||||
//
|
|
||||||
gameControl.BackColor = Color.FromArgb(0, 0, 0, 0);
|
|
||||||
gameControl.Dock = DockStyle.Fill;
|
|
||||||
gameControl.Location = new Point(0, 0);
|
|
||||||
gameControl.Name = "gameControl";
|
|
||||||
gameControl.Size = new Size(1400, 800);
|
|
||||||
gameControl.TabIndex = 13;
|
|
||||||
//
|
|
||||||
// Leisure_Mode
|
// Leisure_Mode
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(11F, 24F);
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
|
@ -215,6 +204,5 @@
|
||||||
private PictureBox exchange;
|
private PictureBox exchange;
|
||||||
private Item upper_search;
|
private Item upper_search;
|
||||||
private Panel game_Panel;
|
private Panel game_Panel;
|
||||||
private GameControl gameControl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -18,9 +18,11 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
|
||||||
public partial class Leisure_Mode : Form, IGameMode
|
public partial class Leisure_Mode : Form, IGameMode
|
||||||
{
|
{
|
||||||
|
GameControl gameControl;
|
||||||
public Leisure_Mode()
|
public Leisure_Mode()
|
||||||
{
|
{
|
||||||
Etcs.gameModeForm = this;
|
Etcs.gameModeForm = this;
|
||||||
|
Etcs.current_block_theme = Theme.fruit;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
upper_search.Item_Init(Resources.search, (70, 70), Color.FromArgb(253, 161, 60));
|
upper_search.Item_Init(Resources.search, (70, 70), Color.FromArgb(253, 161, 60));
|
||||||
time.Text = (left_time / 60).ToString().PadLeft(2, '0') + ":" + (left_time % 60).ToString().PadLeft(2, '0');
|
time.Text = (left_time / 60).ToString().PadLeft(2, '0') + ":" + (left_time % 60).ToString().PadLeft(2, '0');
|
||||||
|
@ -28,6 +30,9 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
timer = new System.Timers.Timer(1000);
|
timer = new System.Timers.Timer(1000);
|
||||||
timer.Elapsed += Timer_Tick;
|
timer.Elapsed += Timer_Tick;
|
||||||
timer.Enabled = false;
|
timer.Enabled = false;
|
||||||
|
gameControl = new GameControl((t) => t++);
|
||||||
|
game_Panel.Controls.Add(gameControl);
|
||||||
|
gameControl.Dock = DockStyle.Fill;
|
||||||
}
|
}
|
||||||
System.Timers.Timer timer;
|
System.Timers.Timer timer;
|
||||||
int hundred_up_timer = 0;
|
int hundred_up_timer = 0;
|
||||||
|
@ -80,7 +85,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
if (left_time < 0)
|
if (left_time < 0)
|
||||||
{
|
{
|
||||||
timer.Enabled = false;
|
timer.Enabled = false;
|
||||||
Finished_Handler(this, new FinishArgs { finish_Type = FinishArgs.Finish_Type.Time_out });
|
Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.Time_out });
|
||||||
}
|
}
|
||||||
if (is_pause) { timer.Enabled = false; }
|
if (is_pause) { timer.Enabled = false; }
|
||||||
}
|
}
|
||||||
|
@ -95,7 +100,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
Sp_button_Click(sender, e);
|
Sp_button_Click(sender, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Score_Add(object sender, AddScoreArgs e)
|
public void Score_Change(object sender, ChangeScoreArgs e)
|
||||||
{
|
{
|
||||||
cur_score += e.score * factor_val;
|
cur_score += e.score * factor_val;
|
||||||
current_base += e.score;
|
current_base += e.score;
|
||||||
|
@ -136,18 +141,18 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
BeginInvoke(() =>
|
BeginInvoke(() =>
|
||||||
{
|
{
|
||||||
timer.Close();
|
timer.Close();
|
||||||
switch (e.finish_Type)
|
switch (e.finishType)
|
||||||
{
|
{
|
||||||
case FinishArgs.Finish_Type.All_done:
|
case FinishArgs.FinishType.All_done:
|
||||||
Do_pause(this, new EventArgs());
|
Do_pause(this, new EventArgs());
|
||||||
Form form = new FinishedMessageBox(cur_score, Etcs.left_time - left_time);
|
Form form = new FinishedMessageBox(cur_score, Etcs.left_time - left_time);
|
||||||
form.FormClosed += ((sender, args) => {
|
form.FormClosed += ((sender, args) => {
|
||||||
Dispose();
|
Dispose();
|
||||||
Close();
|
Close();
|
||||||
Etcs.form?.change_form(charts, false, null, null, false, null); });
|
Etcs.form?.change_form(charts, false, null, null); });
|
||||||
form.ShowDialog();
|
form.ShowDialog();
|
||||||
break;
|
break;
|
||||||
case FinishArgs.Finish_Type.Time_out:
|
case FinishArgs.FinishType.Time_out:
|
||||||
Thread thread = new Thread(() => MessageBox.Show("时间到!"));
|
Thread thread = new Thread(() => MessageBox.Show("时间到!"));
|
||||||
thread.Start();
|
thread.Start();
|
||||||
back_Click(this, new EventArgs());
|
back_Click(this, new EventArgs());
|
||||||
|
@ -181,7 +186,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
Etcs.ThemeInfo themeInfo = Etcs.currentThemeInfo;
|
Etcs.ThemeInfo themeInfo = Etcs.currentThemeInfo;
|
||||||
BackColor = Color.FromArgb(themeInfo.ThemeColor![0], themeInfo.ThemeColor[1], themeInfo.ThemeColor[2]);
|
BackColor = Color.FromArgb(themeInfo.ThemeColor![0], themeInfo.ThemeColor[1], themeInfo.ThemeColor[2]);
|
||||||
gameControl.BackColor = BackColor;
|
//gameControl.BackColor = BackColor;
|
||||||
//gameControl.BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!;
|
//gameControl.BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!;
|
||||||
if (themeInfo.PlayPanelUsePicture)
|
if (themeInfo.PlayPanelUsePicture)
|
||||||
{
|
{
|
||||||
|
@ -191,5 +196,12 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!;
|
BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void GetGift_Handler(object sender, GiftArgs e){ }
|
||||||
|
|
||||||
|
public void TogglePause()
|
||||||
|
{
|
||||||
|
Sp_button_Click(this, new EventArgs());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Text.Encodings.Web;
|
||||||
using System.Text.Unicode;
|
using System.Text.Unicode;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
using CDSAE3_Lian_Lian_Kan.Forms.Interface;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Forms
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
|
@ -20,14 +21,14 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
Etcs.hunderd_millsecond_timer.Elapsed -= StartFunc;
|
Etcs.hunderd_millsecond_timer.Elapsed -= StartFunc;
|
||||||
Form? menuForm = null;
|
Form? menuForm = null;
|
||||||
Invoke(() => menuForm = new Leisure_Mode_MenuForm());
|
Invoke(() => menuForm = new MenuForm());
|
||||||
Invoke(() => change_form(menuForm!, false, null, null, false, null));
|
Invoke(() => change_form(menuForm!, false, null, null));
|
||||||
}
|
}
|
||||||
public async Task change_form(Form newForm, bool doAnimation, Color? begin, Color? end, bool haveImage, Image? image)
|
public async Task change_form(Form newForm, bool doAnimation, Color? begin, Color? end)
|
||||||
{
|
{
|
||||||
if (doAnimation)
|
if (doAnimation)
|
||||||
{
|
{
|
||||||
bufferForm.SetEffect(begin!.Value, end!.Value, haveImage, image);
|
bufferForm.SetEffect(begin!.Value, end!.Value);
|
||||||
bufferForm.BringToFront();
|
bufferForm.BringToFront();
|
||||||
bufferForm.Visible = true;
|
bufferForm.Visible = true;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +39,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
MainPanel.Controls.Add(newForm);
|
MainPanel.Controls.Add(newForm);
|
||||||
BeginInvoke(() => newForm.Show());
|
BeginInvoke(() => newForm.Show());
|
||||||
MainPanel.SendToBack();
|
MainPanel.SendToBack();
|
||||||
|
ActiveControl = newForm;
|
||||||
if (doAnimation)
|
if (doAnimation)
|
||||||
{
|
{
|
||||||
await bufferForm.EffectAsync();
|
await bufferForm.EffectAsync();
|
||||||
|
@ -45,5 +47,16 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
}
|
}
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
}
|
}
|
||||||
|
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
|
||||||
|
{
|
||||||
|
KeyEventArgs e = new KeyEventArgs(keyData);
|
||||||
|
|
||||||
|
if (keyData == (Keys.Space))
|
||||||
|
{
|
||||||
|
Etcs.gameModeForm?.TogglePause();
|
||||||
|
//Console.WriteLine(" TogglePause();");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Forms
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
partial class Leisure_Mode_MenuForm
|
partial class MenuForm
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
||||||
|
@ -81,6 +81,7 @@
|
||||||
to_Challenge_mode.TabIndex = 3;
|
to_Challenge_mode.TabIndex = 3;
|
||||||
to_Challenge_mode.Text = "挑战模式";
|
to_Challenge_mode.Text = "挑战模式";
|
||||||
to_Challenge_mode.UseVisualStyleBackColor = false;
|
to_Challenge_mode.UseVisualStyleBackColor = false;
|
||||||
|
to_Challenge_mode.Click += to_Challenge_mode_Click;
|
||||||
//
|
//
|
||||||
// mainLabel
|
// mainLabel
|
||||||
//
|
//
|
||||||
|
@ -93,7 +94,7 @@
|
||||||
mainLabel.TabIndex = 4;
|
mainLabel.TabIndex = 4;
|
||||||
mainLabel.Text = "连连看";
|
mainLabel.Text = "连连看";
|
||||||
//
|
//
|
||||||
// Leisure_Mode_MenuForm
|
// MenuForm
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(11F, 24F);
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
AutoScaleMode = AutoScaleMode.Font;
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
@ -107,7 +108,7 @@
|
||||||
Controls.Add(to_table_of_scores);
|
Controls.Add(to_table_of_scores);
|
||||||
DoubleBuffered = true;
|
DoubleBuffered = true;
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
Name = "Leisure_Mode_MenuForm";
|
Name = "MenuForm";
|
||||||
Text = "MenuForm";
|
Text = "MenuForm";
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
|
@ -1,13 +1,11 @@
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Forms
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
public partial class Leisure_Mode_MenuForm : Form, IMenuForm
|
public partial class MenuForm : Form, IMenuForm
|
||||||
{
|
{
|
||||||
public Leisure_Mode_MenuForm()
|
public MenuForm()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Etcs.gameMenuForm = this;
|
Etcs.gameMenuForm = this;
|
||||||
Etcs.song_Audio_Processer.set_albums("C418");
|
|
||||||
Etcs.song_Audio_Processer.set_song(Etcs.song_Audio_Processer.get_next_song());
|
|
||||||
SetTheme();
|
SetTheme();
|
||||||
}
|
}
|
||||||
Color menuThemeColor, playThemeColor;
|
Color menuThemeColor, playThemeColor;
|
||||||
|
@ -49,25 +47,34 @@
|
||||||
mainLabel.ForeColor = Color.FromArgb(theme.FontColor![0], theme.FontColor[1], theme.FontColor[2]);
|
mainLabel.ForeColor = Color.FromArgb(theme.FontColor![0], theme.FontColor[1], theme.FontColor[2]);
|
||||||
mainLabel.Location = new Point(theme.FontBlockPos![0], theme.FontBlockPos[1]);
|
mainLabel.Location = new Point(theme.FontBlockPos![0], theme.FontBlockPos[1]);
|
||||||
mainLabel.Size = new Size(theme.FontBlockSize![0], theme.FontBlockSize[1]);
|
mainLabel.Size = new Size(theme.FontBlockSize![0], theme.FontBlockSize[1]);
|
||||||
|
Etcs.song_Audio_Processer.set_albums(Etcs.curAlbum);
|
||||||
|
Etcs.song_Audio_Processer.set_song(Etcs.song_Audio_Processer.get_next_song());
|
||||||
}
|
}
|
||||||
public void playFormToMenu()
|
public void playFormToMenu()
|
||||||
{
|
{
|
||||||
Etcs.form?.change_form(this, true, playThemeColor, menuThemeColor, AnimationUseImage, playPanelImage!);
|
Etcs.form?.change_form(this, true, playThemeColor, menuThemeColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void start_Game_Click(object sender, EventArgs e)
|
private void start_Game_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Etcs.form?.change_form(new Leisure_Mode(), true, menuThemeColor, playThemeColor, AnimationUseImage, this.BackgroundImage);
|
Etcs.form?.change_form(new Leisure_Mode(), true, menuThemeColor, playThemeColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void to_settings_Click(object sender, EventArgs e)
|
private void to_settings_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Etcs.form?.change_form(Etcs.setting, false, null, null, false, null);
|
Etcs.form?.change_form(Etcs.setting, false, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void to_table_of_scores_Click(object sender, EventArgs e)
|
private void to_table_of_scores_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Etcs.form?.change_form(Etcs.charts, false, null, null, false, null);
|
Etcs.form?.change_form(Etcs.charts, false, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void to_Challenge_mode_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
//Etcs.form?.change_form(new Challenge_Mode(), true, menuThemeColor, playThemeColor, AnimationUseImage, this.BackgroundImage);
|
||||||
|
Etcs.form?.change_form(new Challenge_Mode(), true, menuThemeColor, Color.Black);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,17 +1,17 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
<!--
|
<!--
|
||||||
Microsoft ResX Schema
|
Microsoft ResX Schema
|
||||||
|
|
||||||
Version 2.0
|
Version 2.0
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
The primary goals of this format is to allow a simple XML format
|
||||||
that is mostly human readable. The generation and parsing of the
|
that is mostly human readable. The generation and parsing of the
|
||||||
various data types are done through the TypeConverter classes
|
various data types are done through the TypeConverter classes
|
||||||
associated with the data types.
|
associated with the data types.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
... ado.net/XML headers & schema ...
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
<resheader name="version">2.0</resheader>
|
<resheader name="version">2.0</resheader>
|
||||||
|
@ -26,36 +26,36 @@
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
<comment>This is a comment</comment>
|
<comment>This is a comment</comment>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
There are any number of "resheader" rows that contain simple
|
||||||
name/value pairs.
|
name/value pairs.
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
Each data row contains a name, and value. The row also contains a
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
text/value conversion through the TypeConverter architecture.
|
text/value conversion through the TypeConverter architecture.
|
||||||
Classes that don't support this are serialized and stored with the
|
Classes that don't support this are serialized and stored with the
|
||||||
mimetype set.
|
mimetype set.
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
The mimetype is used for serialized objects, and tells the
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
read any of the formats listed below.
|
read any of the formats listed below.
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
value : The object must be serialized with
|
value : The object must be serialized with
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
value : The object must be serialized with
|
value : The object must be serialized with
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
value : The object must be serialized into a byte array
|
value : The object must be serialized into a byte array
|
||||||
: using a System.ComponentModel.TypeConverter
|
: using a System.ComponentModel.TypeConverter
|
||||||
: and then encoded with base64 encoding.
|
: and then encoded with base64 encoding.
|
||||||
-->
|
-->
|
|
@ -68,6 +68,9 @@
|
||||||
hard = new RadioButton();
|
hard = new RadioButton();
|
||||||
normal = new RadioButton();
|
normal = new RadioButton();
|
||||||
easy = new RadioButton();
|
easy = new RadioButton();
|
||||||
|
groupAlgorithm = new GroupBox();
|
||||||
|
ArrayAlgorithm = new RadioButton();
|
||||||
|
GraphAlgorithm = new RadioButton();
|
||||||
((System.ComponentModel.ISupportInitialize)back).BeginInit();
|
((System.ComponentModel.ISupportInitialize)back).BeginInit();
|
||||||
contextPanel.SuspendLayout();
|
contextPanel.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)psButton).BeginInit();
|
((System.ComponentModel.ISupportInitialize)psButton).BeginInit();
|
||||||
|
@ -76,6 +79,7 @@
|
||||||
((System.ComponentModel.ISupportInitialize)soundScapeVolume).BeginInit();
|
((System.ComponentModel.ISupportInitialize)soundScapeVolume).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)musicVolume).BeginInit();
|
((System.ComponentModel.ISupportInitialize)musicVolume).BeginInit();
|
||||||
groupDifficulty.SuspendLayout();
|
groupDifficulty.SuspendLayout();
|
||||||
|
groupAlgorithm.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// back
|
// back
|
||||||
|
@ -105,6 +109,7 @@
|
||||||
//
|
//
|
||||||
contextPanel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
contextPanel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||||
contextPanel.BackColor = SystemColors.ScrollBar;
|
contextPanel.BackColor = SystemColors.ScrollBar;
|
||||||
|
contextPanel.Controls.Add(groupAlgorithm);
|
||||||
contextPanel.Controls.Add(button1);
|
contextPanel.Controls.Add(button1);
|
||||||
contextPanel.Controls.Add(当前主题);
|
contextPanel.Controls.Add(当前主题);
|
||||||
contextPanel.Controls.Add(themeSelector);
|
contextPanel.Controls.Add(themeSelector);
|
||||||
|
@ -126,7 +131,7 @@
|
||||||
contextPanel.Controls.Add(groupDifficulty);
|
contextPanel.Controls.Add(groupDifficulty);
|
||||||
contextPanel.Location = new Point(71, 103);
|
contextPanel.Location = new Point(71, 103);
|
||||||
contextPanel.Name = "contextPanel";
|
contextPanel.Name = "contextPanel";
|
||||||
contextPanel.Size = new Size(1219, 1209);
|
contextPanel.Size = new Size(1193, 1209);
|
||||||
contextPanel.TabIndex = 21;
|
contextPanel.TabIndex = 21;
|
||||||
//
|
//
|
||||||
// button1
|
// button1
|
||||||
|
@ -523,6 +528,43 @@
|
||||||
easy.UseVisualStyleBackColor = true;
|
easy.UseVisualStyleBackColor = true;
|
||||||
easy.CheckedChanged += Difficulty_CheckedChanged;
|
easy.CheckedChanged += Difficulty_CheckedChanged;
|
||||||
//
|
//
|
||||||
|
// groupAlgorithm
|
||||||
|
//
|
||||||
|
groupAlgorithm.BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
groupAlgorithm.Controls.Add(GraphAlgorithm);
|
||||||
|
groupAlgorithm.Controls.Add(ArrayAlgorithm);
|
||||||
|
groupAlgorithm.Font = new Font("Microsoft YaHei UI", 15F);
|
||||||
|
groupAlgorithm.Location = new Point(61, 886);
|
||||||
|
groupAlgorithm.Name = "groupAlgorithm";
|
||||||
|
groupAlgorithm.Size = new Size(327, 208);
|
||||||
|
groupAlgorithm.TabIndex = 35;
|
||||||
|
groupAlgorithm.TabStop = false;
|
||||||
|
groupAlgorithm.Text = " 内部算法";
|
||||||
|
//
|
||||||
|
// ArrayAlgorithm
|
||||||
|
//
|
||||||
|
ArrayAlgorithm.AutoSize = true;
|
||||||
|
ArrayAlgorithm.Checked = true;
|
||||||
|
ArrayAlgorithm.Location = new Point(25, 45);
|
||||||
|
ArrayAlgorithm.Name = "ArrayAlgorithm";
|
||||||
|
ArrayAlgorithm.Size = new Size(102, 43);
|
||||||
|
ArrayAlgorithm.TabIndex = 0;
|
||||||
|
ArrayAlgorithm.TabStop = true;
|
||||||
|
ArrayAlgorithm.Text = "数组";
|
||||||
|
ArrayAlgorithm.UseVisualStyleBackColor = true;
|
||||||
|
ArrayAlgorithm.CheckedChanged += Algorithm_CheckedChanged;
|
||||||
|
//
|
||||||
|
// GraphAlgorithm
|
||||||
|
//
|
||||||
|
GraphAlgorithm.AutoSize = true;
|
||||||
|
GraphAlgorithm.Location = new Point(25, 105);
|
||||||
|
GraphAlgorithm.Name = "GraphAlgorithm";
|
||||||
|
GraphAlgorithm.Size = new Size(72, 43);
|
||||||
|
GraphAlgorithm.TabIndex = 1;
|
||||||
|
GraphAlgorithm.Text = "图";
|
||||||
|
GraphAlgorithm.UseVisualStyleBackColor = true;
|
||||||
|
GraphAlgorithm.CheckedChanged += Algorithm_CheckedChanged;
|
||||||
|
//
|
||||||
// Setting
|
// Setting
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new SizeF(11F, 24F);
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
|
@ -547,6 +589,8 @@
|
||||||
((System.ComponentModel.ISupportInitialize)musicVolume).EndInit();
|
((System.ComponentModel.ISupportInitialize)musicVolume).EndInit();
|
||||||
groupDifficulty.ResumeLayout(false);
|
groupDifficulty.ResumeLayout(false);
|
||||||
groupDifficulty.PerformLayout();
|
groupDifficulty.PerformLayout();
|
||||||
|
groupAlgorithm.ResumeLayout(false);
|
||||||
|
groupAlgorithm.PerformLayout();
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
PerformLayout();
|
PerformLayout();
|
||||||
}
|
}
|
||||||
|
@ -592,5 +636,8 @@
|
||||||
private RadioButton hard;
|
private RadioButton hard;
|
||||||
private RadioButton normal;
|
private RadioButton normal;
|
||||||
private RadioButton easy;
|
private RadioButton easy;
|
||||||
|
private GroupBox groupAlgorithm;
|
||||||
|
private RadioButton GraphAlgorithm;
|
||||||
|
private RadioButton ArrayAlgorithm;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -87,12 +87,16 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
var s = albumSelector.SelectedItem?.ToString();
|
var s = albumSelector.SelectedItem?.ToString();
|
||||||
if (s != null)
|
if (s != null)
|
||||||
|
{
|
||||||
Etcs.song_Audio_Processer.set_albums(s);
|
Etcs.song_Audio_Processer.set_albums(s);
|
||||||
|
Etcs.curAlbum = s;
|
||||||
|
}
|
||||||
nextSong_Click(this, new EventArgs());
|
nextSong_Click(this, new EventArgs());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void musicVolume_Scroll(object? sender, EventArgs e)
|
private void musicVolume_Scroll(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
Etcs.Song_Volume = musicVolume.Value;
|
||||||
Etcs.song_Audio_Processer.volume_change(musicVolume.Value);
|
Etcs.song_Audio_Processer.volume_change(musicVolume.Value);
|
||||||
if (sender != null)
|
if (sender != null)
|
||||||
songVolumeText.Text = musicVolume.Value.ToString();
|
songVolumeText.Text = musicVolume.Value.ToString();
|
||||||
|
@ -110,7 +114,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
CusSize_Validated(this, new EventArgs());
|
CusSize_Validated(this, new EventArgs());
|
||||||
if (_canBack)
|
if (_canBack)
|
||||||
await Etcs.form!.change_form((Etcs.gameMenuForm as Form)!, false, null, null, false, null);
|
await Etcs.form!.change_form((Etcs.gameMenuForm as Form)!, false, null, null);
|
||||||
}
|
}
|
||||||
private void SetTimeText(int t) => time.Text = $"{t / 60}:{((t % 60) < 10 ? ("0" + (t % 60).ToString()) : (t % 60).ToString())}";
|
private void SetTimeText(int t) => time.Text = $"{t / 60}:{((t % 60) < 10 ? ("0" + (t % 60).ToString()) : (t % 60).ToString())}";
|
||||||
private int CalcTime(int total) => (int)(Math.Ceiling((double)total / 50)) * 60;//50per minute 向上取整
|
private int CalcTime(int total) => (int)(Math.Ceiling((double)total / 50)) * 60;//50per minute 向上取整
|
||||||
|
@ -136,7 +140,6 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
int ans = CalcTime(a * b);
|
int ans = CalcTime(a * b);
|
||||||
Etcs.left_time = ans;
|
Etcs.left_time = ans;
|
||||||
SetTimeText(ans);
|
SetTimeText(ans);
|
||||||
|
|
||||||
}
|
}
|
||||||
private bool _cusDataChanged = false;
|
private bool _cusDataChanged = false;
|
||||||
private void cusWidth_TextChanged(object sender, EventArgs e)
|
private void cusWidth_TextChanged(object sender, EventArgs e)
|
||||||
|
@ -255,5 +258,18 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
Etcs.currentThemeInfo = Etcs.themes[s!];
|
Etcs.currentThemeInfo = Etcs.themes[s!];
|
||||||
SetTheme();
|
SetTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Algorithm_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
switch ((sender as RadioButton)!.Name)
|
||||||
|
{
|
||||||
|
case "ArrayAlgorithm":
|
||||||
|
Etcs.curAlgorithm = Etcs.Algorithm.Array;
|
||||||
|
break;
|
||||||
|
case "GraphAlgorithm":
|
||||||
|
Etcs.curAlgorithm = Etcs.Algorithm.Graph;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
Name = "Single_Block";
|
Name = "Single_Block";
|
||||||
Padding = new Padding(3);
|
Padding = new Padding(3);
|
||||||
Size = new Size(40, 40);
|
Size = new Size(40, 40);
|
||||||
|
Load += Single_Block_Load;
|
||||||
((System.ComponentModel.ISupportInitialize)picture).EndInit();
|
((System.ComponentModel.ISupportInitialize)picture).EndInit();
|
||||||
ResumeLayout(false);
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,14 +21,14 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
if (Etcs.gameForm == null)
|
if (Etcs.gameForm == null)
|
||||||
throw new Exception("game_form is null but try to make a new Single_Block");
|
throw new Exception("game_form is null but try to make a new Single_Block");
|
||||||
Selected += Etcs.gameForm.Selected_Handler;
|
Selected += Etcs.gameForm.Selected_Handler;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
int imageID = -1;
|
||||||
public Single_Block(int image, Color default_backColor, Color select_Color, (int, int) pos)
|
public Single_Block(int image, Color default_backColor, Color select_Color, (int, int) pos)
|
||||||
{
|
{
|
||||||
block_id = image;
|
block_id = image;
|
||||||
position = pos;
|
position = pos;
|
||||||
|
imageID = image;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Image_change(Etcs.get_block_Image(image));
|
|
||||||
picture.SizeMode = PictureBoxSizeMode.Zoom;
|
picture.SizeMode = PictureBoxSizeMode.Zoom;
|
||||||
nor_color = default_backColor;
|
nor_color = default_backColor;
|
||||||
sel_color = select_Color;
|
sel_color = select_Color;
|
||||||
|
@ -39,7 +39,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
Selected += Etcs.gameForm.Selected_Handler;
|
Selected += Etcs.gameForm.Selected_Handler;
|
||||||
|
|
||||||
}
|
}
|
||||||
public Single_Block(Image image, (int, int) pos)
|
public Single_Block((int, int) pos)
|
||||||
{
|
{
|
||||||
position = pos;
|
position = pos;
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
@ -87,11 +87,29 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
Etcs.Direction direction = Etcs.Direction.none;
|
Etcs.Direction direction = Etcs.Direction.none;
|
||||||
public void hint_path(Etcs.Direction direction)
|
public void hint_path(Etcs.Direction direction)
|
||||||
{
|
{
|
||||||
|
if (picture == null)
|
||||||
|
{
|
||||||
|
picture = new PictureBox { Dock = DockStyle.Fill };
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
Controls.Add(picture);
|
||||||
|
picture.BringToFront();
|
||||||
|
});
|
||||||
|
}
|
||||||
this.direction |= direction;
|
this.direction |= direction;
|
||||||
Image_change(Etcs.get_tip_direction_Image(this.direction));
|
Image_change(Etcs.get_tip_direction_Image(this.direction));
|
||||||
}
|
}
|
||||||
public void to_path(Etcs.Direction direction)
|
public void to_path(Etcs.Direction direction)
|
||||||
{
|
{
|
||||||
|
if (picture == null)
|
||||||
|
{
|
||||||
|
picture = new PictureBox { Dock = DockStyle.Fill };
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
Controls.Add(picture);
|
||||||
|
picture.BringToFront();
|
||||||
|
});
|
||||||
|
}
|
||||||
Image_change(Etcs.get_direction_Image(direction));
|
Image_change(Etcs.get_direction_Image(direction));
|
||||||
direction = Etcs.Direction.none;
|
direction = Etcs.Direction.none;
|
||||||
}
|
}
|
||||||
|
@ -113,38 +131,65 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
int timer_Eplased = 0;
|
int timer_Eplased = 0;
|
||||||
public void Image_Clear(object? sender, ElapsedEventArgs e)
|
public void Image_Clear(object? sender, ElapsedEventArgs e)
|
||||||
{
|
{
|
||||||
if(timer_Eplased++ > 5)
|
if (timer_Eplased++ > 5)
|
||||||
{
|
{
|
||||||
Image_change(Etcs.trans_Image);
|
Etcs.hunderd_millsecond_timer.Elapsed -= Image_Clear;
|
||||||
Etcs.hunderd_millsecond_timer.Elapsed-= Image_Clear;
|
try
|
||||||
|
{
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
if (picture == null)
|
||||||
|
return;
|
||||||
|
picture.Visible = false;
|
||||||
|
picture.Dispose();
|
||||||
|
Controls.Remove(picture);
|
||||||
|
picture = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ConcurrentQueue<Image>images_queue = new ConcurrentQueue<Image>();
|
ConcurrentQueue<Image> images_queue = new ConcurrentQueue<Image>();
|
||||||
Thread? Image_setting_thread;
|
Thread? Image_setting_thread;
|
||||||
public void Image_change(Image new_image)
|
public void Image_change(Image new_image)
|
||||||
{
|
{
|
||||||
images_queue.Enqueue(new_image);
|
try
|
||||||
if (Image_setting_thread == null || !Image_setting_thread.IsAlive)
|
|
||||||
{
|
{
|
||||||
Image_setting_thread = new Thread(() =>
|
try
|
||||||
|
{ images_queue.Enqueue(new_image); }
|
||||||
|
catch (Exception)
|
||||||
{
|
{
|
||||||
while (images_queue.TryDequeue(out Image? image))
|
Console.WriteLine("Unusual Exception");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
if (Image_setting_thread == null || !Image_setting_thread.IsAlive)
|
||||||
|
{
|
||||||
|
Image_setting_thread = new Thread(() =>
|
||||||
{
|
{
|
||||||
try
|
while (images_queue.TryDequeue(out Image? image))
|
||||||
{
|
{
|
||||||
lock (image)
|
try
|
||||||
{
|
{
|
||||||
Image_set(image);
|
lock (image)
|
||||||
|
{
|
||||||
|
Image_set(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
images_queue.Enqueue(image);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
images_queue.Enqueue(image);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Image_setting_thread.Start();
|
Image_setting_thread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
Console.WriteLine("unuasual 2");
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void Image_set(Image image)
|
private void Image_set(Image image)
|
||||||
|
@ -153,7 +198,9 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
{
|
{
|
||||||
lock (locker)
|
lock (locker)
|
||||||
{
|
{
|
||||||
picture.Image = image;
|
if (picture == null)
|
||||||
|
picture = new PictureBox { Dock = DockStyle.Fill };
|
||||||
|
picture!.Image = image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
|
@ -177,7 +224,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
|
||||||
private void picture_MouseEnter(object sender, EventArgs e)
|
private void picture_MouseEnter(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if(!can_be_selected || selected)
|
if (!can_be_selected || selected)
|
||||||
return;
|
return;
|
||||||
BackColor = mouse_upper_color;
|
BackColor = mouse_upper_color;
|
||||||
}
|
}
|
||||||
|
@ -189,6 +236,11 @@ namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
BackColor = nor_color;
|
BackColor = nor_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Single_Block_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Image_change(imageID == -1 ? Properties.Resources.trans : Etcs.get_block_Image(imageID));
|
||||||
|
}
|
||||||
|
|
||||||
public event SelectedEventHandler Selected;
|
public event SelectedEventHandler Selected;
|
||||||
}
|
}
|
||||||
public class SelectedEventArgs : EventArgs
|
public class SelectedEventArgs : EventArgs
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
{
|
||||||
|
partial class TimeLine
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 必需的设计器变量。
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清理所有正在使用的资源。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 组件设计器生成的代码
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设计器支持所需的方法 - 不要修改
|
||||||
|
/// 使用代码编辑器修改此方法的内容。
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// TimeLine
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new SizeF(11F, 24F);
|
||||||
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
BackColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
Name = "TimeLine";
|
||||||
|
Size = new Size(958, 10);
|
||||||
|
ResumeLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
using OpenCvSharp;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace CDSAE3_Lian_Lian_Kan.Forms
|
||||||
|
{
|
||||||
|
public partial class TimeLine : UserControl
|
||||||
|
{
|
||||||
|
public TimeLine()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
private Color _backColor = Color.FromArgb(0,0,0);
|
||||||
|
private Color _frontColor = Color.FromArgb(97, 97, 108);
|
||||||
|
public void set_progress(float progress, Color backColor, Color frontColor)
|
||||||
|
{
|
||||||
|
_backColor = backColor;
|
||||||
|
_frontColor = frontColor;
|
||||||
|
set_progress(progress);
|
||||||
|
}
|
||||||
|
public void set_progress(double progress)
|
||||||
|
{
|
||||||
|
SolidBrush upperBrush = new SolidBrush(_backColor);
|
||||||
|
SolidBrush lowerBrush = new SolidBrush(_frontColor);
|
||||||
|
SolidBrush pointBrush = new SolidBrush(Color.FromArgb(255, 255, 255));
|
||||||
|
Graphics formGraphics = CreateGraphics();
|
||||||
|
//formGraphics.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
int wire = (int)(progress * Width);
|
||||||
|
formGraphics.FillRectangle(lowerBrush, new Rectangle(0, 0, wire, Height));
|
||||||
|
formGraphics.FillRectangle(pointBrush, new Rectangle(wire,0 , 4, Height));
|
||||||
|
formGraphics.FillRectangle(upperBrush, new Rectangle(wire + 4, 0, Width, Height));
|
||||||
|
upperBrush.Dispose();
|
||||||
|
lowerBrush.Dispose();
|
||||||
|
formGraphics.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,120 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
|
@ -60,6 +60,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] Ambient {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Ambient", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -230,6 +240,26 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap cpp {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("cpp", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap cSharp {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("cSharp", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -290,6 +320,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] failed {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("failed", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -360,6 +400,26 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gcpp {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gcpp", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap GcSharp {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("GcSharp", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -370,6 +430,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Ggo {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Ggo", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -380,6 +450,36 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gjava {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gjava", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gkotlin {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gkotlin", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap go {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("go", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -390,6 +490,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gpython {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gpython", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -400,6 +510,26 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gruby {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gruby", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Grust {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Grust", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -410,6 +540,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap Gvue {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Gvue", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -420,6 +560,36 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] HitSong {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("HitSong", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap java {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("java", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap kotlin {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("kotlin", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -460,6 +630,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] Message {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Message", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -500,6 +680,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap python {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("python", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -510,6 +700,26 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap ruby {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("ruby", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap rust {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("rust", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Byte[] 类型的本地化资源。
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -820,6 +1030,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] songInfoShow {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("songInfoShow", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Byte[] 类型的本地化资源。
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -840,6 +1060,16 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Byte[] 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] Tatsh___Xenolith {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("Tatsh___Xenolith", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1080,6 +1310,186 @@ namespace CDSAE3_Lian_Lian_Kan.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap vue {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("vue", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_d {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_d", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_dl {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_dl", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_dlr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_dlr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_dr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_dr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_exchange {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_exchange", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_l {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_l", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_lr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_lr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_r {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_r", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_search {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_search", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_u {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_u", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_ud {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_ud", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_udl {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_udl", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_udlr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_udlr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_udr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_udr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_ul {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_ul", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_ulr {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_ulr", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap w_ur {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("w_ur", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -427,4 +427,127 @@
|
||||||
<data name="Sea_Power___Zaum" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="Sea_Power___Zaum" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Resources\Sea Power - Zaum.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>..\Resources\Sea Power - Zaum.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Ambient" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Ambient.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="failed" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\failed.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="HitSong" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\HitSong.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="Message" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Message.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="songInfoShow" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\songInfoShow.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="Tatsh___Xenolith" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Tatsh - Xenolith.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_d" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_d.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_dl" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_dl.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_dlr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_dlr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_dr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_dr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_exchange" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_exchange.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_l" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_l.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_lr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_lr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_r" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_r.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_search" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_u" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_u.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_ud" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_ud.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_udl" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_udl.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_udlr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_udlr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_udr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_udr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_ul" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_ul.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_ulr" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_ulr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="w_ur" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\w_ur.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="cpp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\cpp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="cSharp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\cSharp.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gcpp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gcpp.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="GcSharp" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\GcSharp.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Ggo" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Ggo.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gjava" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gjava.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gkotlin" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gkotlin.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="go" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gpython" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gpython.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gruby" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gruby.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Grust" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Grust.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="Gvue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\Gvue.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="java" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\java.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="kotlin" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\kotlin.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="python" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\python.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="ruby" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\ruby.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="rust" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\rust.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
<data name="vue" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\vue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.1 KiB |
|
@ -30,8 +30,12 @@ namespace CDSAE3_Lian_Lian_Kan.Sound
|
||||||
sound = new MemoryStream(source_obj);
|
sound = new MemoryStream(source_obj);
|
||||||
ms = new MemoryStream(StreamToBytes(sound));
|
ms = new MemoryStream(StreamToBytes(sound));
|
||||||
ws = new Mp3FileReader(ms);
|
ws = new Mp3FileReader(ms);
|
||||||
|
|
||||||
|
|
||||||
blockAlignReductionStream = new BlockAlignReductionStream(ws);
|
blockAlignReductionStream = new BlockAlignReductionStream(ws);
|
||||||
|
|
||||||
wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream);
|
wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream);
|
||||||
|
|
||||||
wave16ToFloatProvider.Volume = volume / 100f;
|
wave16ToFloatProvider.Volume = volume / 100f;
|
||||||
waveOutEvent = new WaveOutEvent();
|
waveOutEvent = new WaveOutEvent();
|
||||||
waveOutEvent.Init(wave16ToFloatProvider);
|
waveOutEvent.Init(wave16ToFloatProvider);
|
||||||
|
@ -73,7 +77,11 @@ namespace CDSAE3_Lian_Lian_Kan.Sound
|
||||||
waveOutEvent.Stop();
|
waveOutEvent.Stop();
|
||||||
sound.Dispose();
|
sound.Dispose();
|
||||||
ms.Dispose();
|
ms.Dispose();
|
||||||
ws.Dispose();
|
try
|
||||||
|
{
|
||||||
|
ws.Dispose();
|
||||||
|
}catch(Exception)
|
||||||
|
{ }
|
||||||
blockAlignReductionStream.Dispose();
|
blockAlignReductionStream.Dispose();
|
||||||
waveOutEvent.Dispose();
|
waveOutEvent.Dispose();
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
|
|
|
@ -14,31 +14,31 @@ namespace CDSAE3_Lian_Lian_Kan.Sound
|
||||||
string last_break_soundScape = "";
|
string last_break_soundScape = "";
|
||||||
Random random = new Random();
|
Random random = new Random();
|
||||||
internal void set_SoundScape_version(Etcs.break_music version) => soundScape_version = version;
|
internal void set_SoundScape_version(Etcs.break_music version) => soundScape_version = version;
|
||||||
internal void play_random_break_soundScape()
|
internal void play_random_break_soundScape(int volume = -1, Action<string, AudioPlayer>? finished = null)
|
||||||
{
|
{
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
void finished(string s,AudioPlayer audioPlayer)
|
if (volume == -1)
|
||||||
{
|
volume = Etcs.Info_Volume;
|
||||||
audioPlayer.Dispose();
|
if (finished == null)
|
||||||
}
|
finished = (s, player) => player.Dispose();
|
||||||
AudioPlayer audioPlayer = new AudioPlayer(get_random_break_soundScape(), Etcs.Info_Volume,finished);
|
AudioPlayer audioPlayer = new AudioPlayer(get_random_break_soundScape(), volume, finished);
|
||||||
audioPlayer.resume_song();
|
audioPlayer.resume_song();
|
||||||
//object obj = Settings.res_Manager.GetObject(get_random_break_soundScape(), Settings.res_Culture)!;
|
|
||||||
//var infoOutputDevice = new WaveOutEvent();
|
|
||||||
//using (var sound = new MemoryStream((byte[])obj))
|
|
||||||
//using (var ms = new MemoryStream(StreamToBytes(sound)))
|
|
||||||
//using (var ws = new Mp3FileReader(ms))
|
|
||||||
//using (var blockAlignReductionStream = new BlockAlignReductionStream(ws))
|
|
||||||
//{
|
|
||||||
// var wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream);
|
|
||||||
// wave16ToFloatProvider.Volume = soundScape_volume / 100f;
|
|
||||||
// infoOutputDevice.Init(wave16ToFloatProvider);
|
|
||||||
// infoOutputDevice.PlaybackStopped += InfoOutputDevice_PlaybackStopped;
|
|
||||||
// infoOutputDevice.Play();
|
|
||||||
//}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
internal void playMusicClip(string s,int volume = -1,Action<string ,AudioPlayer>?finished = null)
|
||||||
|
{
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
if (volume == -1)
|
||||||
|
volume = Etcs.Info_Volume;
|
||||||
|
if (finished == null)
|
||||||
|
finished = (s, player) => player.Dispose();
|
||||||
|
AudioPlayer audioPlayer = new AudioPlayer(s, volume, finished);
|
||||||
|
audioPlayer.resume_song();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private string get_random_break_soundScape()
|
private string get_random_break_soundScape()
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,13 +10,22 @@ using CDSAE3_Lian_Lian_Kan.Properties;
|
||||||
using NAudio.Wave.SampleProviders;
|
using NAudio.Wave.SampleProviders;
|
||||||
namespace CDSAE3_Lian_Lian_Kan.Sound
|
namespace CDSAE3_Lian_Lian_Kan.Sound
|
||||||
{
|
{
|
||||||
|
public class SongFinishedEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public string SongName { get; set; }
|
||||||
|
public SongFinishedEventArgs(string songName) => SongName = songName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void SongFinishedEventHandler(Song_Audio_processer s, SongFinishedEventArgs e);
|
||||||
public class Song_Audio_processer:IDisposable
|
public class Song_Audio_processer:IDisposable
|
||||||
{
|
{
|
||||||
AudioPlayer? audioPlayer;
|
AudioPlayer? audioPlayer;
|
||||||
private List<string> audioFiles = new List<string>();
|
private List<string> audioFiles = new List<string>();
|
||||||
|
public event SongFinishedEventHandler? SongFinished;
|
||||||
int next_song = 1;
|
int next_song = 1;
|
||||||
private void OnPlaybackStopped(string s,object? obj)
|
private void OnPlaybackStopped(string s,object? obj)
|
||||||
{
|
{
|
||||||
|
SongFinished?.Invoke(this, new SongFinishedEventArgs(s));
|
||||||
set_song(get_next_song());
|
set_song(get_next_song());
|
||||||
}
|
}
|
||||||
public void pause_song()=> audioPlayer?.pause_song();
|
public void pause_song()=> audioPlayer?.pause_song();
|
||||||
|
@ -44,19 +53,20 @@ namespace CDSAE3_Lian_Lian_Kan.Sound
|
||||||
public void volume_change(int val)=> audioPlayer?.volume_change(val);
|
public void volume_change(int val)=> audioPlayer?.volume_change(val);
|
||||||
public void set_albums(string s)
|
public void set_albums(string s)
|
||||||
{
|
{
|
||||||
|
next_song = 0;
|
||||||
var result = Etcs.musics.Where(x => x.Key == s).ToList();
|
var result = Etcs.musics.Where(x => x.Key == s).ToList();
|
||||||
if (result.Count == 0)
|
if (result.Count == 0)
|
||||||
throw new Exception("no such album");
|
throw new Exception("no such album");
|
||||||
audioFiles = result.First().Value;
|
audioFiles = result.First().Value;
|
||||||
Etcs.setting.SetAlbum(result.First().Key);
|
Etcs.setting.SetAlbum(result.First().Key);
|
||||||
}
|
}
|
||||||
public void set_song(string s)
|
internal void set_song(string s,int volume = -1,Action<string,AudioPlayer>? finished = null)
|
||||||
{
|
{
|
||||||
Etcs.setting.SetSongInfo(s);
|
Etcs.setting.SetSongInfo(s);
|
||||||
audioPlayer?.Dispose();
|
audioPlayer?.Dispose();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
audioPlayer = new AudioPlayer(s, Etcs.Song_Volume, OnPlaybackStopped);
|
audioPlayer = new AudioPlayer(s, volume == -1 ? Etcs.Song_Volume : volume, finished ?? OnPlaybackStopped);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|