Silverlight MMORPG网页游戏开发课程[一期] 第十四课:完结篇

本文主要是介绍Silverlight MMORPG网页游戏开发课程[一期] 第十四课:完结篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

    英雄的故事将要谢幕,似乎每段传奇都该有个华丽的结局。于是我打算用全新的魔法、炫酷的特效和再一次的重构为这期教程画上句号;虽然依旧伴随着一些客观因素导致的瑕疵,然而更让我欣慰的是这款快被敲烂了的Silverlight MMORPG客户端引擎正逐步迈向成熟。或许Silverlight 5 的新特性能给这款引擎带来质的飞跃,又或者我们更加期待Web 3D 游戏时代的来临,那望眼欲穿的公元2011年春

14.1完结篇[一期] (交叉参考:HLSL自定义渲染特效之完美攻略() HLSL自定义渲染特效之完美攻略() HLSL自定义渲染特效之完美攻略() )

上一节的魔法效果是否已足够打动你的心?或许你会感叹原来Silverlight开发的RPG可以这么美的。其实更奇妙的风景还在下面,为了演绎这场华丽的结局,全新编写的4个魔法旨在换取您的惊叹,一切源于Silverlight,因此您无须复杂的代码照样可以实现绝非简单的游戏特效。

圆月斩,附带HLSL编写的空间扭曲动画效果,技能施放时游戏场景会出现短暂的3D波动效果(空间扭曲动画),这是HLSL给我们所有Silverlight游戏开发者带来的惊喜,2KB成就超绚特效。虽然目前Silverlight 4还无法利用硬件加速进行HLSL渲染,不过令人兴奋的是Moonlight近期已实现对HLSL编写的渲染进行GPU硬件加速,相信同样的效果不久将出现在Silverlight新版本中,相当期待:

落焰斩,多次伤害附加Storyboard实现的屏幕震动模仿地震效果。其中素材由两部分动画拼接而成;一部分是落下的火焰,另一部分是着地后产生的熔岩喷发。为了轻松的处理多对象间的Z轴层次顺序,可借助切分/分离某些图片/动画部件以达到更加逼真的2.5D游戏场景效果:

碧月斩,直线穿梭类型技能,伤害范围为一个多边形,游戏中的激光等魔法同样可以类似处理,另外与圆月斩类似,附带弹开效果:

地裂斩,直线波浪发散逐环伤害,附带Storyboard实现的击飞效果,如能配上很酷的素材可呈现更加壮观的战场画面。

基于不同类型魔法都拥有各异特性,编写方式也就迥然不同。作为一款能够拓展到商业级别的Silverlight RPG游戏Demo,其动画/魔法的配置文件必须在游戏初期/初始化时被动态下载/加载(同一类的所有Info.xml归到一个文件中)。另外,基于结构的考虑,我重构了魔法控件这一大块,不再有Magic类,所有的技能/魔法依旧由Animation创建,而至今所制作的7类技能/魔法均重新继承自携带抽象方法Run且名为MagicBase的基类:

using  System.Collections.Generic;
using  System.Windows;
using  System.Reflection;

