292 lines
11 KiB
C#
292 lines
11 KiB
C#
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;
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|