BillWoodruff
GameControl // основная форма проекта winform
Кнопка btnPlay;
Кнопка btnGetScore;
Текстовое поле tbxScoreReport;
Флажок checkBox1;
Флажок checkBox2;
1. поток управления: запуск приложения
a. экземпляр GameControl загружается при запуске приложения
a.1. создается экземпляр "геймплея", игры.
a.2 установлен обработчик событий для FormClosing Enent 'Game
a.2.a это проверяет, закрывается ли игра из-за закрытия приложения или из-за того, что пользователь закрыл эту форму: если приложение закрывается, то ничего не делается; если нет, то при наличии каких-либо игровых данных отчет об игровой статистике записывается в текстовое поле в основной форме.
b. при нажатии кнопки воспроизведения
b.1 Метод ConfigureGame 'Game вызывается для установки начальных параметров игры
b.2 кнопка воспроизведения отключена
б.Показано 3 игровой форме является
2. поток управления: показана игровая форма
a. создается новый экземпляр ScoreData, 'Data
b. показанный обработчик событий устанавливает время начала игры
c. установлен обработчик KeyDown, который закроется, если клавиши alt и q будут удерживаться нажатыми
c.1 когда игровая форма закроется, это вызовет событие FormClosing, определенное в экземпляре GameControl
d. кнопки btnAddPoints и btnAddPoints увеличивают и уменьшают счет
e. метод GetGameStatus вызывается только экземпляром GameControl
пример кода:
public partial class GameControl : Form
{
private static int gameCounter = 1;
private GamePlay Game;
public GameControl()
{
InitializeComponent();
}
private void GameProtoType_Load(object sender, EventArgs e)
{
Game = new GamePlay();
Game.Owner = this;
Game.FormClosing += GameOnFormClosing;
}
private void GameOnFormClosing(object sender, FormClosingEventArgs e)
{
if (Game.Data != null && e.CloseReason != CloseReason.FormOwnerClosing)
{
Game.Data.GameEnd = DateTime.Now;
tbxScoreReport.Text = Game.GetGameStatus();
btnPlay.BackColor = SystemColors.Control;
btnPlay.Enabled = true;
}
}
private void btnPlay_Click(object sender, EventArgs e)
{
tbxScoreReport.Clear();
Game.ConfigureGame(gameCounter++, "The Player", checkBox1.CheckState, checkBox2.CheckState);
btnPlay.BackColor = Color.Firebrick;
btnPlay.Enabled = false;
Game.Show();
}
private void btnGetScore_Click(object sender, EventArgs e)
{
if (Game.Data == null) return;
tbxScoreReport.Text = Game.GetGameStatus();
}
}
Геймплей // winform принадлежит компании 'GameControl
Текстовое поле tbxCurrentScore;
Кнопка btnAddPoints;
Кнопка btnSubPoints;
public partial class GamePlay : Form
{
public GamePlay()
{
InitializeComponent();
}
public ScoreData Data { set; get; }
public void ConfigureGame(int id, string plname = "", CheckState chk1 = CheckState.Unchecked,
CheckState chk2 = CheckState.Unchecked)
{
Data = new ScoreData(id, plname);
if (chk1 == CheckState.Checked)
{
// configure
}
if (chk2 == CheckState.Checked)
{
// configure
}
}
private void GamePlay_Shown(object sender, EventArgs e)
{
Data.GameStart = DateTime.Now;
}
private void btnAddPoints_Click(object sender, EventArgs e)
{
Data.ChangeScore(100);
tbxCurrentScore.Text = Data.Score.ToString();
}
private void btnSubPoints_Click(object sender, EventArgs e)
{
Data.ChangeScore(-100);
tbxCurrentScore.Text = Data.Score.ToString();
}
public string GetGameStatus()
{
var duration = Data.GameEnd - Data.GameStart;
return
$"Player {Data.PlayerName} : Id {Data.Id} : Score {Data.Score}\r\nStart : {Data.GameStart} : End {Data.GameEnd}\r\nDuration : hours {duration.Hours} | minutes: {duration.Minutes} | seconds: {duration.Seconds} | ms: {duration.Milliseconds}";
}
private void GamePlay_KeyDown(object sender, KeyEventArgs e)
{
if (ModifierKeys == Keys.Alt && e.KeyCode == Keys.Q)
{
this.Close();
}
}
}
public class ScoreData
{
public ScoreData(int id, string plname = "")
{
Id = id;
PlayerName = plname;
Score = 0;
GameStart = DateTime.Now;
}
public int Id { set; get; }
public string PlayerName { set; get; }
public int Score { set; get; }
public DateTime GameStart { set; get; }
public DateTime GameEnd { set; get; }
public void ChangeScore(int adjust)
{
Score += adjust;
}
}
Здесь не реализовано: способ приостановить игру и снова запустить ее, отслеживая фактическое игровое время ... должен быть легким.
... конец редактирования ...
Во-первых, вам нужно сделать некоторые стратегические выборы:
1. какую форму вы хотите, чтобы пользователь видел при запуске приложения ?
а. заставка ?
b. экран конфигурации ?
c. экран входа в систему
d. другой главный экран ?
e. существуют ли какие-либо обстоятельства, при которых игровое окно появляется первым ?
2. требуют ли ваши формы взаимодействия, отправки или получения данных ? В вашей игре, очевидно, форма счета должна содержать данные из игры.
3. использование форм, показанных модальными ?
а. вы хотите, чтобы игровой экран блокировал ваше приложение до тех пор, пока оно не будет закрыто ?
4. для каждой формы какие визуальные настройки вы хотите ?
a. FormBorderStyle, ShowinTaskBar, ShowIcon, StartPosition и т. д.
b. фиксированный или переменный размер ?
Скажите мне свой выбор, и я буду рад показать пример кода.