From 5b1d474cfd2aa581c80d607fd3c3dd7a78be385e Mon Sep 17 00:00:00 2001 From: lichx Date: Tue, 2 Apr 2024 21:57:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E4=BA=86=E4=B8=80=E5=A0=86=E4=B8=9C?= =?UTF-8?q?=E8=A5=BF=20=E6=8E=A8=E9=80=81=EF=BC=81=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CDSAE3_Lian_Lian_Kan/Board_funcs/Board.cs | 89 +++++----- CDSAE3_Lian_Lian_Kan/Board_funcs/IBoard.cs | 19 ++ CDSAE3_Lian_Lian_Kan/{Settings.cs => Etcs.cs} | 14 +- .../Forms/Audio_player.Designer.cs | 94 ---------- CDSAE3_Lian_Lian_Kan/Forms/Audio_player.cs | 55 ------ CDSAE3_Lian_Lian_Kan/Forms/Audio_player.resx | 120 ------------- CDSAE3_Lian_Lian_Kan/Forms/GameControl.cs | 59 ++++--- .../Forms/Leisure_Mode.Designer.cs | 15 ++ CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.cs | 16 +- .../Forms/Leisure_Mode_MenuForm.cs | 6 +- .../Forms/MainForm.Designer.cs | 1 + CDSAE3_Lian_Lian_Kan/Forms/MainForm.cs | 4 +- .../Forms/Single_Block.Designer.cs | 2 + CDSAE3_Lian_Lian_Kan/Forms/Single_Block.cs | 66 ++++--- .../Properties/Resources.Designer.cs | 80 +++++++++ .../Properties/Resources.resx | 24 +++ CDSAE3_Lian_Lian_Kan/Resources/breakA1.mp3 | Bin 0 -> 6222 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA2.mp3 | Bin 0 -> 5620 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA3.mp3 | Bin 0 -> 7082 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA4.mp3 | Bin 0 -> 7658 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA5.mp3 | Bin 0 -> 7136 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA6.mp3 | Bin 0 -> 6977 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA7.mp3 | Bin 0 -> 6846 bytes CDSAE3_Lian_Lian_Kan/Resources/breakA8.mp3 | Bin 0 -> 6351 bytes CDSAE3_Lian_Lian_Kan/Sound/AudioPlayer.cs | 141 +++++++++++++++ CDSAE3_Lian_Lian_Kan/Sound/Audio_processer.cs | 164 ------------------ .../Sound/Info_Audio_processer.cs | 71 ++++++++ .../Sound/Song_Audio_processer.cs | 147 ++++++++++++++++ 28 files changed, 649 insertions(+), 538 deletions(-) create mode 100644 CDSAE3_Lian_Lian_Kan/Board_funcs/IBoard.cs rename CDSAE3_Lian_Lian_Kan/{Settings.cs => Etcs.cs} (89%) delete mode 100644 CDSAE3_Lian_Lian_Kan/Forms/Audio_player.Designer.cs delete mode 100644 CDSAE3_Lian_Lian_Kan/Forms/Audio_player.cs delete mode 100644 CDSAE3_Lian_Lian_Kan/Forms/Audio_player.resx create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA1.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA2.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA3.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA4.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA5.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA6.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA7.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Resources/breakA8.mp3 create mode 100644 CDSAE3_Lian_Lian_Kan/Sound/AudioPlayer.cs delete mode 100644 CDSAE3_Lian_Lian_Kan/Sound/Audio_processer.cs create mode 100644 CDSAE3_Lian_Lian_Kan/Sound/Info_Audio_processer.cs create mode 100644 CDSAE3_Lian_Lian_Kan/Sound/Song_Audio_processer.cs diff --git a/CDSAE3_Lian_Lian_Kan/Board_funcs/Board.cs b/CDSAE3_Lian_Lian_Kan/Board_funcs/Board.cs index 4650b01..2a4a22a 100644 --- a/CDSAE3_Lian_Lian_Kan/Board_funcs/Board.cs +++ b/CDSAE3_Lian_Lian_Kan/Board_funcs/Board.cs @@ -8,9 +8,9 @@ using CDSAE3_Lian_Lian_Kan; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar; namespace CDSAE3_Lian_Lian_Kan.Board_funcs { - public partial class Board + public partial class Board:IBoard { - public int[,] Bd { get; set; } = { { } };//y,x + private int[,] Bd = { { } };//y,x public Dictionary> board_Index { get; } = new Dictionary>(); public int[] Vals_per_Image { get; set; } = { }; public int total; @@ -24,13 +24,13 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs { total = value; if (total == 0) - Settings.game_mode_form?.Finished_Handler(this, new Forms.FinishArgs { finish_Type = Forms.FinishArgs.Finish_Type.All_done }); + Etcs.game_mode_form?.Finished_Handler(this, new Forms.FinishArgs { finish_Type = Forms.FinishArgs.Finish_Type.All_done }); } } - public void make_board() + public int[,] make_board() { var rand = new Random(); - size = Settings.get_length_width(); + size = Etcs.get_length_width(); var (width, height) = size; Bd = new int[height + 2, width + 2]; for (int i = 0; i < height + 2; i++) @@ -40,7 +40,7 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs if (sum % 2 != 0) sum--; total = sum; - int types = Settings.Images_size(); + int types = Etcs.Images_size(); Vals_per_Image = new int[types]; int single = sum / types; for (int k = sum; k > 0; k -= 2) @@ -68,15 +68,21 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs } if (not_zero <= 1) { - int k = temp_val_per_Image.Single(x => x != 0); + int k = 0; + for(int i=0;i { (j, i) }); } + return Bd; } public (bool, List<(int, int)>?) test((int, int) a, (int, int) b)//x,y { @@ -274,31 +281,36 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs }; var (throughx, xrange) = intersection((squareA[3].Item1, squareA[1].Item1), (squareB[3].Item1, squareB[1].Item1)); var (throughy, yrange) = intersection((squareA[0].Item2, squareA[2].Item2), (squareB[0].Item2, squareB[2].Item2)); - Func<(int, int), List> swing_check = ((int, int) range) => + Func<(int, int), int, List> swing_check = ((int, int) range, int center) => { - int mid = (range.Item2 - range.Item1) / 2 + range.Item1; - bool swing = true;//up true - List ans = new List { mid }; - for (int i = 1; ;) + List result = new List(); + if (center < range.Item1) { - int t; - if (swing) - t = mid + i; - else - { - t = mid - i; - i++; - } - swing = !swing; - if (t >= range.Item1 && t <= range.Item2) - ans.Add(t); - else - break; + for (int k = range.Item1; k <= range.Item2; k++) + result.Add(k); + return result; } - return ans; + if (center > range.Item2) + { + for (int k = range.Item2; k >= range.Item1; k--) + result.Add(k); + return result; + } + result.Add(center); + Func inrange = (int t) => t >= range.Item1 && t <= range.Item2; + bool go_on = true; + for (int i = 1; go_on; i++) + { + go_on = false; + if (go_on |= inrange(center + i)) + result.Add(center + i); + if (go_on |= inrange(center - i)) + result.Add(center - i); + } + return result; }; if (throughx) - foreach (int i in swing_check(xrange)) + foreach (int i in swing_check(xrange, a.Item1)) if (line_test(false, i, a.Item2, b.Item2)) if (reverse) return (true, new List<(int, int)> { b, (i, b.Item2), (i, a.Item2), a }); @@ -306,7 +318,7 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs return (true, new List<(int, int)> { a, (i, a.Item2), (i, b.Item2), b }); if (throughy) - foreach (int i in swing_check(yrange)) + foreach (int i in swing_check(yrange, a.Item2)) if (line_test(true, i, a.Item1, b.Item1)) if (reverse) return (true, new List<(int, int)> { b, (b.Item1, i), (a.Item1, i), a }); @@ -315,9 +327,7 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs } return (false, null); } - - - internal void decrease(params (int, int)[] poss) + public void decrease(params (int, int)[] poss) { foreach (var (x, y) in poss) { @@ -329,20 +339,19 @@ namespace CDSAE3_Lian_Lian_Kan.Board_funcs } } - internal List> get_tip((int, int) start) + internal List> get_tip((int, int) start) { List> ans = new List>(); - if(board_Index.TryGetValue( Bd[start.Item2, start.Item1], out var tip)) + if (board_Index.TryGetValue(Bd[start.Item2, start.Item1], out var tip)) foreach (var pos in tip) { var (result, path) = test(start, pos); - if(result&&path!=null) + if (result && path != null) ans.Add(path); } return ans; } - public (int, int) size { get; set; }//width,height - public Settings.Mode mode { get; set; } + public Etcs.Mode mode { get; set; } } } diff --git a/CDSAE3_Lian_Lian_Kan/Board_funcs/IBoard.cs b/CDSAE3_Lian_Lian_Kan/Board_funcs/IBoard.cs new file mode 100644 index 0000000..c096ccf --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Board_funcs/IBoard.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CDSAE3_Lian_Lian_Kan.Board_funcs +{ + internal interface IBoard + { + public int[,] make_board(); + public int[,] remake_board(); + public (bool, List<(int, int)>?) test((int, int) a, (int, int) b); + public void decrease(params (int, int)[] poss); + + + + } +} diff --git a/CDSAE3_Lian_Lian_Kan/Settings.cs b/CDSAE3_Lian_Lian_Kan/Etcs.cs similarity index 89% rename from CDSAE3_Lian_Lian_Kan/Settings.cs rename to CDSAE3_Lian_Lian_Kan/Etcs.cs index ad2c9ed..cc58c02 100644 --- a/CDSAE3_Lian_Lian_Kan/Settings.cs +++ b/CDSAE3_Lian_Lian_Kan/Etcs.cs @@ -11,7 +11,7 @@ using CDSAE3_Lian_Lian_Kan.Properties; using CDSAE3_Lian_Lian_Kan.Sound; namespace CDSAE3_Lian_Lian_Kan { - public static class Settings + public static class Etcs { public static int left_time { get; set; } = 180; public static int search_left_time { get; set; } = 20; @@ -46,6 +46,11 @@ namespace CDSAE3_Lian_Lian_Kan down_left_right = 14, up_down_left_right = 15 } + public enum break_music + { + breakA, + breakB + } public static Dictionary decrease_per_level = new Dictionary { {1,100.0/60 }, {2,100.0/45 }, @@ -78,9 +83,14 @@ namespace CDSAE3_Lian_Lian_Kan public static Board board { get; set; } = new Board(); public static Color def_Color { get; set; } = Color.FromArgb(0, 0, 0, 0); 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 Dictionary> musics { get; set; } = new Dictionary> { { "C418", new List { "C418 - Beginning 2", "C418 - Floating Trees", "C418 - Moog City 2", "C418 - Mutation" } } }; - public static Audio_processer audio_Processer { get; set; } = new 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 ResourceManager res_Manager { get; set; } = new ResourceManager("CDSAE3_Lian_Lian_Kan.Properties.Resources", typeof(Resources).Assembly); public static CultureInfo res_Culture { get; set; } = new CultureInfo("en-US"); + public static int Song_Volume { get; set; } = 70; + public static int Info_Volume { get; set; } = 70; + } } diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.Designer.cs deleted file mode 100644 index 869ca37..0000000 --- a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.Designer.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace CDSAE3_Lian_Lian_Kan.Forms -{ - partial class Audio_player - { - /// - /// 必需的设计器变量。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 清理所有正在使用的资源。 - /// - /// 如果应释放托管资源,为 true;否则为 false。 - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region 组件设计器生成的代码 - - /// - /// 设计器支持所需的方法 - 不要修改 - /// 使用代码编辑器修改此方法的内容。 - /// - private void InitializeComponent() - { - sp_Button = new PictureBox(); - last = new PictureBox(); - next = new PictureBox(); - ((System.ComponentModel.ISupportInitialize)sp_Button).BeginInit(); - ((System.ComponentModel.ISupportInitialize)last).BeginInit(); - ((System.ComponentModel.ISupportInitialize)next).BeginInit(); - SuspendLayout(); - // - // sp_Button - // - sp_Button.Image = Properties.Resources.pause; - sp_Button.Location = new Point(368, 114); - sp_Button.Name = "sp_Button"; - sp_Button.Size = new Size(70, 70); - sp_Button.SizeMode = PictureBoxSizeMode.Zoom; - sp_Button.TabIndex = 0; - sp_Button.TabStop = false; - sp_Button.Click += sp_Button_Click; - // - // last - // - last.Image = Properties.Resources.last; - last.Location = new Point(199, 114); - last.Name = "last"; - last.Size = new Size(70, 70); - last.SizeMode = PictureBoxSizeMode.Zoom; - last.TabIndex = 1; - last.TabStop = false; - last.Click += last_Click; - // - // next - // - next.Image = Properties.Resources.next; - next.Location = new Point(536, 114); - next.Name = "next"; - next.Size = new Size(70, 70); - next.SizeMode = PictureBoxSizeMode.Zoom; - next.TabIndex = 2; - next.TabStop = false; - next.Click += next_Click; - // - // Audio_player - // - AutoScaleDimensions = new SizeF(11F, 24F); - AutoScaleMode = AutoScaleMode.Font; - BackColor = Color.White; - Controls.Add(next); - Controls.Add(last); - Controls.Add(sp_Button); - Name = "Audio_player"; - Size = new Size(873, 323); - ((System.ComponentModel.ISupportInitialize)sp_Button).EndInit(); - ((System.ComponentModel.ISupportInitialize)last).EndInit(); - ((System.ComponentModel.ISupportInitialize)next).EndInit(); - ResumeLayout(false); - } - - #endregion - - private PictureBox sp_Button; - private PictureBox last; - private PictureBox next; - } -} diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.cs b/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.cs deleted file mode 100644 index bb669a7..0000000 --- a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.cs +++ /dev/null @@ -1,55 +0,0 @@ -using CDSAE3_Lian_Lian_Kan; -using CDSAE3_Lian_Lian_Kan.Properties; -using NAudio.Wave; -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; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; - -namespace CDSAE3_Lian_Lian_Kan.Forms -{ - public partial class Audio_player : UserControl - { - public Audio_player() - { - InitializeComponent(); - } - bool play_state = false; - private void sp_Button_Click(object sender, EventArgs e) - { - if (!play_state) - play(); - else - pause(); - play_state = !play_state; - } - private void play() - { - Settings.audio_Processer.resume_song(); - sp_Button.Image = Resources.pause; - } - private void pause() - { - Settings.audio_Processer.pause_song(); - sp_Button.Image = Resources.play_buttton; - } - - private void last_Click(object sender, EventArgs e) - { - Settings.audio_Processer.last_song(); - play(); - } - - private void next_Click(object sender, EventArgs e) - { - Settings.audio_Processer.next_song(); - play(); - } - } -} diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.resx b/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.resx deleted file mode 100644 index af32865..0000000 --- a/CDSAE3_Lian_Lian_Kan/Forms/Audio_player.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Forms/GameControl.cs b/CDSAE3_Lian_Lian_Kan/Forms/GameControl.cs index 07bb3cf..637acea 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/GameControl.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/GameControl.cs @@ -24,27 +24,26 @@ namespace CDSAE3_Lian_Lian_Kan.Forms public GameControl() { InitializeComponent(); - board.make_board(); - Settings.game_form = this; - playPanel_set(); - iGameMode = Settings.game_mode_form; + + Etcs.game_form = this; + playPanel_set(board.make_board()); + iGameMode = Etcs.game_mode_form; } - void playPanel_set() + void playPanel_set(int[,]bd) { - int[,] bd = board.Bd; playPanel_size_change(); for (int i = 0; i < playPanel.RowCount; i++) for (int j = 0; j < playPanel.ColumnCount; j++) { if (bd[i, j] == -1) { - var x = new Single_Block(Settings.trans_Image, (j, i)); + var x = new Single_Block(Etcs.trans_Image, (j, i)); x.Dock = DockStyle.Fill; playPanel.Controls.Add(x, j, i); } else { - var x = new Single_Block(bd[i, j], Settings.def_Color, Settings.sel_Color, (j, i)); + var x = new Single_Block(bd[i, j], Etcs.def_Color, Etcs.sel_Color, (j, i)); x.Dock = DockStyle.Fill; playPanel.Controls.Add(x, j, i); } @@ -56,18 +55,18 @@ namespace CDSAE3_Lian_Lian_Kan.Forms /// 起始点 /// 终点 /// - Settings.Direction get_Direction((int, int) from, (int, int) to) //x,y + Etcs.Direction get_Direction((int, int) from, (int, int) to) //x,y { if (from.Item1 == to.Item1) if (from.Item2 > to.Item2) - return Settings.Direction.up; + return Etcs.Direction.up; else - return Settings.Direction.down; + return Etcs.Direction.down; else if (from.Item1 > to.Item1) - return Settings.Direction.left; + return Etcs.Direction.left; else - return Settings.Direction.right; + return Etcs.Direction.right; } /// /// 设置单个点方向 @@ -77,7 +76,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms /// /// /// - async Task set_PathAsync((int, int) point, Settings.Direction direction, List blocks, int wait_time,bool is_hint) + async Task set_PathAsync((int, int) point, Etcs.Direction direction, List blocks, int wait_time,bool is_hint) { if (wait_time != 0) @@ -92,31 +91,31 @@ namespace CDSAE3_Lian_Lian_Kan.Forms blocks.Add(single_Block); } } - async Task to_path((int, int) from, (int, int) to, bool include_end, Settings.Direction extra_Direction, List 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 blocks, int wait_time, bool is_hint) { var direction = get_Direction(from, to); switch (direction) { - case Settings.Direction.up: + case Etcs.Direction.up: for (int i = from.Item2 - 1; i != to.Item2; i--) - await set_PathAsync((from.Item1, i), Settings.Direction.up_down, blocks, wait_time,is_hint); + await set_PathAsync((from.Item1, i), Etcs.Direction.up_down, blocks, wait_time,is_hint); break; - case Settings.Direction.down: + case Etcs.Direction.down: for (int i = from.Item2 + 1; i != to.Item2; i++) - await set_PathAsync((from.Item1, i), Settings.Direction.up_down, blocks, wait_time,is_hint); + await set_PathAsync((from.Item1, i), Etcs.Direction.up_down, blocks, wait_time,is_hint); break; - case Settings.Direction.right: + case Etcs.Direction.right: for (int i = from.Item1 + 1; i != to.Item1; i++) - await set_PathAsync((i, from.Item2), Settings.Direction.left_right, blocks, wait_time,is_hint); + await set_PathAsync((i, from.Item2), Etcs.Direction.left_right, blocks, wait_time,is_hint); break; - case Settings.Direction.left: + case Etcs.Direction.left: for (int i = from.Item1 - 1; i != to.Item1; i--) - await set_PathAsync((i, from.Item2), Settings.Direction.left_right, blocks, wait_time,is_hint); + await set_PathAsync((i, from.Item2), Etcs.Direction.left_right, blocks, wait_time,is_hint); break; } if (include_end) { - direction = ((int)direction & 3) > 0 ? (Settings.Direction)((int)direction << 2) : (Settings.Direction)((int)direction >> 2); + direction = ((int)direction & 3) > 0 ? (Etcs.Direction)((int)direction << 2) : (Etcs.Direction)((int)direction >> 2); direction = direction | extra_Direction; await set_PathAsync(to, direction, blocks, wait_time,is_hint); } @@ -126,18 +125,18 @@ namespace CDSAE3_Lian_Lian_Kan.Forms switch (path.Count) { case 2: - await to_path(path[0], path[1], false, Settings.Direction.none, blocks, wait_time,is_hint); + await to_path(path[0], path[1], false, Etcs.Direction.none, blocks, wait_time,is_hint); break; case 3: var extra_direction = get_Direction(path[1], path[2]); await to_path(path[0], path[1], true, extra_direction, blocks, wait_time,is_hint); - await to_path(path[1], path[2], false, Settings.Direction.none, blocks, wait_time,is_hint); + await to_path(path[1], path[2], false, Etcs.Direction.none, blocks, wait_time,is_hint); break; case 4: - Settings.Direction extra_directionA = get_Direction(path[1], path[2]), extra_directionB = get_Direction(path[2], path[3]); + Etcs.Direction extra_directionA = get_Direction(path[1], path[2]), extra_directionB = get_Direction(path[2], path[3]); await to_path(path[0], path[1], true, extra_directionA, blocks, wait_time,is_hint); await to_path(path[1], path[2], true, extra_directionB, blocks, wait_time,is_hint); - await to_path(path[2], path[3], false, Settings.Direction.none, blocks, wait_time,is_hint); + await to_path(path[2], path[3], false, Etcs.Direction.none, blocks, wait_time,is_hint); break; } @@ -225,6 +224,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms return; 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); + 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) { single_BlockA.destroyAsync(); @@ -250,8 +250,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms } public void Exchange_Handler(object? sender, EventArgs e) { - board.remake_board(); - int[,] bd = board.Bd; + int[,] bd = board.remake_board(); for (int i = 0; i < bd.GetLength(0); i++) for (int j = 0; j < bd.GetLength(1); j++) if (bd[i, j] == -1) diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.Designer.cs index b914374..5c64879 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.Designer.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.Designer.cs @@ -39,6 +39,7 @@ sp_button = new PictureBox(); search = new PictureBox(); exchange = new PictureBox(); + search_time = new Label(); game_Panel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)back).BeginInit(); ((System.ComponentModel.ISupportInitialize)sp_button).BeginInit(); @@ -164,12 +165,25 @@ exchange.TabStop = false; exchange.Click += exchange_Click; // + // search_time + // + search_time.AutoSize = true; + search_time.BackColor = Color.FromArgb(249, 211, 171); + search_time.Font = new Font("Microsoft YaHei UI", 10F); + search_time.Location = new Point(413, 18); + search_time.Name = "search_time"; + search_time.Size = new Size(36, 27); + search_time.TabIndex = 11; + search_time.Text = "00"; + search_time.Visible = false; + // // Leisure_Mode // AutoScaleDimensions = new SizeF(11F, 24F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.FromArgb(249, 211, 171); ClientSize = new Size(1439, 960); + Controls.Add(search_time); Controls.Add(exchange); Controls.Add(search); Controls.Add(sp_button); @@ -205,5 +219,6 @@ private PictureBox search; private PictureBox exchange; private GameControl gameControl; + private Label search_time; } } \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.cs b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.cs index 5c569b2..ec7f1f4 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode.cs @@ -15,7 +15,7 @@ namespace CDSAE3_Lian_Lian_Kan.Forms { public Leisure_Mode() { - Settings.game_mode_form = this; + Etcs.game_mode_form = this; InitializeComponent(); timer = new System.Timers.Timer(); timer.Enabled = false; @@ -24,14 +24,14 @@ namespace CDSAE3_Lian_Lian_Kan.Forms time.Text = (left_time / 60).ToString().PadLeft(2, '0') + ":" + (left_time % 60).ToString().PadLeft(2, '0'); } System.Timers.Timer timer; - int left_time = Settings.left_time; + int left_time = Etcs.left_time; bool is_pause = true; int cur_score = 0; int factor_val = 1; int current_base = 0; int search_left_time = 0; bool search_mode = false; - Dictionary decrease_per_level = Settings.decrease_per_level; + Dictionary decrease_per_level = Etcs.decrease_per_level; private void Timer_Tick(object? sender, EventArgs e) { @@ -42,9 +42,11 @@ namespace CDSAE3_Lian_Lian_Kan.Forms search_left_time--; if (search_left_time < 0) { + BeginInvoke(() => search_time.Visible = false); search_mode = false; gameControl.Search_Handler(this, new SearchEventArgs { set_search = false }); } + BeginInvoke(() => search_time.Text = search_left_time.ToString().PadLeft(2, '0')); } if (current_base <= 0) { @@ -129,10 +131,10 @@ namespace CDSAE3_Lian_Lian_Kan.Forms private void back_Click(object sender, EventArgs e) { - Close(); Dispose(); + Close(); timer.Close(); - Settings.form?.change_form(new Leisure_Mode_MenuForm()); + Etcs.form?.change_form(new Leisure_Mode_MenuForm()); } private void exchange_Click(object sender, EventArgs e) @@ -144,7 +146,9 @@ namespace CDSAE3_Lian_Lian_Kan.Forms { gameControl.Search_Handler(this, new SearchEventArgs { set_search = true}); search_mode = true; - search_left_time = Settings.search_left_time; + search_left_time = Etcs.search_left_time; + search_time.Text = search_left_time.ToString().PadLeft(2, '0'); + search_time.Visible = true; } } } diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode_MenuForm.cs b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode_MenuForm.cs index 38677b0..28f2f7f 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode_MenuForm.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/Leisure_Mode_MenuForm.cs @@ -15,13 +15,13 @@ namespace CDSAE3_Lian_Lian_Kan.Forms public Leisure_Mode_MenuForm() { InitializeComponent(); - Settings.audio_Processer.next_song(); - Settings.audio_Processer.resume_song(); + Etcs.song_Audio_Processer.set_albums("C418"); + Etcs.song_Audio_Processer.set_song(Etcs.song_Audio_Processer.get_next_song()); } private void start_Game_Click(object sender, EventArgs e) { - Settings.form?.change_form(new Leisure_Mode()); + Etcs.form?.change_form(new Leisure_Mode()); } } } diff --git a/CDSAE3_Lian_Lian_Kan/Forms/MainForm.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/MainForm.Designer.cs index 6e3a2c9..eb856b3 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/MainForm.Designer.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/MainForm.Designer.cs @@ -46,6 +46,7 @@ AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1440, 960); Controls.Add(MainPanel); + DoubleBuffered = true; MaximumSize = new Size(1462, 1016); MinimumSize = new Size(1462, 1016); Name = "LianLianKan"; diff --git a/CDSAE3_Lian_Lian_Kan/Forms/MainForm.cs b/CDSAE3_Lian_Lian_Kan/Forms/MainForm.cs index e9344fe..3773e35 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/MainForm.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/MainForm.cs @@ -9,7 +9,7 @@ namespace CDSAE3_Lian_Lian_Kan InitializeComponent(); current_form = this; change_form(new Leisure_Mode_MenuForm()); - Settings.form = this; + Etcs.form = this; } Form current_form; public void change_form(Form form) @@ -21,8 +21,8 @@ namespace CDSAE3_Lian_Lian_Kan form.TopLevel = false; form.Dock = DockStyle.Fill; MainPanel.Controls.Add(form); - GC.Collect(); form.Show(); + GC.Collect(); } } } diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.Designer.cs b/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.Designer.cs index 54cbae8..babd49f 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.Designer.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.Designer.cs @@ -42,6 +42,8 @@ picture.TabIndex = 0; picture.TabStop = false; picture.Click += picture_Click; + picture.MouseEnter += picture_MouseEnter; + picture.MouseLeave += picture_MouseLeave; // // Single_Block // diff --git a/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.cs b/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.cs index f8c3400..e13816d 100644 --- a/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.cs +++ b/CDSAE3_Lian_Lian_Kan/Forms/Single_Block.cs @@ -17,24 +17,24 @@ namespace CDSAE3_Lian_Lian_Kan public Single_Block() { InitializeComponent(); - if (Settings.game_form == null) + if (Etcs.game_form == null) throw new Exception("game_form is null but try to make a new Single_Block"); - Selected += Settings.game_form.Selected_Handler; + Selected += Etcs.game_form.Selected_Handler; } public Single_Block(int image, Color default_backColor, Color select_Color, (int, int) pos) { block_id = image; position = pos; InitializeComponent(); - Image_change(Settings.get_block_Image(image)); + Image_change(Etcs.get_block_Image(image)); picture.SizeMode = PictureBoxSizeMode.Zoom; nor_color = default_backColor; sel_color = select_Color; BackColor = default_backColor; picture.BackColor = default_backColor; - if (Settings.game_form == null) + if (Etcs.game_form == null) throw new Exception("game_form is null but try to make a new Single_Block"); - Selected += Settings.game_form.Selected_Handler; + Selected += Etcs.game_form.Selected_Handler; } public Single_Block(Image image, (int, int) pos) @@ -44,13 +44,16 @@ namespace CDSAE3_Lian_Lian_Kan picture.SizeMode = PictureBoxSizeMode.Zoom; BackColor = Color.FromArgb(0, 0, 0, 0); can_be_selected = false; - if (Settings.game_form == null) + if (Etcs.game_form == null) throw new Exception("game_form is null but try to make a new Single_Block"); - Selected += Settings.game_form.Selected_Handler; + Selected += Etcs.game_form.Selected_Handler; + + } int block_id; Color nor_color; Color sel_color; + Color mouse_upper_color = Etcs.mouse_upper_color; public bool selected { get; set; } = false; bool can_be_selected = true; public (int, int) position { get; set; }//height,width @@ -79,26 +82,26 @@ namespace CDSAE3_Lian_Lian_Kan selected = false; BackColor = nor_color; } - Settings.Direction direction = Settings.Direction.none; - public void hint_path(Settings.Direction direction) + Etcs.Direction direction = Etcs.Direction.none; + public void hint_path(Etcs.Direction direction) { this.direction |= direction; - Image_change(Settings.get_tip_direction_Image(this.direction)); + Image_change(Etcs.get_tip_direction_Image(this.direction)); } - public void to_path(Settings.Direction direction) + public void to_path(Etcs.Direction direction) { - Image_change(Settings.get_direction_Image(direction)); - direction = Settings.Direction.none; + Image_change(Etcs.get_direction_Image(direction)); + direction = Etcs.Direction.none; } public void de_path() { - Image_change(Settings.trans_Image); - direction = Settings.Direction.none; + Image_change(Etcs.trans_Image); + direction = Etcs.Direction.none; } System.Timers.Timer? timer = null; public void destroyAsync() { - Image_change(Settings.get_disappear_Images(block_id)); + Image_change(Etcs.get_disappear_Images(block_id)); BackColor = Color.FromArgb(0, 0, 0, 0); can_be_selected = false; timer = new System.Timers.Timer(); @@ -110,20 +113,24 @@ namespace CDSAE3_Lian_Lian_Kan public void Image_Clear(object? sender, ElapsedEventArgs e) { timer?.Stop(); - Image_change(Settings.trans_Image); + Image_change(Etcs.trans_Image); } public void Image_change(Image new_image) + { + + } + private void Image_set(Image image) { try { lock (locker) { - picture.Image = new_image; + picture.Image = image; } } - catch(Exception) + catch (Exception) { - Image_change(new_image); + Image_change(image); } } public void Re_create(int image, Color? default_backColor, Color? select_Color, (int, int)? pos) @@ -131,14 +138,29 @@ namespace CDSAE3_Lian_Lian_Kan if (block_id == image) return; block_id = image; - Image_change(Settings.get_block_Image(image)); + Image_change(Etcs.get_block_Image(image)); if (default_backColor != null) nor_color = (Color)default_backColor; - if(select_Color != null) + if (select_Color != null) sel_color = (Color)select_Color; if (pos != null) position = ((int, int))pos; } + + private void picture_MouseEnter(object sender, EventArgs e) + { + if(!can_be_selected || selected) + return; + BackColor = mouse_upper_color; + } + + private void picture_MouseLeave(object sender, EventArgs e) + { + if (!can_be_selected || selected) + return; + BackColor = nor_color; + } + public event SelectedEventHandler Selected; } public class SelectedEventArgs : EventArgs diff --git a/CDSAE3_Lian_Lian_Kan/Properties/Resources.Designer.cs b/CDSAE3_Lian_Lian_Kan/Properties/Resources.Designer.cs index 61578d7..f51f194 100644 --- a/CDSAE3_Lian_Lian_Kan/Properties/Resources.Designer.cs +++ b/CDSAE3_Lian_Lian_Kan/Properties/Resources.Designer.cs @@ -90,6 +90,86 @@ namespace CDSAE3_Lian_Lian_Kan.Properties { } } + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA1 { + get { + object obj = ResourceManager.GetObject("breakA1", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA2 { + get { + object obj = ResourceManager.GetObject("breakA2", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA3 { + get { + object obj = ResourceManager.GetObject("breakA3", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA4 { + get { + object obj = ResourceManager.GetObject("breakA4", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA5 { + get { + object obj = ResourceManager.GetObject("breakA5", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA6 { + get { + object obj = ResourceManager.GetObject("breakA6", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA7 { + get { + object obj = ResourceManager.GetObject("breakA7", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] breakA8 { + get { + object obj = ResourceManager.GetObject("breakA8", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// 查找 System.Byte[] 类型的本地化资源。 /// diff --git a/CDSAE3_Lian_Lian_Kan/Properties/Resources.resx b/CDSAE3_Lian_Lian_Kan/Properties/Resources.resx index 025799b..0469aca 100644 --- a/CDSAE3_Lian_Lian_Kan/Properties/Resources.resx +++ b/CDSAE3_Lian_Lian_Kan/Properties/Resources.resx @@ -307,4 +307,28 @@ ..\Resources\next.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\breakA1.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA2.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA3.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA4.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA5.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA6.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA7.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\breakA8.mp3;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA1.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b1aecdac99fd36142629713c7234a0765083e058 GIT binary patch literal 6222 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 bqYEwYPobM!r6bpy3djz?|7#@tuT=d9Dh6SY literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA2.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ab8414bc372eec1b5c876982374a9cd6dff43001 GIT binary patch literal 5620 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 OU<`320Q7$w{J#NB$2uwi literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA3.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1949636c245953dab2f69b170b5ebf39a3025a6b GIT binary patch literal 7082 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 literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA4.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..10d7ffb0dae73b52ff72c22e578379a686df3b1a GIT binary patch literal 7658 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 literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA5.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a9c530a1df63aa34b4f526fccb0c82280c873c14 GIT binary patch literal 7136 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 Mxc_yd|DnSF01p5I%>V!Z literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA6.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..268496dbf4a2467351a00594f7a5a27353a6fff3 GIT binary patch literal 6977 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 SeXNts1};+*le^bPasa^5bMSYT zk`s}T5fK*?`+fIc&DDj`f9d`ArxvbWF4uRihXH5+fDr-Qx(0+n9fK(b$7>#92*Hqu zA?KPh42>AxVt9AWD28ba3m8_f*~V~);U|WxYcQ5v+w630v!o2B^A~PBrGK3=B4P(_ zdj7rq_jq+N3IPDD3_Rl;Zh#N~NZIoMEDpcaJ3odoKLLeaH!y1GDS(X|9n&SIXTD5F zj+7;Ico7mFdU7QDRO9&%O}h6!30FM?%D?WfOFWeO8QIN7a{Uz1=ygMhALA*F)Uj}_ zr<_I*P$P1ePF*u=`xA>B^jSws{cH+OOef+=g)1v;a!M)SehH%wSI&=Skpobb4@cZV>ENSJ z-~9K7GcQ{avj^Y%Kp>xY7SGmoxHRdaJHM9c@{E-Z4msQ z;9LOJ6rNFN*St1(yq3q=&UFepA7FW^#ZL6XDS=|;MR;f}ySlDQzyk`|4Z?UPg?9Mt0 zzkEoyAl!S)%~SZi2dSVj9B8PLr!iyVTEyb@P-Tnn`|*SjGd(2Vs1wjJ(V%aDI}|eu zkl=+BGc6=gtv$(Op8Jq0$ax%|YUWqhHCTCjB*^%f`VtL_36Q}PNVKid;XA5Zhs<~U z@Cb1c6691g^0U#!?u2Puajzzm%mh9c(HD(h#^2fr)U2Pwy*L#4)jAks;tR6r`*+T#iIA(FN(vPPvYTo%iAnjc6#5e^!ig zFW$em>E}vo$3^#{wBvbFi&~cdQLrZw?1rnXb_tR>83o#5_7Ajvq|A!+TbRpz15RR{ zymNH{ha3W@QdW~!4gfJGgjN77y0aX$O2zo?>kxti0B)1b*C?6K15bY`R!RE~EWS#e ztr}se4BB4)seKv512g-f#%LT39~80-&YhN)E`!hms~e)*;dkB|(Av^F)2+5&w7}v@uU_Y zmtcNt^EE%hdA;`CcMg?@hO~4WX|p78wJVct)W^_$TE-Gtd5LZo;k{1U(&jEMlDDc_ zIaxj;yHQ09(BAUNgWbtVX+0r5spcqD8f$rP0=UQ$f3 zcMx3s?04T4}5gpst6uEH4=M#l$)Z^7rbEDoCYKY+}&w_XN)5F_?=_M!{UmDCfL9rz=*X-XQq8pt|#ylOn`UXdZybFCzinB-{g z=+h(xP^*i+Q9 zlTf9Lc~A8TaCoPq<(oSO2>M$931i%SAPKHuKF+Q*l3J+D=Sr`$QxsQf&0(W6+;4mY zjusP^VM_s%#!>Q@hjE^pSXqYhT;7ss|6VaEuiNg!U45TQ+Bs4q;M*^n_|p%XAe2FD z9@g+3tYh-xB(^Iz6|xW0B6`)(X}REV>Si7l_{^kEYd{WGnH;NmtHD&{phiBe5RI5r z$>NQ4d_y86AQp{Il6;<3qF`%Asn3I`lVB(VwDbQVhIKv0rKvL`;bj@j<~idhPEt+V zwGF}NVAhwJ)VHRPBJNYoDvv;M6h>R}d=I5VR2RN;hD zbGxNgeof`bs5~(=J}q!d@f{+VK=f<`h?;-8yG2HvXq#aNCFx`GT0T*r#yIE@K7)@y9_luQS9e#K!(QNMUBsRH-%0{nO|HwvJ21Fo7(1L4yvmM!HmCF^cR{G9h>)YzQvQIvRSk(yAk^Nn#z>x~!L z8=NZ&6zta|HMNt6cj~1Fh8oJ^Y~;Z*v|=_@yu-0w;%N{hx;GWjN0nDOg6Zi`bt6y4 zb(U>P3{=0=@mwm$cOB2}jmk|~#apN1(6y`8vV*OL2z!98&ZPKxyVq^4pk-|ls~?C% zTCopdnz6=Dnv=28>ssthwFimrMjr8yeK8>qn?R1LNZl?w5-4&X-Oqc)}%t1IB_HDu`1e?|~3X_jb3 z%~(kyHAwR9-#_UgNO> zMT~m*Nk#%SgA&zPo510q#1u0L#E}nmhNMqeDUtZ%GP)-okph4CoiU_r`-W-ye&$fb z0Q?t^_!Fu*AvPSUm1#Ho7dEW1_|d=oEX?|w?7KnT6}ZJIq# z>Cwn+{qk;S(||`@S)pkxRRoP5TmBd%10CBx%dvTMy1^97I{mpE7O`ija=dQIPwXF} zXY@`q@`GWZLNJs+jxM#I_T8*C4d@x}v~`{2 zlAo=B2kJk25;=a9Y7Ks*wA*NA8Zi8udr)gpV=( z_3${2W8FHz7D$t_DK?shC}qywT<)a!riYm5Sq!j{l0|j?aiqhN_#S9QEdewc9V%=d zx5XJqEDZ9mFXfUHHcwJiY`?tKEfwytnOUYGqd1JR(m*}zsM{)^+Bn|%RvrAkl_*K zH$TtT1@1zpusMQKJTlxoxKGL3Ry?VE93g6KGorgCXllntw%bD*kyz?U*zhBcRU|gr zl$#v_-3wjsG!mLsiY|DCH)8Zwg7h}8U_muW5~B+lB@WhBrXRWtq8)GJpYdVdxKJXc z+|;~*4`bfIUt1!K4dPoqDZJJ!@#=ZNpH!5;F#)Y3sGn|?_P>nTIT~!IW?OF=eKIT!bTNAIHHvtx2UMJ zEOG3IIm={Ga!ra%a@*^X5^r@7euRVvv*RPd%U02Zb(}RrxnoF}j*6~!)PgVHQ1Aqa z`uP+lU7Z7G{!pzwS#9v22%@El<)|#2`RkxfXLFwV?QX`sIBT|J_GJ8Up1#D(Ji@e= zjOZXgk0iofM1>9|d^aRUqKD3O!lF~}vGWveEp7HkuA#-RI&;Nqq;dmz%*|1_p(s*( z@*2S|4xc+luzbJ>8#hhkcwJpENyx%8gos3Qqb6FOzU%fr$4pM<_CzM_sE>e?QKvds zcgT|gKFHEV9Q9~ah|z5#pob*zrL+)B#^_*5T3Jc9UWd8#t2g&kGb~hXJYFe#oq&Cm zpPDcis2Iy#5IzoY4tIyRf(!@=)}t(;lvu7vdV`4cyeg)GV`5uy&)D6-8CKLt^C02 zzMuW+eXEtO7JZeE#WCMKTE;RyP@C7Jg9kO;BRW>mG%~RS{nqjVNPhjy_2LbOe1@MH z*$!L?f&Pk3z3RfVUpTS-CmOsYB_rcs85ZetLU;QhYIjZ;N0ydyRzJE|AVM1=Oqm0h z?5LVaAW-Es{)gq$&MvRI5DzoM^kf7+tL z&Wao*p)d36@ZM^V@ki;{M2Ew*;8Z-(cr1A0{JNb&s4yXto^b}RjFA5QG3Cfwmk4!N z^$#4y^IuB`nXD3*MD;q1LH0#?)KTIU&fmG8%Vce3-(KV3Vf3TXa&Zm_@O`8xQ)Xf2JqJsnTJDhwcYLFUAbe_Dl2jR3VJuNRm%esYzp;Y<29txb zSzY$6jM}#LDgW_7@Oh)nMB~?>*X{v1`n27%#n>xt-@U$J#NLIU9y@4W=-pNMGqZ2@ zTC(lejQm}Q&#vCjE`sMEwe>3U1d~X&sdjhp{eQaAnaCOv{huiV98!LKMY$ZV=)2xv zNRq0S2Hj&>P8P0cVsFSGnvV#P#;Bt66|w#9kRy{u+{#?9RahwV?v}tmwAxJ)F$B}~ z#QBR`<86m(U!Lxn3b21X7MhALXyGzr5+o}0k(@H%M7nI*KK$n&7s->L8t%D*<=kL_ zsJDgF3*|7lH=)wwZ&`IHre$-Hc|>Icd!!(eoTkFqw3=z_X`VaO!+Igbw*dz`##$VS zyAd6C8mBs=6EXRVzGS)?YP9j`UDLrME04hT+MN-pWDfWJWy)!7`VFn#;BNyI$drP^xxN*@(+Y^zDHK2Pb&$|ZO)}Ehm zp$e+Jp;uUz{E&>ICTb!L#9(SPzLE4YP{gHP4-9Wh$N>j=0 z`&aBakm~#bw(k^d@8x13O_nwJTYUzLiJ$&5VUyo>^#ffWyBsA}Zzv8W{_yiTpc3MI zEJ4G`K`y*aZ&c=zFJ5GoJ}z^wUPCJ3>V64mGGVA324JnpnHMebxW&q4Ag&;-BXr-| z>Zar=nuQjGXw=sa5X4$G-l-??;O(dUPxsHEYOR!`eyi%5k=gxo=iDpHRqZ5{;(-bHVtsnD+32o@uj zvCuoS`4`4?4iv&B4C7X+qs^KT7~wYHr%IZ=?uL@ye`YD!&u=sp865CGDM12&HnbTm z@0#YkabvR^JLgMnvZ}y;FRcZLTMsWewETLW(jw5R#;ZFa-LEg;@LJ;It)}fdRPngq z8L3nU%GK$c(x$s+lc87aS!>_blxk|Uc6qA`#g@5nnxo)S%8P_rlE+QS1dmR2RAG6L zn=osmRjjG-#MrR@dN!j862y)!i(TK%#^RmIrpI5NYyNsucXcUIA^dUd!MK;^@WIdK zAhfZn6juW)RVYNWV2rBV;YA+%&M|fYL2S!d!Q!K_+%I$GZ*m`e*=dtMr+)Kl9MFbp zAOK)+Rc{cnVi3skoE%!V$~{UP? z!cY0vCJvdLV52l}T`9aS3mn^u_3pYd+5Zua_!!|4?T0wes^yhSb%$!0m$1I`aStCua;7IRmR&`=sy=V@uiW z!aYVWZGB=;#DgKSsIBE#U9TcYslh*K`dlrdo!8>j2*=tR5G-zmnXAnBV-T zqW#r{7~~WrX$6Rr+GCW{^0O?yW7{I6Dh4U))+?8-9^eTPc3W z;A>kEt?rK3>~J(Y)(!J@%bYuqP|m{@`aEX|zI^L0UlI!Fwgl~!=GA1p>D7e_0Gvn<|= zmo&6esv@lw68ON&x^Kt8@}BY3SUsOgY^a`De-1vd{XW^o=ZqE}N$5FV*WvcwZmp4~ z)k{uR5c(9=6MuEV4!H!5)|u2svBdv|7QXBoy1Y2Uzlu5lKG+S&*WZkt^{28rpu&|h zk}PenH-kP9;@@DFCFEAp3$@~^e1iyKZJn*LPBVf67RnZhqH^y6o<-QPZiAC(C7jPkOu|Mh9RH7R?Ty~-cm`re#9 zHHmy#pxNAG9( zQGWp(f0pZYSEc{!Q!?*vnySM7&OeG`2Iv9*d%)i{|NpNICjD;%ILi*|2M>X3e(w)Z y(6{mYSj2RH?+^Tcwf+CpuB!_Q$a3N#DWFOK{JScA{hy=oS~d1R6XAcu!2bXR=8!!A literal 0 HcmV?d00001 diff --git a/CDSAE3_Lian_Lian_Kan/Resources/breakA8.mp3 b/CDSAE3_Lian_Lian_Kan/Resources/breakA8.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c67e371718dffd995061e70848bdbe3ee72912de GIT binary patch literal 6351 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 z zXIE{UTi8wJkepghXM8i4L4(Q}$@nX5cCno9a4z=(BwkQF-UxLNIWW*`z`)3jo^vR& z5@qs#grTfEFI?X%*yaCtQRG$qgTeY50C~gQGgX62Rl6*~d%){rvdv=puybb?;cMLp zLGsb2hoSm=x4RdXrz@gE__-@*1{XG)(*n6kIw&a)tEw?ZOE7X>)=ARNBc9w&{y^?& zY&bz4n(~YX#VH6oCWJvM%u2^6`|*KSZ3aB+L_IXxM(ryHC!loFU*Vx2^E>P^uAK_$ zTBRNm+zyC4Tquk$9{W48xj{R|K z(0efS?}^d-)`6ylsr*;Ij0?hLe9z2YEPOc^SfVtJF1{B|bi8w|cH=BQG*v>o$x%)$ z2@x$h*gf5kM=uKG52fQWbC3oId*#@hlX8wvr|lO>()g~A4WtW03Ab&j2iDGZMT0{C zlLYG|;voz^#EC=xku|UXL19EDy^%aQB}U2bNU6w77Nm=5mz5QAOe0dJ-AWd*9-%hO{h%thhKPsW`EQ zYN=z6O0DEI68?zRbWY4R63|M&hf=?~6cq5W{12zpaaVy(6BAS4upU5kosQ#-kV74& z(0$mmIQ!N!{QFK->H|KHs(mwZUJ0~fpY+~m()96VpCm+hfw8shvwKluE!@)jLJZL& z;}x&V(E8qN@rX`rEvB_vZpUG9Bd_CYIQ0h$-3gmEfQ6Xd8QKXSTdYw?$9o#oEnx-O zSQw32Tl+?eDyqe@G?+f*cCtEHra_*Cb(Mz(9aK4u(fSW=8^kS7wSM!SQ^aEtz$OtK zFn|^p|5WeBG3t+3GAd3}3^~ymM(6X8Rw~fA_w^sp%MXoW_>E6<@h||4-Sia}Fle@( za^3v=bMw^MTPX|FhNX$7mf26H5z@8o69D+uwYw=>`?i`qWz(ZQdOZeo?5@!6C?@M^ zA4Yy{-8^tKJpCiznTFODAO+M-2^YY=G$LUXloRWVjTO0nNM;qr;f^ zns8%gc8#<7TW5!6*QjjgRU=7X;x^ka*vjjav~vXYuj_AO7W+Nk{*)%>2P$f(HO!W%%8(Y55V)zpcT# z{K;!y)!R3No+I)vfPV>xet5&36Ta8XrDEm>`B8`TW$l z`lAX!=T*c4>=*hqu0MMzE!XgAUMf!3!Z19H3KkEWrYIVlH*8Z6QEmrxU!KGI2BE_L z?FH314rt=J?qe@huu#auI4Q&Bca@CKO3KU>Yb-72&S}ViR!jy2qyuxv;>be=29IfNbmQuYBip`3eAy7}!_qK#z0Cmyx&Br( zNza@xm-u?T!4)+1)R|{>xU+r2pKv%L<##Z;oxW8l~+}T&Z7@OZwiDTqcBS#n;5VnMM^eI$v(i z$bHQZx19|^67FjJoe@c^&?vXB#4q>6^v$8dz;D~MGdQ3Cfi_en(q5IJ=WkKAy#h6M z6{+%CWyO~kYP^Wo(5*dy!)q8bNNeRzxMv?MjW?n>NjpTO`N=M~H;?2z|B(K>E>d60 zglM@+*+p!Pz)gx!2Ba^Ij61Z5x7J!j>=``#*VN_qhZZJmB23ZAIv`etWluy4f}uT6 zTVJ~gEVM*Dgt{FPw_vCAP;`*-W7|N3fm~>iH_fhJwq0CmnX51qPiliFanh~FKXjjO zC~aSjhw(2V7apgxHcQT!ol!jr(?{=Q{k)-<0nQHmWu~mlA8j72jx?08* z*!391=p7$IC%~LXdFLyzfj(um_|BoYJyCW~Bgbot=s-uFzJ$X9_x^Dz3@lVAqM+AybX ze_}c<|Fr_lV8I(~(9e4jowvNC>7flle0poAVbZ0B*t@q)CITY8vtzv(Q84nmqhj(6 z*pAkC>Z^zSe7qj^+%G(}WdGmm5&h|rU$(ZhI<)Ndl-`?1{M+}gxA|2hETS^45wo(6 zSsh9GbAKJBUBUu3*GY9PGZ;V^<>2f>UE+uTq`qXF3m9sjx-vyQ6n8}TPrptO6d%A= z44LSdVpNWr%GUqR|2^~XSN^BQNB`k=hzw~8gEzgQ;3E-e&0kULFLL|y+%!-9YX1JG ne(V4JbEt=$ZZA`4q2|p50KdehwFzm>D>6-K=? finished; + string file_name; + bool shutdown = false; + internal int volume { get; set; } + internal AudioPlayer(string file_name, int volume) + { + this.file_name = file_name; + this.volume = volume; + + file_name = file_name.Split('.').First().Replace(" ", "_").Replace("-", "_"); + source_obj = Etcs.res_Manager.GetObject(file_name, Etcs.res_Culture)!; + sound = new MemoryStream((byte[])source_obj); + ms = new MemoryStream(StreamToBytes(sound)); + ws = new Mp3FileReader(ms); + blockAlignReductionStream = new BlockAlignReductionStream(ws); + wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream); + wave16ToFloatProvider.Volume = volume / 100f; + waveOutEvent = new WaveOutEvent(); + waveOutEvent.Init(wave16ToFloatProvider); + waveOutEvent.PlaybackStopped += WaveOutEvent_PlaybackStopped; + } + internal AudioPlayer(string file_name, int volume, Action finished) + { + this.file_name = file_name; + this.volume = volume; + this.finished = finished; + + file_name = file_name.Split('.').First().Replace(" ", "_").Replace("-", "_"); + source_obj = Etcs.res_Manager.GetObject(file_name, Etcs.res_Culture)!; + sound = new MemoryStream((byte[])source_obj); + ms = new MemoryStream(StreamToBytes(sound)); + ws = new Mp3FileReader(ms); + blockAlignReductionStream = new BlockAlignReductionStream(ws); + wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream); + wave16ToFloatProvider.Volume = volume / 100f; + waveOutEvent = new WaveOutEvent(); + waveOutEvent.Init(wave16ToFloatProvider); + waveOutEvent.PlaybackStopped += WaveOutEvent_PlaybackStopped; + } + public void volume_change(int val) + { + volume = val; + wave16ToFloatProvider.Volume = volume / 100f; + } + public void pause_song() => waveOutEvent.Pause(); + public void resume_song() => waveOutEvent.Play(); + private void WaveOutEvent_PlaybackStopped(object? sender, StoppedEventArgs e) + { + if(shutdown) return; + finished?.Invoke(file_name,this); + Dispose(); + } + + ~AudioPlayer() + { + Dispose(); + } + + public void Dispose() + { + shutdown = true; + waveOutEvent.Stop(); + sound.Dispose(); + ms.Dispose(); + //ws.Dispose(); + //blockAlignReductionStream.Dispose(); + waveOutEvent.Dispose(); + } + internal static byte[] StreamToBytes(Stream stream) + { + long originalPosition = 0; + + if (stream.CanSeek) + { + originalPosition = stream.Position; + stream.Position = 0; + } + + try + { + byte[] readBuffer = new byte[4096]; + + int totalBytesRead = 0; + int bytesRead; + + while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) + { + totalBytesRead += bytesRead; + + if (totalBytesRead == readBuffer.Length) + { + int nextByte = stream.ReadByte(); + if (nextByte != -1) + { + byte[] temp = new byte[readBuffer.Length * 2]; + Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); + Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); + readBuffer = temp; + totalBytesRead++; + } + } + } + + byte[] buffer = readBuffer; + if (readBuffer.Length != totalBytesRead) + { + buffer = new byte[totalBytesRead]; + Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); + } + return buffer; + } + finally + { + if (stream.CanSeek) + { + stream.Position = originalPosition; + } + } + } + + } +} diff --git a/CDSAE3_Lian_Lian_Kan/Sound/Audio_processer.cs b/CDSAE3_Lian_Lian_Kan/Sound/Audio_processer.cs deleted file mode 100644 index d487cda..0000000 --- a/CDSAE3_Lian_Lian_Kan/Sound/Audio_processer.cs +++ /dev/null @@ -1,164 +0,0 @@ -using NAudio.Wave; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Resources; -using System.Text; -using System.Threading.Tasks; -using CDSAE3_Lian_Lian_Kan.Properties; -using NAudio.Wave.SampleProviders; -namespace CDSAE3_Lian_Lian_Kan.Sound -{ - public class Audio_processer - { - class Audio_File_Processor - { - private WaveChannel32? volumeStream; - private List audioFiles = new List(); - string base_path; - int next_song = 0; - int volume = 90; - public Audio_File_Processor() - { - base_path = AppDomain.CurrentDomain.BaseDirectory; - } - internal void set_Albums(string s)=>audioFiles = Settings.musics.TryGetValue(s, out List? val) ? val : new List(); - internal Wave16ToFloatProvider get_next_song() - { - volumeStream?.Close(); - string name = audioFiles[next_song]; - next_song++; - next_song %= audioFiles.Count; - name = name.Split('.').First().Replace(" ","_").Replace("-","_"); - object obj = Settings.res_Manager.GetObject(name, Settings.res_Culture)!; - MemoryStream sound = new MemoryStream((byte[])obj); - MemoryStream ms = new MemoryStream(StreamToBytes(sound)); - var ws = new Mp3FileReader(ms); - BlockAlignReductionStream blockAlignReductionStream = new BlockAlignReductionStream(ws); - Wave16ToFloatProvider wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream); - wave16ToFloatProvider.Volume = volume / 100f; - return wave16ToFloatProvider; - } - internal Wave16ToFloatProvider get_last_song() - { - next_song = (next_song - 2 + audioFiles.Count) % audioFiles.Count; - return get_next_song(); - } - internal void volume_change(int val) - { - volume = val; - if(volumeStream != null) - volumeStream.Volume = volume / 100f; - } - internal static byte[] StreamToBytes(Stream stream) - { - long originalPosition = 0; - - if (stream.CanSeek) - { - originalPosition = stream.Position; - stream.Position = 0; - } - - try - { - byte[] readBuffer = new byte[4096]; - - int totalBytesRead = 0; - int bytesRead; - - while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) - { - totalBytesRead += bytesRead; - - if (totalBytesRead == readBuffer.Length) - { - int nextByte = stream.ReadByte(); - if (nextByte != -1) - { - byte[] temp = new byte[readBuffer.Length * 2]; - Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); - Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); - readBuffer = temp; - totalBytesRead++; - } - } - } - - byte[] buffer = readBuffer; - if (readBuffer.Length != totalBytesRead) - { - buffer = new byte[totalBytesRead]; - Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); - } - return buffer; - } - finally - { - if (stream.CanSeek) - { - stream.Position = originalPosition; - } - } - } - ~Audio_File_Processor() - { - volumeStream?.Close(); - } - - } - private WaveOutEvent songOutputDevice; - private WaveOutEvent infoOutputDevice; - Audio_File_Processor audio_File_Processor = new Audio_File_Processor(); - public Audio_processer() - { - songOutputDevice = new WaveOutEvent(); - infoOutputDevice = new WaveOutEvent(); - set_albums(get_albums().First()); - } - private void OnPlaybackStopped(object? sender, StoppedEventArgs e) - { - next_song(); - resume_song(); - } - public void pause_song()=>songOutputDevice.Pause(); - public void resume_song()=>songOutputDevice.Play(); - public void last_song() - { - waveOutEvent_Provider(audio_File_Processor.get_last_song()); - } - public void next_song() - { - waveOutEvent_Provider(audio_File_Processor.get_next_song()); - } - /// - /// 切换音乐 - /// - /// - private void waveOutEvent_Provider(Wave16ToFloatProvider wave16ToFloatProvider) - { - - songOutputDevice.Stop(); - songOutputDevice.Dispose(); - songOutputDevice = new WaveOutEvent(); - songOutputDevice.Init(wave16ToFloatProvider); - songOutputDevice.PlaybackStopped += OnPlaybackStopped; - } - /// - /// 调整音乐音量 - /// - /// 音量大小 1-100 - public void volume_change(int val)=> audio_File_Processor.volume_change(val); - public List get_albums() => Settings.musics.Select(x => x.Key).ToList(); - public void set_albums(string s) - { - audio_File_Processor.set_Albums(s); - } - ~Audio_processer() - { - songOutputDevice.Dispose(); - infoOutputDevice.Dispose(); - } - } -} diff --git a/CDSAE3_Lian_Lian_Kan/Sound/Info_Audio_processer.cs b/CDSAE3_Lian_Lian_Kan/Sound/Info_Audio_processer.cs new file mode 100644 index 0000000..073b473 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Sound/Info_Audio_processer.cs @@ -0,0 +1,71 @@ +using NAudio.Wave; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace CDSAE3_Lian_Lian_Kan.Sound +{ + public class Info_Audio_processer + { + Etcs.break_music soundScape_version = Etcs.break_music.breakA; + public int soundScape_volume { get; set; } = 90; + string last_break_soundScape = ""; + Random random = new Random(); + class Info_file_processer + { } + + internal void set_SoundScape_version(Etcs.break_music version) => soundScape_version = version; + internal void play_random_break_soundScape() + { + Task.Run(() => + { + void finished(string s,AudioPlayer audioPlayer) + { + audioPlayer.Dispose(); + } + AudioPlayer audioPlayer = new AudioPlayer(get_random_break_soundScape(), soundScape_volume,finished); + 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(); + //} + }); + } + + private string get_random_break_soundScape() + { + string name; + for (; ; ) + { + name = soundScape_version switch + { + Etcs.break_music.breakA => "breakA" + (random.Next(1, 9)).ToString(), + Etcs.break_music.breakB => throw new NotImplementedException(), + _ => "breakA" + (random.Next(0, 9)).ToString() + }; + if (name != last_break_soundScape) + break; + } + return name; + //MemoryStream sound = new MemoryStream((byte[])obj); + //MemoryStream ms = new MemoryStream(StreamToBytes(sound)); + //var ws = new Mp3FileReader(ms); + //BlockAlignReductionStream blockAlignReductionStream = new BlockAlignReductionStream(ws); + //Wave16ToFloatProvider wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream); + //wave16ToFloatProvider.Volume = soundScape_volume / 100f; + //return wave16ToFloatProvider; + } + } +} diff --git a/CDSAE3_Lian_Lian_Kan/Sound/Song_Audio_processer.cs b/CDSAE3_Lian_Lian_Kan/Sound/Song_Audio_processer.cs new file mode 100644 index 0000000..6828a17 --- /dev/null +++ b/CDSAE3_Lian_Lian_Kan/Sound/Song_Audio_processer.cs @@ -0,0 +1,147 @@ +using NAudio.Wave; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Resources; +using System.Text; +using System.Threading.Tasks; +using CDSAE3_Lian_Lian_Kan.Properties; +using NAudio.Wave.SampleProviders; +namespace CDSAE3_Lian_Lian_Kan.Sound +{ + public class Song_Audio_processer:IDisposable + { + //class Audio_File_Processor + //{ + // private Wave16ToFloatProvider? wave16ToFloatProvider; + // private List audioFiles = new List(); + // int next_song = 0; + // int volume = 90; + // internal void set_Albums(string s)=>audioFiles = Settings.musics.TryGetValue(s, out List? val) ? val : new List(); + // internal Wave16ToFloatProvider get_next_song() + // { + // string name = audioFiles[next_song]; + // next_song++; + // next_song %= audioFiles.Count; + // name = name.Split('.').First().Replace(" ","_").Replace("-","_"); + // object obj = Settings.res_Manager.GetObject(name, Settings.res_Culture)!; + // MemoryStream sound = new MemoryStream((byte[])obj); + // MemoryStream ms = new MemoryStream(StreamToBytes(sound)); + // var ws = new Mp3FileReader(ms); + // BlockAlignReductionStream blockAlignReductionStream = new BlockAlignReductionStream(ws); + // wave16ToFloatProvider = new Wave16ToFloatProvider(blockAlignReductionStream); + // wave16ToFloatProvider.Volume = volume / 100f; + // return wave16ToFloatProvider; + // } + // internal Wave16ToFloatProvider get_last_song() + // { + // next_song = (next_song - 2 + audioFiles.Count) % audioFiles.Count; + // return get_next_song(); + // } + // internal void volume_change(int val) + // { + // volume = val; + // if(wave16ToFloatProvider != null) + // wave16ToFloatProvider.Volume = volume / 100f; + // } + // internal static byte[] StreamToBytes(Stream stream) + // { + // long originalPosition = 0; + + // if (stream.CanSeek) + // { + // originalPosition = stream.Position; + // stream.Position = 0; + // } + + // try + // { + // byte[] readBuffer = new byte[4096]; + + // int totalBytesRead = 0; + // int bytesRead; + + // while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) + // { + // totalBytesRead += bytesRead; + + // if (totalBytesRead == readBuffer.Length) + // { + // int nextByte = stream.ReadByte(); + // if (nextByte != -1) + // { + // byte[] temp = new byte[readBuffer.Length * 2]; + // Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); + // Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); + // readBuffer = temp; + // totalBytesRead++; + // } + // } + // } + + // byte[] buffer = readBuffer; + // if (readBuffer.Length != totalBytesRead) + // { + // buffer = new byte[totalBytesRead]; + // Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); + // } + // return buffer; + // } + // finally + // { + // if (stream.CanSeek) + // { + // stream.Position = originalPosition; + // } + // } + // } + + //} + AudioPlayer? audioPlayer; + private List audioFiles = new List(); + int next_song = 1; + private void OnPlaybackStopped(string s,object? obj) + { + set_song(get_next_song()); + } + public void pause_song()=> audioPlayer?.pause_song(); + public void resume_song()=> audioPlayer?.resume_song(); + public string get_next_song() + { + string name = audioFiles[next_song]; + next_song++; + next_song %= audioFiles.Count; + return name; + } + + /// + /// 调整音乐音量 + /// + /// 音量大小 1-100 + public void volume_change(int val)=> audioPlayer?.volume_change(val); + public void set_albums(string s) + { + var result = Etcs.musics.Where(x => x.Key == s).ToList(); + if (result.Count == 0) + throw new Exception("no such album"); + audioFiles = result.First().Value; + } + public void set_song(string s) + { + audioPlayer?.Dispose(); + try + { + audioPlayer = new AudioPlayer(s, Etcs.Song_Volume, OnPlaybackStopped); + } + catch (Exception e) + { + MessageBox.Show($"failed to play {s}\n{e.Message}"); + return; + } + audioPlayer.resume_song(); + } + public void Dispose()=> audioPlayer?.Dispose(); + ~Song_Audio_processer() => Dispose(); + } +}