webabcd - 专注于asp.net, html5, silverlight

ASP.NET
从现在开始 一切都不晚
posts - 287, comments - 7866, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[源码下载]


游戏人生Silverlight(2) - 趣味钢琴[Silverlight 2.0(c#)]


作者:webabcd


介绍
使用 Silverlight 2.0(c#) 开发一个趣味钢琴


玩法
打开音箱,从左侧列表选择要挑战的乐谱,右侧会出现对应的乐谱提示动画,等按键提示移动到目标区后敲击键盘上对应的按键


在线DEMO
Get Microsoft Silverlight


思路
1、添加多个MediaElement控件,循环使用,以达到同时播放多个音阶的效果
2、提示按键模块分3组动画,分别为提示部分、目标部分和离开部分,进入目标区和离开目标区都要触发对应的事件,以使外部判断用户是否按照提示正确地敲击了按键


关键代码
1、钢琴音阶播放器
ScalePlayer.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace YYPiano.Controls.Parts
{
    
public partial class ScalePlayer : UserControl
    
{
        
// MediaElement 控件总数
        private int _count = 32;

        
// MediaElement 控件集合的索引
        private int _index = 0;

        
public ScalePlayer()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(Player_Loaded);
        }


        
void Player_Loaded(object sender, RoutedEventArgs e)
        
{
            
// 在 Canvas 上添加指定数量的 MediaElement 控件
            for (int i = 0; i < _count; i++)
            
{
                var element 
= new MediaElement();
                element.Volume 
= 1d;

                root.Children.Add(element);
            }

        }


        
/// <summary>
        
/// 播放音阶
        
/// A 键对应 Scale 文件夹内的 A.mp3,以此类推
        
/// A 键对应 C 大调的低音 dou,以此类推
        
/// </summary>
        
/// <param name="key">键值</param>

        public void Play(Key key)
        
{
            
if (key >= Key.A && key <= Key.Z)
            
{
                
// 循环使用 MediaElement 控件集合中的控件
                if (_index > _count - 1)
                    _index 
= 0;

                
// 设置 MediaElement 的 Source 并播放
                var element = root.Children[_index] as MediaElement;
                element.Source 
= new Uri("/YYPiano;component/Scale/" + key.ToString() + ".mp3", UriKind.Relative);
                element.Stop();
                element.Play();

                _index
++;
            }

        }

    }

}



2、按键提示动画
AnimationKey.xaml
<UserControl x:Class="YYPiano.Controls.Parts.AnimationKey"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml">
    
<Canvas>
        
<!--3个椭圆,目标区,按键动画进入该区域后敲击则为有效敲击-->
        
<Ellipse x:Name="target" Width="80" Height="80" Stroke="#F80" Fill="Transparent" StrokeThickness="1" Canvas.Left="0" Canvas.Top="250" />
        
<Ellipse x:Name="target2" Width="80" Height="80" Stroke="#F80" Fill="Transparent" StrokeThickness="1" Canvas.Left="120" Canvas.Top="250" />
        
<Ellipse x:Name="target3" Width="80" Height="80" Stroke="#F80" Fill="Transparent" StrokeThickness="1" Canvas.Left="240" Canvas.Top="250" />

        
<!--提示按键-->
        
<Border x:Name="container" BorderBrush="Gray" BorderThickness="1" Width="50" Height="50" CornerRadius="50" Canvas.Left="135" RenderTransformOrigin="0.5, 0.5">
            
<TextBlock x:Name="key" TextAlignment="Center" VerticalAlignment="Center" FontSize="40" FontWeight="Bold">
            
</TextBlock>
            
<Border.RenderTransform>
                
<TransformGroup>
                    
<RotateTransform x:Name="rt" />
                    
<TranslateTransform x:Name="tt" />
                    
<ScaleTransform x:Name="st" ScaleX="0.3" ScaleY="0.3" />
                
</TransformGroup>
            
</Border.RenderTransform>
        
</Border>

        
<Canvas.Resources>
            
<!--主动画(缓冲提示)-->
            
<Storyboard x:Name="mainAni" Completed="mainAni_Completed">
                
<!--坐标-->
                
<DoubleAnimation x:Name="targetX" From="0" To="0" Duration="0:0:4" Storyboard.TargetName="tt" Storyboard.TargetProperty="X" />
                
<DoubleAnimation From="0" To="250" Duration="0:0:4" Storyboard.TargetName="tt" Storyboard.TargetProperty="Y" />

                
<!--旋转-->
                
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="rt" Storyboard.TargetProperty="Angle" RepeatBehavior="1x" >
                    
<SplineDoubleKeyFrame Value="366" KeySpline="0.1,0 0.2,0.95" KeyTime="0:0:4" />
                
</DoubleAnimationUsingKeyFrames>

                
<!--缩放-->
                
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleX">
                    
<SplineDoubleKeyFrame Value="1" KeySpline="0.1,0 0.3,0.8" KeyTime="0:0:4" />
                
</DoubleAnimationUsingKeyFrames>
                
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleY">
                    
<SplineDoubleKeyFrame Value="1" KeySpline="0.1,0 0.3,0.8" KeyTime="0:0:4" />
                
</DoubleAnimationUsingKeyFrames>
            
</Storyboard>

            
<!--进入目标区后的动画-->
            
<Storyboard x:Name="insideAni" Completed="insideAni_Completed" Duration="0:0:0.4">
                
<DoubleAnimation To="310" Storyboard.TargetName="tt" Storyboard.TargetProperty="Y" />
            
</Storyboard>

            
<!--离开目标区后的动画-->
            
<Storyboard x:Name="outsideAni">
                
<DoubleAnimation To="400" Storyboard.TargetName="tt" Storyboard.TargetProperty="Y" />
                
<DoubleAnimation To="0" Storyboard.TargetName="container" Storyboard.TargetProperty="Opacity" />
            
</Storyboard>
        
</Canvas.Resources>
    
</Canvas>
</UserControl>

AnimationKey.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace YYPiano.Controls.Parts
{
    
public partial class AnimationKey : UserControl
    
{
        
public AnimationKey()
        
{
            InitializeComponent();
        }


        
/// <summary>
        
/// 键值 A - Z,动画显示,用于提示用户应该敲什么键
        
/// </summary>

        public Key Key
        
{
            
get return Convert.ToChar(key.Text).ToKey(); }
            
set { key.Text = value.ToChar().ToString(); }
        }


        
/// <summary>
        
/// 开始动画
        
/// </summary>

        public void Start()
        
{
            mainAni.Begin();
        }


        
/// <summary>
        
/// 停止动画
        
/// </summary>

        public void Stop()
        
{
            mainAni.Stop();
            insideAni.Stop();
            outsideAni.Stop();
        }


        
/// <summary>
        
/// 动画开始时间
        
/// </summary>

        public TimeSpan BeginTime
        
{
            
set { mainAni.BeginTime = value; }
        }


        
private int _targetIndex;
        
/// <summary>
        
/// UI 上设置了 3 个目标区,设置键的动画最终要落到哪个区上
        
/// </summary>

        public int TargetIndex
        
{
            
set
            
{
                
if (value == 0)
                    targetX.To 
= -120;
                
else if (value == 1)
                    targetX.To 
= 0;
                
else if (value == 2)
                    targetX.To 
= 120;
                
else
                    targetX.To 
= 0;

                _targetIndex 
= value;
            }

        }


        
/// <summary>
        
/// 主动画完成后
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void mainAni_Completed(object sender, EventArgs e)
        
{
            
if (_targetIndex == 0)
                target.Fill 
= new SolidColorBrush(Colors.Orange);
            
else if (_targetIndex == 1)
                target2.Fill 
= new SolidColorBrush(Colors.Orange);
            
else if (_targetIndex == 2)
                target3.Fill 
= new SolidColorBrush(Colors.Orange);

            insideAni.Begin();

            OnInside();
        }


        
/// <summary>
        
/// 目标区动画完成后
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void insideAni_Completed(object sender, EventArgs e)
        
{
            
if (_targetIndex == 0)
                target.Fill 
= new SolidColorBrush(Colors.Transparent);
            
else if (_targetIndex == 1)
                target2.Fill 
= new SolidColorBrush(Colors.Transparent);
            
else if (_targetIndex == 2)
                target3.Fill 
= new SolidColorBrush(Colors.Transparent);

            outsideAni.Begin();

            OnOutside();
        }


        
/// <summary>
        
/// 动画进入目标区后的事件
        
/// </summary>

        public event EventHandler<PianoKeyEventArgs> Inside;
        
public void OnInside()
        
{
            
if (Inside != null)
            
{
                Inside(
thisnew PianoKeyEventArgs() { Key = this.Key });
            }

        }


        
/// <summary>
        
/// 动画离开目标区后的事件
        
/// </summary>

        public event EventHandler<PianoKeyEventArgs> Outside;
        
public void OnOutside()
        
{
            
if (Outside != null)
            
{
                Outside(
thisnew PianoKeyEventArgs() { Key = this.Key });
            }

        }

    }

}



3、乐谱提示动画
AnimationMusicBook.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using YYPiano.Controls.Parts;
using System.Threading;

namespace YYPiano.Controls
{
    
/// <summary>
    
/// 乐谱动画
    
/// </summary>

    public partial class AnimationMusicBook : UserControl
    
{
        
/// <summary>
        
/// 当前进入到目标区域的按键集合(先进先出)
        
/// </summary>

        private List<KeyHitModel> _currentKeys = new List<KeyHitModel>();

        
public AnimationMusicBook()
        
{
            InitializeComponent();
        }


        
/// <summary>
        
/// 启动乐谱动画
        
/// </summary>
        
/// <param name="code">乐谱编码</param>
        
/// <returns>是否成功地启动了乐谱动画</returns>

        public bool Start(string code)
        
{
            code 
= code.ToUpper().Trim();

            
// 清除已有的 AnimationKey 控件
            foreach (var c in root.Children)
            
{
                var ak 
= c as AnimationKey;
                ak.Stop();
            }

            root.Children.Clear();
            _currentKeys.Clear();

            
// 把乐谱编码解析为乐谱实体类(用于描述乐谱的每一音阶)集合
            var musicBook = new List<MusicBookModel>();
            var countDelay 
= 0;
            
try
            
{
                
foreach (var s in code.Split(','))
                
{
                    var delay 
= int.Parse(s.Trim().Substring(1));
                    var key 
= Convert.ToChar(s.Trim().Substring(01)).ToKey();

                    musicBook.Add(
new MusicBookModel() { Length = countDelay, Key = key });

                    countDelay 
+= delay;
                }

            }

            
catch (Exception)
            
{
                
return false;
            }


            
// 在容器内放置相应的 AnimationKey 控件
            for (int i = 0; i < musicBook.Count; i++)
            
{
                AnimationKey key 
= new AnimationKey();
                key.TargetIndex 
= i % 3;
                key.Key 
= musicBook[i].Key;
                key.BeginTime 
= TimeSpan.FromMilliseconds(musicBook[i].Length);
                key.Inside 
+= new EventHandler<PianoKeyEventArgs>(key_Inside);
                key.Outside 
+= new EventHandler<PianoKeyEventArgs>(key_Outside);
                key.Start();

                root.Children.Add(key);
            }


            
return true;
        }


        
/// <summary>
        
/// 按键进入目标区
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        void key_Inside(object sender, PianoKeyEventArgs e)
        
{
            _currentKeys.Add(
new KeyHitModel { Key = e.Key, Hit = false });
        }


        
/// <summary>
        
/// 按键离开目标区
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        void key_Outside(object sender, PianoKeyEventArgs e)
        
{
            
// 获取此次离开目标区的按键(进入到目标区域的按键集合的第一个成员)
            var key = _currentKeys.First();

            
if (!key.Hit)
                OnLost();

            _currentKeys.RemoveAt(
0);
        }


        
/// <summary>
        
/// 指定的键值被敲击后所执行的方法
        
/// </summary>
        
/// <param name="key">键值</param>

        public void Play(Key key)
        
{
            
if (key >= Key.A && key <= Key.Z && _currentKeys.Where(p => !p.Hit).Count() > 0)
            
{
                var validKey 
= _currentKeys.Where(p => !p.Hit && p.Key == key).FirstOrDefault();
                
if (validKey != null)
                
{
                    OnScore();
                    validKey.Hit 
= true;
                }

                
else
                
{
                    OnLost();
                }

            }

        }


        
/// <summary>
        
/// 按键敲击正确的事件
        
/// </summary>

        public event EventHandler<EventArgs> Score;
        
public void OnScore()
        
{
            
if (Score != null)
            
{
                Score(
thisnew EventArgs());
            }

        }


        
/// <summary>
        
/// 按键敲击错误或未及时敲击的事件
        
/// </summary>

        public event EventHandler<EventArgs> Lost;
        
public void OnLost()
        
{
            
if (Lost != null)
            
{
                Lost(
thisnew EventArgs());
            }

        }

    }

}



OK
[源码下载]

Feedback

#1楼  回复 引用 查看   

2009-02-16 08:45 by pythonic      
很不错!请问有没有demo网址?

#2楼  回复 引用   

2009-02-16 08:46 by x-man[未注册用户]
支持,还没玩
先抢个沙发

#3楼  回复 引用   

2009-02-16 08:47 by x-man[未注册用户]
我就晕啊,不是沙发,楼上的,这个页面不就是有demo吗

#4楼  回复 引用   

2009-02-16 09:04 by asuaba[未注册用户]
强大 非常强大

#5楼  回复 引用 查看   

2009-02-16 09:08 by aierong      
好东西
有趣

#6楼  回复 引用 查看   

2009-02-16 09:09 by 房子小轩      
楼主,我发现一个很好玩的方法,随便找一片英文的文章就可以弹奏~
拿自己的名字先试试,发现人人都是音乐家~
哈哈哈
感谢楼主~

#7楼[楼主]  回复 引用 查看   

2009-02-16 09:10 by webabcd      
@pythonic
:)
页面上就有demo啊

