Всем привет, пишу курсач. Тема - компьютерная игра в жанре текстовый квест. За основу взял старый проект, который писал когда-то в начале учебы. Он на windows forms написан. Суть игры - текстовый аналог игры Pc building simulator. В игре есть игровые дни, в каждый из дней, и списка подгружаются и динамически создаются кнопки с заданием. При клике на кнопку вызывается месседж бокс, где описано задание, плата и так далее. Суть проблемы в том, что при нажатии на кнопку задания именно в первый день, случается баг. Месседж бокс, показывается два раза, следовательно если два раза его принять, статы прибавятся в два раза. Во все остальные игровые дни, бага такого нет. Месседж бокс появляется два раза, только в первый день. private void LoadAnswers(List<string[]> mes, List<string[]> ans, int num) { cost = Convert.ToInt32(mes[num][3]); DialogResult result = MessageBox.Show(mes[num][1] + "\n О работе:" + "\n Плата: " + mes[num][3]+ "\n Требуется времени: " + mes[num][4] + "\n Принять задание?", mes[num][2], MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (result == DialogResult.Yes) { if(Convert.ToInt32(mes[num][4]) > timeElapse) //Если не достаточно времени, то задание будет не возможно взять. { MessageBox.Show("Недостаточно времени..."); yv_endDay.Image = PcBuild.Properties.Resources.pic_yved; yv_mail.Image = null; return; } this.view1.Controls["v1b" + numButton].Enabled = false; timeElapse -= Convert.ToInt32(mes[numButton][4]); lab_time.Text = timeElapse.ToString(); x = 2; y = 2; for (int i = 0; i < ans.Count; i++) { this.view2.Controls.Add(new Button { Name = "v2b" + i, Location = new Point(x, y), Size = new Size(700, 51), Text = ans[0], BackColor = Color.White, FlatStyle = FlatStyle.Flat, Font = new Font("Arial", 8)}); y += 70; this.view2.Controls["v2b" + i].Click += new EventHandler(this.ans_Click); } } } CSHARP private void LoadAnswers(List<string[]> mes, List<string[]> ans, int num) { cost = Convert.ToInt32(mes[num][3]); DialogResult result = MessageBox.Show(mes[num][1] + "\n О работе:" + "\n Плата: " + mes[num][3]+ "\n Требуется времени: " + mes[num][4] + "\n Принять задание?", mes[num][2], MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (result == DialogResult.Yes) { if(Convert.ToInt32(mes[num][4]) > timeElapse) //Если не достаточно времени, то задание будет не возможно взять. { MessageBox.Show("Недостаточно времени..."); yv_endDay.Image = PcBuild.Properties.Resources.pic_yved; yv_mail.Image = null; return; } this.view1.Controls["v1b" + numButton].Enabled = false; timeElapse -= Convert.ToInt32(mes[numButton][4]); lab_time.Text = timeElapse.ToString(); x = 2; y = 2; for (int i = 0; i < ans.Count; i++) { this.view2.Controls.Add(new Button { Name = "v2b" + i, Location = new Point(x, y), Size = new Size(700, 51), Text = ans[0], BackColor = Color.White, FlatStyle = FlatStyle.Flat, Font = new Font("Arial", 8)}); y += 70; this.view2.Controls["v2b" + i].Click += new EventHandler(this.ans_Click); } } } private void task_Click(object sender, EventArgs e) { actB = (sender as Button); //this.Focus(); //actB.Dispose(); switch ((sender as Button).Name.ToString()) { case "v1b0": numButton = 0; CheckRightAnswer(ans0); LoadAnswers(mes, ans0, numButton); break; case "v1b1": numButton = 1; CheckRightAnswer(ans1); LoadAnswers(mes, ans1, numButton); break; case "v1b2": numButton = 2; CheckRightAnswer(ans2); LoadAnswers(mes, ans2, numButton); break; case "v1b3": numButton = 3; CheckRightAnswer(ans3); LoadAnswers(mes, ans3, numButton); break; } } CSHARP private void task_Click(object sender, EventArgs e) { actB = (sender as Button); //this.Focus(); //actB.Dispose(); switch ((sender as Button).Name.ToString()) { case "v1b0": numButton = 0; CheckRightAnswer(ans0); LoadAnswers(mes, ans0, numButton); break; case "v1b1": numButton = 1; CheckRightAnswer(ans1); LoadAnswers(mes, ans1, numButton); break; case "v1b2": numButton = 2; CheckRightAnswer(ans2); LoadAnswers(mes, ans2, numButton); break; case "v1b3": numButton = 3; CheckRightAnswer(ans3); LoadAnswers(mes, ans3, numButton); break; } }
Kloun228_inactive3478611, да, там нет ничего, все идет как нужно, по коду. Но месседж все равно показывает два раза.
vtlstolyarov, private void ans_Click(object sender, EventArgs e) { string otv = (sender as Button).Name.ToString(); otv = otv.Substring(3, otv.Length - 3); int numOtv = Convert.ToInt32(otv); if(numOtv == rightAns) { cash += cost; lab_money.Text = cash.ToString(); reputation += 10; lab_rep.Text = reputation.ToString(); SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\pravilno.wav"); sp.Play(); pic_vyp.Image = PcBuild.Properties.Resources.galochka; lab_vyp.Visible = true; //djsdgffsjfhdghsgfhjasdgfhjdghfjsahasfjgjhffgsadjfhsdjfgsdhjfgf lab_vyp.Text = "Выполнено!"; view2.Controls.Clear(); timer1.Start(); } else { reputation -= 10; lab_rep.Text = reputation.ToString(); SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\oshibka.wav"); sp.Play(); pic_vyp.Image = PcBuild.Properties.Resources.error; lab_vyp.Visible = true; lab_vyp.Text = "Ошибка!"; view2.Controls.Clear(); timer1.Start(); } MeessageExist(); } CSHARP private void ans_Click(object sender, EventArgs e) { string otv = (sender as Button).Name.ToString(); otv = otv.Substring(3, otv.Length - 3); int numOtv = Convert.ToInt32(otv); if(numOtv == rightAns) { cash += cost; lab_money.Text = cash.ToString(); reputation += 10; lab_rep.Text = reputation.ToString(); SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\pravilno.wav"); sp.Play(); pic_vyp.Image = PcBuild.Properties.Resources.galochka; lab_vyp.Visible = true; //djsdgffsjfhdghsgfhjasdgfhjdghfjsahasfjgjhffgsadjfhsdjfgsdhjfgf lab_vyp.Text = "Выполнено!"; view2.Controls.Clear(); timer1.Start(); } else { reputation -= 10; lab_rep.Text = reputation.ToString(); SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\oshibka.wav"); sp.Play(); pic_vyp.Image = PcBuild.Properties.Resources.error; lab_vyp.Visible = true; lab_vyp.Text = "Ошибка!"; view2.Controls.Clear(); timer1.Start(); } MeessageExist(); }
vtlstolyarov, И еще такой вопрос. Можно ли как-то заставить форму, при открытии диалогового окна, не уходить на задний план? Просто к примеру, если менять игровой день на другой посредством pic_endDay_Click, появляется диалоговое окно. При его появлении, вся форма уходит назад, и все открытые приложения, становятся поверх этой формы. Даже нижняя панель Windows.
titwolf, Да - отрисовываются 2 конпки, но, нет - приложение не думает что ты наживаешь 2 кнопки, просто когда ты таким образом подвешиваешь событие на кнопку, вместо новой кнопки событие снова добавляется к той что там уже была (потому что у них одинаковое имя и берётся первая из этих двух) this.view1.Controls.Add(new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat }); this.view1.Controls["v1b" + i].Click += new EventHandler(this.task_Click); CSHARP this.view1.Controls.Add(new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat }); this.view1.Controls["v1b" + i].Click += new EventHandler(this.task_Click); если ты не будешь использовать поиск контрола по имени то оно тоже будет работать как ожидается (даже без очистки контролов): var button = new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat }; button.Click += new EventHandler(this.task_Click); this.view1.Controls.Add(button); CSHARP var button = new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat }; button.Click += new EventHandler(this.task_Click); this.view1.Controls.Add(button); Про диалоговое окно и задний план не в курсе - я сто лет уже как не работал с WinForms и не помню таких деталей.
vtlstolyarov, ладно, спасибо большое и за это. Я просто было уже хотел переносить проект на wpf, ибо думал что дело в формах. А так в планах, к диплому проект перенести в Юнити, и до ума доводить. В общем, спасибо большое тебе.