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;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|