书中游戏示例中的意外行为

时间:2013-12-15 07:55:01

标签: c# windows visual-studio xaml

我刚拿到了Head First C#3rd Edition这本书。在本书的第一部分,它让您开始创建一个简单的游戏,在这个游戏中您可以制作弹跳圆圈,在点击并将“人类”拖动到安全时必须避免这些圆圈。编码涉及C#以及图形方面的XAML。除了一件事,一切都有效。如果我点击它,它将“跟随”光标而不是点击并拖动“人类”,而游戏的行为就像光标本身就是人类一样,因为那是当我击中其中一个弹跳圆圈时游戏结束的地方。我无法弄清楚我做错了什么。我已经仔细查看了本书旁边的代码.....我唯一可以弄清楚的是这段代码。

private void playArea_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    if (humanCaptured)
    {
        Point pointerPosition = e.GetCurrentPoint(null).Position;
        Point relativePosition = grid.TransformToVisual(playArea).TransformPoint(pointerPosition);
        if ((Math.Abs(relativePosition.X - Canvas.GetLeft(human)) > human.ActualWidth * 20)
            || (Math.Abs(relativePosition.Y - Canvas.GetTop(human)) > human.ActualHeight * 20))
        {
            humanCaptured = false;
            human.IsHitTestVisible = true;
        }
        else
        {
            Canvas.SetLeft(human, relativePosition.X - human.ActualWidth / 2);
            Canvas.SetTop(human, relativePosition.Y - human.ActualHeight / 2);
        }
    }
}

这本书说把人的实际宽度和高度设置为3.但如果我这样做并尝试点击实际游戏中的人,它根本就不会注册光标。但如果我把它放在20或以上,我点击人类,正如我之前所说,它开始跟随我的光标,其余的游戏表现正常。

这是应该使光标能够“点击”和“拖动”人类的代码。

private void human_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    if (enemyTimer.IsEnabled)
    {
        humanCaptured = true;
        human.IsHitTestVisible = false;
    }
}

这是相关的XAML代码,它应该用来点击并拖动它,而是让它跟随我在该区域的光标:

<StackPanel x:Name="human" Orientation="Vertical" Canvas.Left="17" Canvas.Top="15" 
                    PointerPressed="human_PointerPressed" >
            <Ellipse Fill="White" Height="10" Stroke="White" Width="10"/>
            <Rectangle  Fill="White" Height="25" Stroke="White" Width="10"  />
        </StackPanel>

其他一切似乎都正常。我一遍又一遍地检查了书中的代码,然后去了他们的网站。就我所知,我所做的一切都不同。如果有人可以提供帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

阅读书籍“Head First C#, 3rd Edition

我会说问题不是你的代码......

更多关于他如何检测人类是否被捕获,因为他没有检查“human”是否与“enemy”发生碰撞他只是做了一些Pointerevent,它会在指针处获得触发器(你的鼠标)将输入“enemy”而不是你的“human”与他发生冲突......