@x-man
:)
多谢支持

@aierong
:)
呵呵,就是打字游戏

#8楼  回复 引用 查看   

2009-02-16 09:14 by -brian-      
佩服

#9楼[楼主]  回复 引用 查看   

2009-02-16 09:14 by webabcd      
@房子小轩
:)
哦?呵呵

@房子小轩
:)
还好,还好

#10楼  回复 引用   

2009-02-16 09:17 by 伯乐族人[未注册用户]
非常不错哦,伯乐族收藏了,这样大家都能学习到哦! http://***

#11楼  回复 引用 查看   

2009-02-16 09:21 by 小能      
太有才了,上次看了你的俄罗斯方块,楼主厉害。
差距忒大了,努力ing~~~~~~~

#12楼  回复 引用   

2009-02-16 09:23 by Paintshow[未注册用户]
楼主介于牛A与牛C之间

#13楼  回复 引用 查看   

2009-02-16 09:26 by Rainy      
有新意,谱子不错,赞!

#14楼  回复 引用 查看   

2009-02-16 09:26 by Otis's Technology Space      
很好玩,很强大!!

#15楼  回复 引用 查看   

2009-02-16 09:28 by 1-2-3      
不错的创意

#16楼[楼主]  回复 引用 查看   

2009-02-16 09:33 by webabcd      
@伯乐族人
:)
多谢收藏