namespace  Controls.Base {

    
#region  类

    
public   class  MagicArgs {

        
///   <summary>
        
///  获取或设置代号
        
///   </summary>
         public   int  Code {  get set ; }

        
///   <summary>
        
///  获取或设置出现坐标
        
///   </summary>
         public  Point Coordinate {  get set ; }

        
///   <summary>
        
///  获取或设置目标
        
///   </summary>
         public  Point Target {  get set ; }

        
///   <summary>
        
///  获取或设置Z层次
        
///   </summary>
         public   int  Z {  get set ; }

        
///   <summary>
        
///  获取或设置等级
        
///   </summary>
         public   int  Level {  get set ; }

        
///   <summary>
        
///  获取或设置最小伤害
        
///   </summary>
         public   int  DamageMin {  get set ; }

        
///   <summary>
        
///  获取或设置最大伤害
        
///   </summary>
         public   int  DamageMax {  get set ; }

        
///   <summary>
        
///  获取或设置范围半径
        
///   </summary>
         public   int  Radius {  get set ; }

        
///   <summary>
        
///  获取或设置魔法类型
        
///   </summary>
         public  MagicTypes MagicType {  get set ; }

        
///   <summary>
        
///  获取或设置装饰特效
        
///   </summary>
         public  SpecialEffects SpecialEffect {  get set ; }

        
///   <summary>
        
///  获取或设置附加效果
        
///   </summary>
         public  AdditionalEffects AdditionalEffect {  get set ; }

        
///   <summary>
        
///  获取或设置数量
        
///   </summary>
         public   int  Number {  get set ; }
    }

    
#endregion

    
#region  枚举

    
///   <summary>
    
///  魔法类型
    
///   </summary>
     public   enum  MagicTypes {
        
///   <summary>
        
///  圆形
        
///   </summary>
        CircleMagic  =   ,
        
///   <summary>
        
///  扇形
        
///   </summary>
        SectorMagic  =   1 ,
        
///   <summary>
        
///  十字
        
///   </summary>
        CrossMagic  =   2 ,
        
///   <summary>
        
///  圆发散波浪
        
///   </summary>
        CircleWaveMagic  =   3 ,
        
///   <summary>
        
///  圆多段
        
///   </summary>
        MultipleHitCircleMagic  =   4 ,
        
///   <summary>
        
///  矩形穿梭
        
///   </summary>
        LinearShuttleMagic  =   5 ,
        
///   <summary>
        
///  矩形波浪
        
///   </summary>
        LinearWaveMagic  =   6 ,
    }

    
///   <summary>
    
///  特殊效果
    
///   </summary>
     public   enum  SpecialEffects {
        
///   <summary>
        
///  无
        
///   </summary>
        None  =   - 1 ,
        
///   <summary>
        
///  麻痹
        
///   </summary>
        Mine  =   7 ,
        
///   <summary>
        
///  风切
        
///   </summary>
        Wind  =   8 ,
        
///   <summary>
        
///  灼烧
        
///   </summary>
        Fire  =   9 ,
        
///   <summary>
        
///  冰冻
        
///   </summary>
        Ice  =   10 ,
        
///   <summary>
        
///  爆裂
        
///   </summary>
        Explosion  =   12 ,
        
///   <summary>
        
///  爆裂1
        
///   </summary>
        Explosion1  =   20 ,
    }

    
///   <summary>
    
///  附加效果
    
///   </summary>
     public   enum  AdditionalEffects {
        
///   <summary>
        
///  击伤
        
///   </summary>
        Injure  =   ,
        
///   <summary>
        
///  弹开
        
///   </summary>
        Bounce  =   1 ,
        
///   <summary>
        
///  击飞
        
///   </summary>
        BeKnock  =   2 ,
    }

    
#endregion

    
///   <summary>
    
///  魔法类
    
///   </summary>
     public   abstract   class  MagicBase {

        
#region  属性

        
///   <summary>
        
///  获取或设置参数
        
///   </summary>
         public  MagicArgs Args {  get set ; }

        
///   <summary>
        
///  获取或设置目标精灵集合
        
///   </summary>
         public  List < Sprite >  Targets {  get set ; }

        
#endregion

        
#region  构造

        
public  MagicBase() { 
            Targets 
=   new  List < Sprite > (); 
        }

        
#endregion

        
#region  方法

        
///   <summary>
        
///  触发/运行
        
///   </summary>
        
///   <param name="caster"> 施法者 </param>
        
///   <param name="scene"> 所在场景 </param>
        
///   <param name="args"> 魔法参数 </param>
         public   abstract   void  Run(Sprite caster, Scene scene, MagicArgs args);

        
#endregion

    }
}

剩下的仅仅是当技能/魔法被释放时,通过反射来动态加载并创建对应类型的魔法实例,短短几行代码即轻松搞定任意类型技能/魔法的运行:

         // 开始技能/魔法攻击
         void  sprite_DoCasting( object  sender, DoCastingEventArgs e) {
            Sprite caster 
=  sender  as  Sprite;
            
// 通过反射来加载并实例化各类型魔法
            Assembly assembly  =  Assembly.Load( " Controls,Version=1.0.0.0 " );
            MagicBase magic 
=  assembly.CreateInstance( string .Format( " Controls.Magic.{0} " ,e.MagicArgs.MagicType.ToString()))  as  MagicBase;
            magic.Run(caster, scene, e.MagicArgs);
        }

     到此,整个Controls控件项目库的结构已脉络清晰,关系图如下:

