Как заставить текстовый блок работать как счетчик баллов в C # XAML

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

 <Canvas x:Name="LayoutRoot" Background="white">
    <Image Source="level1.jpg"  Name="bg" Width="640" Height="480"
           Canvas.Top="10" Canvas.Left="50"/>
    <TextBlock Name="score">Scorehere</TextBlock> 
</Canvas>
  
 void CompositionTarget_Rendering(object sender, EventArgs e)
{         
    if (DetectCollisionLeft(myCat, myZero))
    {
        LayoutRoot.Children.Remove(myZero);                    
    }
}
  

По сути, у меня есть то, что, когда мой cat в игре сталкивается с нулевым числом, число исчезает. Как я могу заставить текстовый блок в XAML отображать число, которое увеличивается каждый раз, когда оно собирается.

Спасибо

Ответ №1:

Насколько я понимаю ваше заявление о проблеме, вы хотите обновлять оценку каждый раз при обнаружении столкновения. Если это так, то просто обновите TextBlock.Text свойство, чтобы обновить оценку.

 void CompositionTarget_Rendering(object sender, EventArgs e)
{         
    if (DetectCollisionLeft(myCat, myZero))
    {
        if(LayoutRoot.Children.Contains(myZero))
        {
            LayoutRoot.Children.Remove(myZero);

            //Update the score as score = previousScore   1
            int scoreAsInt;
            if(Int32.TryParse(score.Text, NumberStyles.Integer, CultureInfo.CurrentCulture, out scoreAsInt) != null)
            {
                scoreAsInt = scoreAsInt   1;
                score.Text = scoreAsInt.ToString(CultureInfo.CurrentCulture);
            }
        }
    }
}
  

Обратите внимание, что вы должны рассмотреть сценарий, в котором оценка становится слишком большой для диапазона целых чисел. В этом случае вы можете либо сбросить оценку, либо использовать для оценки более крупный шрифт, например long.

Комментарии:

1. Спасибо, я упростил то, что вы мне дали, просто добавив 1, однако мне нужно сделать так, чтобы пользователь не мог просто продолжать просматривать местоположение, чтобы получить 1. Есть идеи о том, как я мог бы это сделать?

2. @Lokie, я отредактировал ответ, чтобы добавить Contains проверку. При первом столкновении код удаляет элемент, при последующих столкновениях оценка не увеличивается, так как Contains проверка элемента возвращает false.

Ответ №2:

Мое первое предложение заключается в том, что вам нужно отделить свою логику от визуальных элементов. Это можно сделать либо с помощью шаблона MVVM, либо написав классы модели данных для score и cat и перенеся туда логику. MVVM, вероятно, немного перегибает палку для такого простого проекта, как этот, но могут быстро возникнуть ненужные проблемы и сложность, когда визуальные данные и логика смешиваются.

Сказав это, вот простой ответ на вашу проблему. Если вы хотите сохранить счет на экране и просто обновить его, нет причин удалять его вообще. Просто обновите текстовое значение и переместите его в новое случайное местоположение на холсте. Что-то вроде этого:

    if (DetectCollisionLeft(myCat, myZero))
   {
       Random rand = new Random();
       score.Text = int.Parse(score.Text)   1;

       // Measure text for new random position
       score.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

       // Set the position of the text
       Canvas.SetLeft(score, rand.Next(640   10 - score.DesiredSize.Width));
       Canvas.SetTop(score, rand.Next(480   10 - score.DesiredSize.Height));
   }
  

Могли бы быть лучшие способы рандомизировать положение баллов. Например, было бы лучше передать ширину экрана / родительского контейнера вместо использования жестко закодированных значений 640 и 480. Надеюсь, это укажет вам правильное направление.