@小能
:)
每天多努力一点,技术会提高得很快的

@Paintshow
:)
呵呵,很有文采的一句话,呵呵

#17楼[楼主]  回复 引用 查看   

2009-02-16 09:35 by webabcd      
@Rainy
:)
乐谱基本来自flash的那款钢琴游戏的乐谱

@Otis's Technology Space
:)
算是flash那款钢琴游戏的升级版吧,不过美工比人家差远了

@1-2-3
:)
呵呵,打字和钢琴的结合

#18楼  回复 引用 查看   

2009-02-16 11:02 by andy.wu      
要是配合键盘(不是计算机的键盘),估计很hipe啊。

#19楼  回复 引用   

2009-02-16 11:05 by 路人甲第987号[未注册用户]
字母出来能不能不转啊?头直接就晕了

#20楼  回复 引用 查看   

2009-02-16 11:32 by 人在江湖飘      
能否添加乐谱啊

#21楼[楼主]  回复 引用 查看   

2009-02-16 12:04 by webabcd      
@andy.wu
:)
是啊,估计应该有那种软件

@路人甲第987号
:)
呵呵,可以啊,把控制angle的那段storyboard去掉就好了

@人在江湖飘
:)
可以,编辑MusicBook.xml这个文件就好

#22楼  回复 引用 查看   

