<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);
}
}
我基本上拥有的是当我的游戏中的猫与数字0碰撞时数字消失。如何在XAML中获取TextBlock以显示每次收集数字时都会增加的数字。
谢谢
答案 0 :(得分: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);
}
}
}
}
请注意,您必须考虑整数范围内分数过大的情况。在这种情况下,您可以重置分数或使用较大的类型,例如分数。
答案 1 :(得分:0)
我的第一个建议是你需要将你的逻辑与视觉效果分开。这可以通过使用MVVM pattern,或者通过为得分和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会更好。希望这会指向正确的方向。