#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. Надеюсь, это укажет вам правильное направление.