2009-02-16 12:14 by nasa      
做的真不错。 就是我的音乐不太好 请问 如果都弹对的话 出来的是和选择的曲目一样的音乐吗?

#23楼  回复 引用 查看   

2009-02-16 13:01 by U2U      
做得真好!

#24楼[楼主]  回复 引用 查看   

2009-02-16 13:21 by webabcd      
@nasa
:)
嗯。。。要看乐谱编辑的质量了,我提供的demo中的乐谱至少应该还能听出来什么曲的

@U2U
:)
过奖了

#25楼  回复 引用 查看   

2009-02-16 13:59 by 梁逸晨      
楼主,这个键位可能不太合适,你想想: DUO LUE MI FA SUO LA XI ,本来连续的7个音,如果打一遍的话需要在键盘上切换的按键位置是很不科学的

#26楼  回复 引用   

2009-02-16 14:21 by jol[未注册用户]
能不能自定义按键,或者,ASDFGHJKL;'这种按键的方式排列,以英文字符的方式,弹奏歌曲,坚持崩溃~~位置老敲错

#27楼  回复 引用   

2009-02-16 14:23 by jol[未注册用户]
有兴趣,可自行翻译为英文。

【琴萧合奏曲谱】
琴 3 - 6·3 │5 5 - 3 │ 2 3 5 6 │3 - - - │ 3 - 6·3 │ 5 5 - 3 │
- -
萧 │0 653235│3 - - - - │
------
╭--╮╭╮ ╭╮╭╮ ╭╮ ╭╮╭╮ ╭╮
琴 2 3 5 65 │3 - 3 332│1 1 12 23│2 2 22 1│6 61 12 23│5 56 5 32│
-- ----- ----- -- . -- -- -- -- --
.
萧 │ 0 653523│ 1 - - - │
------
╭╮╭╮ ╭╮╭╮
琴 1 1 1 223│2 2 2 221│6·1 2 35│6 - - - ││
----- ----- .--- -- ?br />

