Как заставить TextBlock работать как счетчик очков в C # XAML - PullRequest
0 голосов
/ 30 апреля 2011
<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);                    
    }
}

То, что я в основном имею, это когда моя кошка в игре сталкивается с нулевым числом и исчезает число.Как я могу получить TextBlock в XAML для отображения числа, которое увеличивается каждый раз, когда число собирается.

Спасибо

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Насколько я понимаю вашу проблему, вы хотите обновлять счет каждый раз, когда обнаруживается столкновение. Если это так, просто обновите свойство 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, для счета.

0 голосов
/ 30 апреля 2011

Мое первое предложение заключается в том, что вам нужно отделить свою логику от визуальных элементов. Это можно сделать либо с помощью шаблона MVVM , либо путем написания классов модели данных для партитуры и кота и перемещения туда логики. 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. Надеемся, что это укажет вам правильное направление.

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