Silverlight C# 游戏开发:Flyer03大图裁剪,高效动画的艺术
Flyer02最后,我们得到了一个屏幕,上面有云彩向上飘去,但是很容易发现有一个很明显的瑕疵,就是云彩不会限定在一个画面中,那么能不能控制在一个指定的范围内呢。
Sivlerlight中限定一个UIElement的边界,可以使用Clip来实现,在能够显示图片主窗口元素上添加如下代码:
现在再运行一下,看到了吧,是否达到了我们想要的效果了呢?
是不是很有趣,让我们想想,如果能够裁剪的方式获得一个限定区域,那么是不是可以将一组图片的各个部分拆分出来呢?就如资源目录中的filyer.png,能否将每个部分拆分出来显示?Clip完全可以做到,但是并不高效,其原因是,Clip的裁剪并不会减少整张图片的大小,这意味着有多少动作帧内存中就要载入多少张整张图片,很显然,绝不优美,相信玩家也不会为此买内存的单,那么是不是就没有办法了呢?能否有一个好的方法,只加载一个张图片然后处理分成多张小图,对内存的占用就低的多了。
可以通过WriteableBitmap来实现分成小图,WriteableBitmap是Silverlight提供操作Bitmap数据的BitmapSouce,通过这个类可以生成多张指定大小的图片,在内存上不需要加载过多的图,只需要一张大图即可,那么我们的编写思路图如下:
通过截取整张图片当中的一个部分,渲染到WriteableBitmap当中,然后转换成为Image控件的Souce,最后通过一个定时器完成动画效果
一如既往,我们只使用代码实现这个部分,那么需要创造一个类,这个类的名字叫ClassFlyer
代码如下:
void bitmap_ImageOpened(object sender, RoutedEventArgs e)
{
for (int j = 0; j < 6; j++)
{
for (int i = 0; i < 8; i++) {
WriteableBitmap wb = new WriteableBitmap(64,64);
wb.Render(_image, new TranslateTransform()
FlyerFrames[j, i] = (ImageSource)wb; } }
}
最终的目的是得到了一个FlyerFrames的祯组,这组图片涵盖了以行为划分的动画序列,清晰的描述角色们的状态
现在看起来容易多了,实现动画只是找对正确的行和列,建议实现一个简单的枚举,当然了,C#不像C++那般方便的将enum转换成为数字,所以我的实现方法是用const
public const int 向上 = 1;
public const int 向右 = 2;
public const int 向左 = 3;
public const int 向下 = 4;
public const int 击中 = 5;
}
现在下面重要的是动画,动画是按照一个时间的循环,这种有很多方法来实现,在这里为了方便理解,用一个DispatcherTimer
dispatcherTimer.Tick += new EventHandler(TickGameFrameLoop);
dispatcherTimer.Interval = TimeSpan.FromMilliseconds(30); //重复间隔
dispatcherTimer.Start();
private void TickGameFrameLoop(object sender, EventArgs e)
{
}
也许你觉得现在有点意思了,但是还无法实现控制飞行员动作,为了达到这个目的需要为MainPage加上按键事件,
在MainPage类中加上下述代码,然后实现KeyDown和KeyUp的方法,这里做一个特别的说明,为什么还要检测KeyUp,这是因为当玩家松开键盘的时候,可以让飞行员的角色变为正常状态。
this.KeyUp += new KeyEventHandler(MainPage_KeyUp);
在KeyDown和KeyUp事件里,我们可以写下如下代码来控制角色的状态,假设我们之前定为ClassFlyer的实例名为Hero
{
switch (e.Key)
{
case Key.Up:
Hero.Flyerstate = EmFlyerState.向上;
break;
case Key.Down:
Hero.Flyerstate = EmFlyerState.向下;
break;
case Key.Left:
Hero.Flyerstate = EmFlyerState.向左;
break;
case Key.Right:
Hero.Flyerstate = EmFlyerState.向右;
break;
}
}
void MainPage_KeyUp(object sender, KeyEventArgs e)
{
Hero.Flyerstate = EmFlyerState.正常;
}
基本上我们已经接近于完成,但是还有一些细节代码需要整理,在这里就不一一做讲解了,有兴趣的请直接看代码:)
点击这里进行下载:FlyerGame2
Silverlight C# 游戏开发:Flyer03大图裁剪,高效动画的艺术相关推荐
- Silverlight C# 游戏开发:项目开发实例和小技巧索引
Silverlight C# 游戏开发:项目开发实例和小技巧索引 相比于技术文章而言,本索引中包含的都是独立的项目,争取按照每个独立的项目开发来编写系列,全部为原创,开发过程可能语无伦次,可能相当幼稚 ...
- Silverlight C# 游戏开发:Silverlight开发环境
Silverlight C# 游戏开发:Silverlight开发环境 所谓工欲善其事必先利其器,没有好的工具也没有办法做事,我以前曾经想学习C++以外的程序语言,当时有java和C#来选择,当时考虑 ...
- Silverlight C# 游戏开发:方向键的组合,八方向实现
Silverlight C# 游戏开发:方向键的组合,八方向实现 在游戏中,有一种情况是斜向移动,就是同时按下两个方向,形成斜线操作,在Win32GDI开发中,可以通过在逻辑循环里加入键盘状态判断取得 ...
- Silverlight C# 游戏开发:L2 自定义模型导入
Balder的Geometries里提供了很多的已有的模型,比如立方体.圆柱等等,但是我们在开发游戏的时候大多情况下都是使用3D设计工具制作自定义的3D模型,而本篇则介绍的是如何导入显示一个自定义的3 ...
- Silverlight C# 游戏开发:资源的处理,图像算法(二)
Silverlight C# 游戏开发:资源的处理,图像算法(二) 也许说,图像算法很过时,那是许久以前的做法,可是作为Silverlight来说,我认为非常有用,这些有趣的处理就像是在Web上实现了 ...
- Silverlight C# 游戏开发:面向对象在游戏中的实例(一)
本系列所有代码都是使用Microsoft Visual Studio 2008开发,为基于Silverlight的游戏开发技术,如果您看完之后觉得不错,回复顶一下,万分感激:) 今天,我将带来一个非常 ...
- silverlight 3D 游戏开发
http://www.postvision.net/SilverMotion/DemoTech.aspx silverlight 3D 游戏开发 时间:2010-10-22 06:33来源:开心银光 ...
- Silverlight C# 游戏开发:关于精灵for Silverlight容器
Silverlight C# 游戏开发:关于精灵for Silverlight容器 说明:素材来源于网络,版权归版权所有人所有 游戏中的精灵非常常用,spirit这个小玩意具体谁发明的不得而知,从游戏 ...
- Silverlight C# 游戏开发:L5 3D基本的灯光
Silverlight C# 游戏开发:L5 3D基本的灯光 我们在设计和开发3D的时候最常用的就是灯光,它有的时候比摄像机还要重要,一些花哨漂亮的表现主要通过灯光实现,相比场景中只有一个的主要摄像机 ...
- Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣
Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣 今天这套主题,仅仅是通过改进让游戏更加有趣,游戏中的细节永远是耐人寻味,有的游戏团队为此付诸努力甚至成为整个项目的成功关键 ...
最新文章
- 在Windows Server 2008上部署SVN代码管理总结
- dede内容页调用的php,DEDE内容页调用SEO标题、描述、关键字的方法
- javascript的常见对象总结
- Python 中的Pandas库
- SQL 2005 使用row_number来分页
- mysql 5.5.18下载_MySQL5.7.18下载和安装过程图文详解
- 【Servlet】Servlet的多线程并发情况
- 4188元起!华为P40系列国行版发布:买它?
- 林军c语言程序设计第八章,林军主编《C语言程序设计》课后参考答案第一二章.doc...
- PAT 乙级 1029. 旧键盘(20) Java版
- Oracle采用自己的公有云作为ZFS阵列的后端存储
- WindowsApi 解压缩文件
- ajax send()的作用_AJAX(Asynchronous JavaScript And XML)
- j$(function() j$(document).ready 区别
- 50台计算机教室怎样布线,电教室布线技巧有哪些?
- 关于高斯-博内-陈定理
- pycharm 2017.3破解方法
- 增加PRODUCT_BOOT_JARS及类 提供jar包给应用
- 网络攻击更难预料,IoT到底是福是祸?
- 电商评论文本情感分类(中文文本分类)(第二部分-Bert)
热门文章
- 微信小程序之生成图片保存到相册
- angular 模板
- php -i | grep configure,PHP7中I/O模型内核剖析详解
- mysql索引分析_MySQL索引分析和优化
- 可变车道怎么走不违章_郑州街头现可变车道?该咋走?记者实地探访
- mysql-win安装教程,WINDOWS下安装MYSQL教程详解
- MFC Combo-box显示大小
- 【数学与算法】二部图、匈牙利匹配、稳定婚配
- error C3861: “setw”: 找不到标识符
- JDK Long源码