Как заставить мою основную форму приостановить выполнение на 1 секунду и продолжить в c #? - PullRequest
0 голосов
/ 15 января 2019

Я создаю карточную игру, и мне нужно выполнить методы, чтобы сделать паузу во время анимации карты по экрану. В настоящее время у меня есть это, и оно отлично анимирует карту, но продолжит играть в игру, пока карта анимируется. Не уверен, как это сделать. Я попытался Thread.Sleep (), но он все еще продолжает все возможное выполнение, а затем приостанавливает.

private void btnPlay_Click(object sender, EventArgs e)
        {
            try
            {
                string input = Microsoft.VisualBasic.Interaction.InputBox("Please enter your betting amount (£3.00 minimum bet)", "Play", "3.00", -1, -1);
                bet = double.Parse(input);
                if (Globals.Balance > bet)
                {
                    btnHit.Enabled = true;
                    btnStick.Enabled = true;
                    Globals.Balance -= bet;
                    lblBalance.Text = Globals.Balance.ToString();
                    Play();
                }
                else
                {
                    throw new Exception("You don't have enough money!");
                }

            }
            catch (FormatException)
            {
                MessageBox.Show("Incorrect format for betting amount");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

private void Play()
        {
            ClearDetails();
            DealPlayerCard();
            Classes.Deck.NextCard(Deck);
            DealPlayerCard();
            UpdatePlayerTotal();
        }

    private void DealPlayerCard()
            {
                //does stuff here

                switch (cardNum)
                {
                    case 3:
                        pb.Location = new Point(120, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                    case 4:
                        pb.Location = new Point(180, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                    case 5:
                        pb.Location = new Point(240, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                }
                AddPlayerCard(pb);
                AddToHand("Player");
            }

    private void timerCard_Tick(object sender, EventArgs e)
            {
                this.SuspendLayout();
                //sets x and y in a switch statement here

                if ((CardBack.Location.X == x) && (CardBack.Location.Y == y))
                {
                    timerCard.Enabled = false;
                    CardBack.Visible = false;
                    CardBack.Location = new Point(775, 247);
                    this.ResumeLayout();
                }
                else if ((CardBack.Location.X > 417) && (CardBack.Location.Y < 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y + 1);
                    timerCard_Tick(null, null);
                }
                else if ((CardBack.Location.X > 417) && (CardBack.Location.Y == 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y);
                    timerCard_Tick(null, null);
                }
                else if ((CardBack.Location.X == 417) && (CardBack.Location.Y < 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X, CardBack.Location.Y + 1);
                    timerCard_Tick(null, null);
                }
            }

1 Ответ

0 голосов
/ 15 января 2019

Включение таймера возвращается немедленно, и события таймера происходят отдельно, поэтому вы видите, что игра продолжается.

Вместо этого переместите оставшуюся часть игры в событие таймера после завершения анимации. Вот так (псевдокод):

private void DealPlayerCard()
{
    //does stuff here
    timer.Enabled = true;
    // no more code
}

private void timerCard_Tick(object sender, EventArgs e)
{
     switch (location)
         case first:
             DoSomeStuff();
         case next:
             DoSomeOtherStuff();
         case finished:
             timer.enabled = false;
             continueGame();
 } 

Полагаю, у вас есть какой-то игровой цикл, которого не было в примере, который вам, возможно, придется приостановить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...