65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlights Out -通过示例介绍 Silverlight

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.19/5 (22投票s)

2007年5月13日

4分钟阅读

viewsIcon

88676

downloadIcon

216

通过示例介绍 Silverlight。

Silverlights Out 2.0

在线演示

引言

任何足够先进的技术都与魔法无异。
—亚瑟·C·克拉克


"Silverlight 是一个跨浏览器、跨平台的插件,用于在 Web 上交付下一代基于 Microsoft .NET 的媒体体验和丰富的交互式应用程序。" http://silverlight.net/

学习新技术最好的方法就是使用它。
学习新技术的最好玩的方法就是用它来制作一款游戏。

这是我编写的第一个 Silverlight 应用程序。Silverlight 是 .NET 的一个子集,就像 .NET Compact Framework 一样,它有自己的一套特殊规则和处理方式。

如果您想了解更多关于 Silverlights Outs 的信息,请访问我的博客: http://www.cjcraft.com/blog/

这就是为什么我建议通过先创建一个简单的应用程序来学习 Silverlight,例如 Silverlights Out,这样新用户就可以专注于 Silverlight 应用程序创建方面的新特性和不同之处,直到他们“展翅高飞”为止。

必备组件

要创建 Silverlight 应用程序,您需要一台机器,我推荐使用虚拟机,并按照以下 Silverlight 先决条件进行设置。

  • 运行时

    要开始使用 Silverlight,请下载 Silverlight 1.1 Alpha 版本以使用 .NET 语言。

  • Microsoft Silverlight 1.1 Alpha [下载]

    运行使用 .NET Microsoft 创建的 Silverlight 应用程序所需的运行时。

  • 开发人员工具

    下载 Visual Studio 开发人员工具以开始开发 Silverlight 应用程序。

  • Microsoft Visual Studio 代号“Orcas” Beta 1 [下载]

    下一代开发工具。

  • Microsoft Silverlight Tools Alpha for Visual Studio 代号“Orcas” Beta 1 [下载]

    用于使用 .NET 创建 Silverlight 应用程序的插件。

  • 设计工具

    下载 Expression 设计师工具以开始设计 Silverlight 应用程序。

  • Expression Blend 2 五月预览版 [下载]

    用于创建 Silverlight 用户交互的专业设计工具。

  • 软件开发工具包

    有关文档、示例和插件,也请下载 SDK。

  • Microsoft Silverlight 1.1 Alpha 软件开发工具包 (SDK) [下载]

    下载此 SDK 以创建面向 Silverlight 1.1 Alpha 的 Silverlight Web 体验。
    SDK 包含文档和示例。

背景

Wikipedia.org 文章:Lights Out (益智游戏) [查看]

"Lights Out,也称为 Fiver,是一款单人益智游戏,在一个 m x n 的网格上进行,其中每个方块都有两种状态:开和关。游戏通常从所有方块都关闭开始,目标是打开所有方块。通过选择一个方块,该方块及其所有相邻方块(上、下、左、右)的状态将被切换。例如,在一个 3x3 的网格上,所有方块都关闭,如果选择中心方块,它将变为“开”,并且另外 4 个方块也将被切换。"

Silverlights Out 演示了以下功能

  • 动画滚动星空背景
  • 透明度
  • 定时器

使用代码

像 Silverlights Out 这样的益智游戏非常适合学习新语言或新技术,因为您可以体验各种内容,而不会因为过于困难而阻碍成功。

主要方法

RandomizeBoard()

此方法负责在游戏开始前随机化棋盘。

通过遍历每个方块,并随机决定是否调用 ToggleSquare() 来实现这一点。

private void RandomizeBoard()
{
    // create a randomizer
    Random random = new Random();

    // loop through each squares
    for (int i = 0; i < squares.Count; i++)
    {
        // fifty / fifty toggle square
        if (Convert.ToBoolean(random.Next(2)))
        {
            ToggleSquare(squares[i]);
        }
    }
}

ClickSquare()

此函数负责管理用户点击的方块。

首先,我们获取方块的名称,然后对所有相关的方块调用 ToggleSquare()

private void ClickSquare(object sender, MouseEventArgs e)
{
    Image image = sender as Image; // cast sender object into Image

    int index = squares.IndexOf(image); // get index of clicked square

    if (index > 4) // make sure we are not on topmost row
        ToggleSquare(squares[index - 5]); 
                // toggle square above clicked square

    if (index % 5 != 0)
        ToggleSquare(squares[index - 1]); 
                // toggle square to left of clicked square

    ToggleSquare(squares[index]); // toggle clicked square

    if (index % 5 != 4)
        ToggleSquare(squares[index + 1]); 
                // toggle square to right of clicked square

    if (index < 20) // make sure we are not on bottommost row
        ToggleSquare(squares[index + 5]); 
                // toggle square below clicked square
}

ToggleSquare()

当方块被点击时,此辅助方法决定附近方块的结果。

如果方块是开启状态,我们将其关闭;否则,我们将其重新开启。然后我们检查棋盘是否处于获胜状态。我们还为获得良好效果而设置和更改图像的不透明度。

private void ToggleSquare(Image image)
{
    // check if square is on
    if (image.Source == vistaLogoOn.Source)
    {
        image.Source = vistaLogoOff.Source;
        image.Opacity = 0.50;
    }
    else
    {
        image.Source = vistaLogoOn.Source;
        image.Opacity = 0.75;
    }

    if (CheckForWin())
        gameStatus.Text = "You Win";
}

CheckForWin()

在完成一步之后,此辅助函数确定棋盘是否处于获胜状态。

我们遍历每个方块,并计算有多少是开启和关闭的。如果所有方块都相同,则用户已获胜。

private bool CheckForWin()
{
    int onCount = 0; // assume no square on by default
    bool checkForWin = false; // assume player did not win

    // loop through all squares
    for (int i = 0; i < squares.Count; i++)
    {
        if (squares[i].Source == vistaLogoOn.Source)
            onCount++;
    }

    // if all lights are on or off then player wins
    if (onCount == 0 || onCount == 25)
        checkForWin = true;

    return checkForWin;
}

提示与技巧

Browser.HtmlTimer

我发现 Silverlight 1.1 中有一个 HtmlTimer 类。这个类没有文档记录,并且被标记为已弃用。Visual Studio 在编译后显示警告:'System.Windows.Browser.HtmlTimer' 已弃用:'这不是高分辨率计时器,不适用于短间隔动画。未来版本将提供新的计时器类型。'

...
// use the browser's HtmlTimer to refresh background regularly

System.Windows.Browser.HtmlTimer timer = 
                new System.Windows.Browser.HtmlTimer();
timer.Interval = 1;
timer.Enabled = true;
timer.Tick += new EventHandler(timer_Tick);
...

void timer_Tick(object sender, EventArgs e)
{
   double currentLeft = (double)background.GetValue(Canvas.LeftProperty);
   if (currentLeft <= 0)
   {
      // move background pixels over>
      background.SetValue(Canvas.LeftProperty, currentLeft + 2);
   }
   else
   {
      // reset backgrounds position
      background.SetValue(Canvas.LeftProperty, -340);
   }
}

关注点

请务必查看使用 System.Windows.Browser.HtmlTimer 的计时器代码,目前它是实现原始动画的最简单方法。

资源

您需要使用和学习 Silverlight 的几乎所有内容都列在以下网站:

历史

  • 2007.05.13 上传原始文章
  • 2007.05.14 将代码转换为使用数组和循环
© . All rights reserved.