琴 3 - 6·3 │5 5 - 3 │ 2 3 5 6 │3 - - - │ 3 - 6·3 │ 5 5 - 3 │
- -
萧 3 │ 3 │ 3 │0 356532│ 3 │ 3 │
2 ------

╭--╮╭╮ ╭╮╭╮ ╭╮╭╮ ╭╮ ╭╮
琴 2 3 5 65 │3 - 3 332│1 1 12 23│2 2 2 221│6 6112 3 │5 56 5 32│
-- ----- ----- ----- . ---- -- --
.
萧 3 │0 356532 │1 - - - │ │00 5 65 │
2 ------ --
╭╮╭╮ q╮╭╮
琴 1 1 1 223│2 2 2 221│6·1 2 35│6 - - - ││
----- ----- . - -- ?br /> 萧 3 - - -│0 0 2 1 │6·1 2 35│6 - - - ││
. - --
╭╮ ╭╮╭╮ ╭╮ ╭╮ ╭╮ ╭╮╭╮
琴 2 2 0332 │1 11 661│2 2 0332 │16 6·16│ 2 2 0332 │1 1 1 6 61│
---- ------ ---- -- -- ---- ------
.. . . . . .
╭╮
萧 2 2 0225 │ 3 - - - │
------
╭╮╭╮ ╭╮ ╭╮╭╮ ╭╮
琴 606 6 116│202 22 3 │111 1 12│6-656661│3 - - 5 3 │ 2 - - - │ 2 5 │
--- ----- -- -- ---- -- . --... . --- . ---
. . . . .. . . . .
. . . .. .
萧 6 - - - │2 - 3│1 - 21 │ 6 - - 1 6 │5 - 65 3235 │ 6 - - -
--- -- ----
琴 3 - - - │
萧 - - - │

#28楼  回复 引用   

2009-02-16 14:23 by jol[未注册用户]
忘了说了,这个是港版笑傲江湖中的,笑傲江湖曲曲谱!

#29楼[楼主]  回复 引用 查看   

2009-02-16 16:54 by webabcd      
@梁逸晨
:)
就当练打字吧

