已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们在游戏中经常应用自定义鼠标来提升游戏的画面品质,一个好的游戏怎么能没有好看的鼠标呢,关于Silverlight的各种自定义鼠标的方法很多,而我将为大家带来的是在游戏当中的应用效果,当然了,做法更加游戏化,先看下图:我们期望达到的效果是,鼠标移入不同的对象上显示不同的鼠标效果:在其他的文章中曾经看到过一些做法,都是习惯将一个控件绑定到MainPage的MouseMove上,我所用做法也是一样,但是较之更加“密封”一些,比如先创建一个CursorBase类(我是喜欢直接写代码,而不是用控件老搞定_):publicclassCursorBase:CanvaspublicCursorBase(FrameworkElementparent)parent.MouseMove+=newMouse_MouseMove);parent.Cursor=Cursors.None;Canvas.SetZIndex(this,9999);/将父对象的鼠标移动事件增加到这里voidparent_MouseMove(objectsender,MouseEventArgse)Pointpt=e.GetPosition(senderasUIElement);X=pt.X;Y=pt.Y;/一套简单的坐标控制publicdoubleXgetreturnCanvas.GetLeft(this);setCanvas.SetLeft(this,value);publicdoubleYgetreturnCanvas.GetTop(this);setCanvas.SetTop(this,value);这是一个自定义鼠标的基本类,特别提一下构造函数添加的FrameworkElement,这是代表MainPage的父对象传入,当然了,也可以传入其他的元素做父对象,就要看你要将自定义鼠标应用在什么地方了。但是这只是通过代码写一个控件而已,如果呈现这些图片呢,于是下面再写一个控制类:Model控制类 publicclassCursorControl:CursorBasepublicCursorControl(FrameworkElementparent):base(parent)this.CacheMode=newBitmapCache();this.IsHitTestVisible=false;/添加一个鼠标模型publicvoidAddCursorModel(stringname,FrameworkElementmodel)this (model);if(this.Children.Count!=1)model.Visibility=Visibility.Collapsed;elsemodel.Visibility=Visibility.Visible;model.Name=name;/从图片添加鼠标模型publicvoidAddCursorModelFromImage(stringname,Uriuri)AddCursorModel(name,newImage()Source=newBitmapImage(uri);/正在显示的模型名字stringModelName=默认;/获得正在显示的模型名字publicstringGetCursorModel()returnModelName;/设置要显示的鼠标模型publicvoidSetCursorModel(stringname)foreach(FrameworkElementiteminthis.Children)if(item.Name=name)item.Visibility=System.Windows.Visibility.Visible;ModelName=name;elseitem.Visibility=System.Windows.Visibility.Collapsed;这次直接操作Children集合,好乐买优惠券通过外部添加的方式设置鼠标的不同状态和样式,这个类更多意义是封装了几个方法,以方便我们达到更便捷的操作,通过AddCursorModel增加样式模型,SetCursorModel设置样式模式,在这个基础上,可以使用状态枚举等方式,但是都需要这些方法来操作样式,如果你需要Remove,那么可以简单的自己写一个:)这里有一个特别需要提到的是关于IsHitTestVisible,是用来阻止自定义鼠标的点击测试。下一步,将图片添加到工程当中:现在,我们写一个MyCursor类,构建我们所需要的样式的图片序列。我的鼠标 /我的鼠标publicclassMyCursor:CursorControlpublicMyCursor(FrameworkElementparent):base(parent)base. (默认,newUri(/CustomCursor01;component/Res/Cursor/+0+.png,UriKind.Relative);base.AddCursorModelFromImage(禁止,newUri(/CustomCursor01;component/Res/Cursor/+1+.png,UriKind.Relative);base.AddCursorModelFromImage(攻击,newUri(/CustomCursor01;component/Res/Cursor/+2+.png,UriKind.Relative);base.AddCursorModelFromImage(魔法,newUri(/CustomCursor01;component/Res/Cursor/+3+.png,UriKind.Relative);base.AddCursorModel(等待,newWaitCursor();ThisCursor=this;publicstaticMyCursorThisCursor=null;为了更加方便的控制自定义的鼠标,增加了一个ThisCursor用来保存最新的Cursor,我通常认为界面中只有一个鼠标,所以这样做法更加直接明了,除非你使用了全局的控制方法:)WaitCursor是一个UserControl,里面加入了一些动画和效果,并不是所有的鼠标样式都是图片,而我们的方法中提供了对控件的支持,关于WaitCursor控件请下载源代码自行查看吧。下一步就是如何控制它们,现在我需要布局元素,然后为他们起上名字分别叫Item01、Item02、Item03、Btn_ShowWait,当鼠标移入的时候就可以直接通过ThisCursor来控制。但是,我们怎么能够控制这些样式,怎么在正确的调用SetCursorModel呢,难点在鼠标移入到一个元素,而不知道到底是什么应该触发什么鼠标的样式,为了解决这个问题,我们需要借助Tag这个Silverlight特有的属性。下面截选自Silverlight4.0的离线文档。于是,我们借助了一个小小的属性来完成不可告人之目的,也有更加暴力的方法就是为每个对象都增加一个独立处理的鼠标事件,但是很不好,如果游戏中的对象过多就不好办了,所以,越精简越封装越好。我只需将MainPage.xaml写成这样:在后台的MainPage.cs添加和修改如下代码:MainPage.cs代码 publicpartialclassMainPage:UserControlpublicMainPage()InitializeComponent();InitializeMyPlace();this.CacheMode=newBitmapCache();LayoutRoot.Children.Insert(0,newImage()Source=newBitmapImage(newUri(//Res/map01.jpg,UriKind.Relative);LayoutRoot.Children.Add(newMyCursor(this);publicvoidInitializeMyPlace()Item01.Tag=攻击;Item02.Tag=魔法;Item03.Tag=禁止;Item01.MouseEnter+=newMouseEventHandler(Item_MouseEnter);Item02.MouseEnter+=newMouseEventHandler(Item_MouseEnter);Item03.MouseEnter+=newMouseEventHandler(Item_MouseEnter);Item01.MouseLeave+=newMouseEventHandler(Item_MouseLeave);Item02.MouseLeave+=newMouseEventHandler(Item_MouseLeave);Item03.MouseLeave+=newMouseEventHandler(Item_MouseLeave);Btn_ShowWait.Click+=newRoutedEventHandler(Btn_ShowWait_Click);voidBtn_ShowWait_Click(objectsender,RoutedEventArgse)if(MyCursor.ThisCursor.GetCursorModel()=等待)MyCursor.ThisCursor.SetCursorModel(默认);elseMyCursor.ThisCursor.SetCursorModel(等待);voidItem_MouseEnter(objectsender,MouseEventArgse)MyCursor.ThisCursor.SetCursorModel(senderasFrameworkElement).Tagasstring);voidItem_MouseLeave(objectsender,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论