技能/魔法在逻辑处理上变化很大,需要对配置参数更细的划分方能适应,比如类型、子对象个数、伤害特效、爆破时特效、是否持续伤害及间隔等等,某些特殊的魔法甚至作为单独的类存在,当然好处也是相对的,游戏的趣味性与众不同,整体可玩性将大幅度提升。

另外,关于精灵资源的布局一直以来让我头疼不已,目前来说我能想到的较好解决方案仅以下两种:

1、  通过独立存储来保存和配置。

2、  也是本节源码中我所重构的方案,即将每个精灵的资源独立存放在新建的Silverlight应用程序中,这样编译后将产生对应包含该精灵资源的XAP文件,需要时通过动态下载XAP再读取其中图片的方法呈现精灵。过程中需要将资源缓存到内存中以保存这些图片的数据流,相对之前的那些方案,该方案在性能和内存方面都可以达到一个折中且偏上的效果,不仅维护方便,且对于资源来说也起到一定的保密作用:

 

当然,最好的方案我更期待Silverlight 5 为我们提供的3D模型与骨骼动画的原生态支持。

快告一段落了,至今朋友们会发现第一期几乎囊括了MMORPG单机部分的所有功能除了任务系统外。没错,我一直的主张是如果一切都透彻了那就真的失去了继续探索的价值,毕竟当前Silverlight网游开发依旧处于摸索阶段,我和朋友们长期以来都在不断的专研中前行,思索着如何改进与提升。以下也列出了一些个人意见,若想在本课程示例代码上进行更深度的修正以达到较完美境界,还需要补充及完善的内容大致如下:

1、改进及优化动态障碍物系统(包括其中的障碍物碰撞检测、以及精灵AI)。

2、重新封装游戏对象的3个坐标属性以满足各种情况需求:窗口坐标系精确值,游戏坐标系精确值,游戏坐标系整值。

3、编写更多的游戏开发辅助工具以提升效率,比如游戏资源管理器等。

4PNG图片格式在未来软件应用中显得尤为重要,包括8位和24位,甚至它的动画格式MNG,因为无论是2D还是3D;无论是SilverlightFlash还是HTML5;无论是在网页上还是客户端亦或是WP7PNG格式将在未来的2D图像呈现方面长期处于统治地位。

5、更多技巧需要相互的取长补短以习得,做游戏就得从玩游戏开始一点没错。强烈推荐开发者去参考目前已运营的商业游戏,利用浏览器缓存查看它们的资源布局、配置存储、压缩加密以及动画的处理手法等等,高手均诞生于普通人之中,只是看得多了,做的多了就成了师傅,尔耳。

[一期]结束语:一款成功的商业游戏必须具备天时、地利、人和。优秀的美工团队意味着游戏成功了一半,这绝非危言耸听;而像我们这类做程序的则常挂嘴边最多的词不外呼“性能”二字,回归原点,性能的关键取决于细节。完美的画面加上优秀的游戏架构和引人入胜的体验将缔造成功参数中的“人和”,假以时日在那即将载入史册的场景,旷世之巨作莅临终将显得毫无悬念。

牢记这么一句话:成功的秘诀不在别人嘴里,而在你自己手里。

Silverlight网游开发真诚期待您的加入,行动吧!那就从今天开始。

()

本课源码:点击进入目录下载

参考资料:中游在线[WOWO世界] Silverlight C# 游戏开发:游戏开发技术

教程Demo在线演示地址http://silverfuture.cn


原文链接: http://www.cnblogs.com/alamiye010/archive/2010/12/22/1914235.html

转载于:https://my.oschina.net/chen106106/blog/43609

这篇关于Silverlight MMORPG网页游戏开发课程[一期] 第十四课:完结篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/387243

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者