#30楼[楼主]  回复 引用 查看   

2009-02-16 16:55 by webabcd      
@jol
:)
买个midi键盘更好啊
我觉得从A到Z更好,这样还可以练习打字
翻译乐谱很累啊

#31楼  回复 引用   

2009-02-16 20:26 by yangjinbo[未注册用户]
不错

#32楼  回复 引用 查看   

2009-02-16 21:57 by 5207      
不错,正在练习中

#33楼  回复 引用 查看   

2009-02-16 22:04 by chenkai      
呵呵正在研究Silverlight
先收藏了 楼主好兴致啊 顶一个

#34楼[楼主]  回复 引用 查看   

2009-02-17 08:11 by webabcd      
@yangjinbo
:)
过奖

@5207
:)
呵呵,可以自己翻译几个难点的乐谱

@chenkai
:)
做几个游戏练练手

#35楼  回复 引用 查看   

2009-02-17 16:34 by 狐羽      
强人啊。正需要这些例子。

#36楼[楼主]  回复 引用 查看   

2009-02-17 18:00 by webabcd      
@狐羽
:)
努力多做些

#37楼  回复 引用 查看   

2009-02-20 12:56 by redmoon      
有人可以再接再厉,开发一个乐谱转换器。拿就更完美了。

#38楼[楼主]  回复 引用 查看   

2009-02-20 16:58 by webabcd      
@redmoon
:)
呵呵,可行,解析midi文件,然后转换为这个程序的乐谱

#39楼  回复 引用 查看   

2009-02-25 12:25 by 风海迷沙      
DEMO看不到?

#40楼[楼主]  回复 引用 查看   

2009-02-25 13:20 by webabcd      
@风海迷沙
抱歉,之前不小心把那个xap给删了,现在已经补上了,可以在线看了

多谢提醒

#41楼  回复 引用 查看   

2009-03-02 19:16 by GWPBrian      
很好,佩服,向你学习

#42楼[楼主]  回复 引用 查看   

2009-03-03 07:31 by webabcd      
@GWPBrian
:)
过奖了

#43楼  回复 引用 查看   

2009-03-30 15:21 by GWPBrian      
@webabcd
请教一下,这个在线的Demo怎么弄?
怎么将Silverlight嵌入到cnblogs的随笔中?

#44楼[楼主]  回复 引用 查看   

2009-03-30 18:57 by webabcd      
@GWPBrian
很简单,把你sl项目中的.html测试页中的代码直接贴过来,然后改一下xap的路径就好
比如
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/YYPiano.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>

#45楼  回复 引用 查看   

2009-03-30 20:23 by GWPBrian      
@webabcd
我试过,但是没成。也不知道哪出的问题,xap的路径怎么改啊,默认不是<param name="source" value="ClientBin/YYPiano.xap"/>
改成什么?.XAP文件用上传吗?谢谢!

#46楼  回复 引用 查看   

2009-04-06 00:04 by 琼途      
和老婆晚上玩了好多次,我俩终于卡农全连34164分~~~

#47楼[楼主]  回复 引用 查看   

2009-04-06 07:27 by webabcd      
@琼途
:)
厉害,我可从来没全对过

#48楼  回复 引用 查看   

2009-04-28 20:12 by 二手的程序员      
Mark

#49楼[楼主]  回复 引用 查看   

2009-04-29 07:17 by webabcd      
@二手的程序员
:)
Mark是个好习惯,方便查找

#50楼  回复 引用   

2009-07-02 04:52 by 有容海洋[未注册用户]
为什么我将这个网页传到空间上却打不开了?
可自己在PC上点html的居然能打开
奇怪

#51楼[楼主]  回复 引用 查看   

2009-07-02 07:42 by webabcd      
@有容海洋
嗯。。。
看看xap文件的地址指向的对吗

#52楼  回复 引用 查看   

2010-05-20 13:07 by cathering      
搂主,请教下,为什么那三个桔色椭圆线条有毛刺呢。这是什么问题,怎么解决

#53楼[楼主]  回复 引用 查看   

2010-05-20 17:55 by webabcd      
@cathering
兄弟一说,我也注意到了,不过我也不知道为什么
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1391208 XqHX8wGObmw=