Silverlight 2.5D RPG游戏技巧与特效处理:(二十)副本系统

  前段时间晚上把小孩哄睡后带着老婆体验了一把《星辰变》,让我印象较深的可怜只有其副本系统,这里想说并不是《星辰变》的副本有多么有趣;相反,其枯燥到了无生趣可言,几乎你每天都得花费2个小时用在那重复重复再重复,屈指可数那3-5个一成不变的副本任务上,所以没几天我们便厌倦了。自从《魔兽世界》开始侵噬中华网游大地那刻,一款网游“副本系统”设计的坏往往被商家定位成事关整个游戏品质的极重要环节。为什么地下城模式的副本总能让玩家遐想连篇、无限回味,每一次的进入都能感受新鲜如初?国产网游所谓的副本却永远若脱离不了具有中国特色的任务模式,能不悲哀?

  副本系统设计很难吗?

  如果你玩过那些带副本的游戏,相信在你脑海中对副本这个概念已不陌生。作为策划而言,副本赋予更多的含义是“团队协作”、“独立性”与“探险精神”,回报更加丰富而神秘,让人向往。在我看来,游戏副本是基于一个特殊的场景搭建的独立空间,辅以诸多规则、限制与达成、触发条件等,配上一个计时器统和而成。网游副本,其最初存在的目的是为了弥补多玩家交互而导致的单个/私人领域体验的缺失,即融入更多单机游戏的特性到网游中。如果将网游的主线任务看做是一个故事的线索,那么副本便是游戏的分支剧情,它通常描述着许多精简却非常饱满而完整故事情节。

  话说编写具体副本类实在是太过瘾,用代码书写故事剧本,感觉贼带劲。如前文所述,副本,我们可以看做是特殊的场景空间配上一些UI(阶段描述,任务叙述,倒计时等文字/图形界面)。

  于是首先第一步还是创建一个基于ObjectBase的副本基类 – InstanceBase:

/// <summary>

/// 副本类型

/// </summary>

public enum InstanceTypes {

/// <summary>

/// 无

/// </summary>

None = -1,

/// <summary>

/// 猎杀蜘蛛魔王

/// </summary>

HuntingSpiderKind = 0,

/// <summary>

/// 神邸秘境

/// </summary>

GodFam = 1,

}

public class AddRolesEventArgs : EventArgs {

public int Num { get; set; }

public int Mode { get; set; }

public States State { get; set; }

public Professions Profession { get; set; }

public TacticAIs TacticAI { get; set; }

}

public class LeaveEventArgs : EventArgs {

public Teleport Destination { get; set; }

}

/// <summary>

/// 副本基类

/// </summary>

public abstract class InstanceBase : ObjectBase {

/// <summary>

/// 添加角色(测试用)

/// </summary>

public event EventHandler<AddRolesEventArgs> AddRoles;

/// <summary>

/// 脱离副本

/// </summary>

public event EventHandler<LeaveEventArgs> Leave;

protected Grid grid = new Grid();

protected TextBlock title = new TextBlock() { Foreground = new SolidColorBrush(Colors.Red), FontSize = 24 };

protected TextBlock description = new TextBlock() { Foreground = new SolidColorBrush(Colors.White), FontSize = 22, TextWrapping = TextWrapping.Wrap };

protected TextBlock additionalInformation = new TextBlock() { Foreground = new SolidColorBrush(Colors.Orange), FontSize = 20 };

protected DispatcherTimer checkTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(500) };

protected DispatcherTimer countdownTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };

///<summary>副本所属空间</summary>

protected Space space;

///<summary>参与副本的所有玩家</summary>

protected List<RoleBase> players;

public InstanceBase() {

this.IsHitTestVisible = false;

RowDefinition row = new RowDefinition();

grid.RowDefinitions.Add(row);

grid.Children.Add(title); Grid.SetRow(title, 0); title.HorizontalAlignment = HorizontalAlignment.Center;

row = new RowDefinition();

grid.RowDefinitions.Add(row);

grid.Children.Add(description); Grid.SetRow(description, 1); description.HorizontalAlignment = HorizontalAlignment.Center;

row = new RowDefinition();

grid.RowDefinitions.Add(row);

grid.Children.Add(additionalInformation); Grid.SetRow(additionalInformation, 2); additionalInformation.HorizontalAlignment = HorizontalAlignment.Center;

this.Children.Add(grid); Canvas.SetTop(grid, 85);

checkTimer.Tick += new EventHandler(StepCheck);

countdownTimer.Tick += new EventHandler(Countdown);

AdaptiveWindowSize();

}

/// <summary>

///
获取或设置是否触发各阶段机关

/// </summary>

public bool[] TriggerOrgan { get; set; }

protected void AddRolesEvent(AddRolesEventArgs e) {

if (AddRoles != null) { AddRoles(this, e); }

}

protected void LeaveEvent(LeaveEventArgs e) {

if (Leave != null) { Leave(this, e); }

}

protected abstract void StepCheck(object sender, EventArgs e);

protected abstract void Countdown(object sender, EventArgs e);

/// <summary>

/// 触发/运行

/// </summary>

public abstract void Run(List<RoleBase> players, Space space);

/// <summary>

/// 设置动画描述文本

/// </summary>

/// <param name="value"></param>

protected void SetDescription(string value) {

if (description.Text != value) {

description.Text = value;

GlobalMethod.RunEffectAnimation(description, new RadialBlur(), false, false, "Progress", 0, 100, TimeSpan.FromMilliseconds(1800), new ExponentialEase() { EasingMode = EasingMode.EaseIn }, true);

}

}

/// <summary>

/// 自适应游戏窗口尺寸

/// </summary>

public virtual void AdaptiveWindowSize() {

grid.Width = Application.Current.Host.Content.ActualWidth;

}

/// <summary>

/// 离开

/// </summary>

protected void Exit(string titleText) {

Dispose(this, null);

title.Text = titleText;

description.Text = "5秒后自动离开副本";

GlobalMethod.RunEffectAnimation(title, new Ripple(), false, false, "Progress", 0, 100, TimeSpan.FromMilliseconds(2000), new ExponentialEase() { EasingMode = EasingMode.EaseOut }, true);

GlobalMethod.SetTimeout(delegate {

//退出

LeaveEvent(new LeaveEventArgs() { Destination = new Teleport() { Instance = InstanceTypes.None, ToSpace = 0, ToDirection = Directions.SouthEast, ToCoordinate = new Point(57, 28) } });

}, 5000);

}



  以本节Demo源码中的副本-【猎杀蜘蛛魔王】(HuntingSpiderKind.cs)为例,首先是定义其中的阶段(用Enum来描述它的故事脉络),这里我用到了中文编码,事实证明了这对于灵活性极大的副本设计来说非常有利于拓展、阅读及维护:

/// <summary>副本阶段(用本土语言枚举非常有利于拓展维护及阅读)</summary>

public enum Steps {

设置右键魔法8级连锁闪电或6级石封箭 = 0,

十二秒内到达传送点 = 1,

等待4秒翼族来袭 = 2,

消灭所有翼族 = 3,

进入传送点到达山的彼岸 = 4,

设置右键魔法为7级陨石坠落 = 5,

等待3秒刺客来袭 = 6,

消灭所有刺客 = 7,

骑上马并移动到59_60附近开启封印 = 8,

在23秒内为武器附上烟火粒子 = 9,

在180秒内消灭蜘蛛魔王 = 10,

副本完成通过传送门离开 = 11,

}

Dictionary<Steps, string> stepExplanation = new Dictionary<Steps, string>() {

{Steps.设置右键魔法8级连锁闪电或6级石封箭, "切换到【主角】菜单,将右键魔法设置为8级【连环闪电】或6级【石封箭】"},

{Steps.十二秒内到达传送点, "传送点已开启,<紧急>请在12秒内穿过石门找到传送点并进入"},

{Steps.等待4秒翼族来袭, "危险!4秒后【翼族】来袭,准备好你的家伙"},

{Steps.消灭所有翼族, "用【连环闪电】或【石封箭】干掉他们"},

{Steps.进入传送点到达山的彼岸, "通过传送点到达山的彼岸"},

{Steps.设置右键魔法为7级陨石坠落, "注意!大规模【守护刺客】将至,将右键魔法设置为7级【陨石坠落】"},

{Steps.等待3秒刺客来袭, "危险!3秒后敌军来袭!!"},

{Steps.消灭所有刺客, "来一杀一,用【陨石坠落】干掉他们"},

{Steps.骑上马并移动到59_60附近开启封印, "【骑上马】并移动到坐标【59,60】附近,点击【主角】菜单中的【开启封印】释放【蜘蛛魔王】!"},

{Steps.在23秒内为武器附上烟火粒子, "<紧急>【蜘蛛魔王】23秒后将出现!快速点击【主角】菜单,为【武器】附上【烟火】粒子效果"},

{Steps.在180秒内消灭蜘蛛魔王, "3分钟内必须消灭【蜘蛛魔王】,否则世界将被瞬间毁灭!!"},

{Steps.副本完成通过传送门离开, "副本完成,从传送门离开"},

};

  副本的故事基于阶段性发展,即完成一个阶段故事才会向下一阶段延续,直到达成该阶段完成头条为止,此时就涉及到副本系统规则的设定、达成判定等处理。我的做法是通过计时器状态机配合倒计时器及角色坐标改变事件来处理所有的逻辑判断,这样的框架性效比极好且能实现任意的副本设计需求:

public Steps Step { get; private set; }

Steps countdownStep;

int secondsRemaining;

public HuntingSpiderKind() {

title.Text = "副本【猎杀蜘蛛魔王】";

TriggerOrgan =

时间: 2024-10-25 22:25:33

Silverlight 2.5D RPG游戏技巧与特效处理:(二十)副本系统的相关文章

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(四)天气系统

如同动态光影一样,天气系统同样为2.5D RPG游戏所不可或缺的元素之一.从视觉角度讲,天气系统让游戏场景空间层次分明,立体感更强:从用户角度讲,天气系统赋予游戏更贴近现实的亲历体验,试想下游戏中的花花草草随风而动,云雾缭绕风雨雷电一切来得自然而平滑,玩家即似身临其境般享受:从功能角度讲,不同的气候状况会对角色及魔法效果产生各异影响,极大的提升游戏趣味性.  模拟相对较真实的天气效果,粒子系统必不可少,天气中的雨.雪.闪电.云雾等均可看做是大量粒子的集合.因此首先我们新建一个名为Particle

Silverlight 2.5D RPG游戏技巧与特效处理:“.NET研究”(四)天气系统

如同动态光影一样,天气系统同样为2.5D RPG游戏所不可或缺的元素之一.从视觉角度讲,天气系统让游戏场景空间层次分明,立体感更强:从用户角度讲,天气系统赋予游戏更贴近现实的亲历体验,试想下游戏中的花花草草随风而动,云雾缭绕风雨雷电一切来得自然而平滑,玩家即似身临其境般享受:从功能角度讲,不同的气候状况会对角色及魔法效果产生各异影响,极大的提升游戏趣味性.  模拟相对较真实的天气效果,粒子系统必不可少,天气中的雨.雪.闪电.云雾等均可看做是大量粒子的集合.因此首先我们新建一个名为Particle

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统

纸娃娃系统,或许大家听起来并不陌生.早在十几年前,当时不论是文字游戏"泥巴(Mud)"或是交友.社交网站,我们只能通过屏幕上的文字来传达与交互信息:随着技术不断进步,2D/3D图形技术高速崛起,通过在基础模型上由客户随意挑选.任意更换各种造型(素材),即可打造出真正属于"自我"独特风格的网络虚拟形象,QQ秀便是我们耳熟能详的代表,更贴近真实的如(RPG)游戏及虚拟现实中的换装/换肤系统同样亦得益于纸娃娃机制. 本节,我将向大家讲解如何最好的实现Silverlight

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(九)粒子系统

粒子系统通常用于三维场景中进行真实环境模拟,比如第四节的天气系统.天气的实现是粒子系统最重要的应用领域之一,所有的一切无论是云.雨.雾,还是落叶.陨石及闪电,都可视作基础粒子:除此之外,游戏中常常还会用到粒子系统来渲染像发光.轨迹等抽象效果.当然,有时简单并不意味着就不能缔造奇迹,比如本节大家将要看到的就是基于简单粒子系统所创建的当下主流2.5D RPG中极其拉风之装备粒子发散动画特效. 一提到Silverlight中的粒子,首先想到的肯定是WriteableBitmap.没错,今天的主角就是它

Silverlight 2.5D RPG游戏技巧与特效处理:(五“.NET研究”)圣赞之HLSL渲染动画

或许大家依旧对上一节中的"黑夜"及"梦回过去"记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)an>作为微软的独门兵器,仅供Direct3D使用.Silverlight无比幸运,从第二个版本开始便已获得了这把旷世利器,虽然目前仅能发挥其不到3层之功力,不过前辈Moonlight近期已向世界宣布全面突破技术壁垒,HLSL的威力提升至7层左右.我们完全可以预料的是,未来Silverlight将手握HLSL,踏着GPU 3D

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画

或许大家依旧对上一节中的"黑夜"及"梦回过去"记忆犹新,追问下去HLSL到底是何方神圣能实现如此炫酷之效果?HLSL(高级着色器语言)作为微软的独门兵器,仅供Direct3D使用.Silverlight无比幸运,从第二个版本开始便已获得了这把旷世利器,虽然目前仅能发挥其不到3层之功力,不过前辈Moonlight近期已向世界宣布全面突破技术壁垒,HLSL的威力提升至7层左右.我们完全可以预料的是,未来Silverlight将手握HLSL,踏着GPU 3D API飞扬驰

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(一)序言

不得不说的事,过年期间用了两个多星期时间将17173首页所推荐的2010年新测的几乎60多款网游彻底的扫荡了一遍:过瘾哪!确实过瘾,好久没玩网游了,一次让我爽个够.快的2小时就到了40级,还有更快的5小时冲到了80级.感慨啊真想长叹一声:天!现在的游戏咋被整成了这样!于是愤愤写下如此感受,仅当到此一游:国产3D网游质量恒古不变,敢问开发商你自己想吐了没?市场上充斥着更多的依旧是2D/2.5D ARPG,换汤不换药,十个开发商有九个都在估量着换个美工班即得款新网游,那招个美工连岂不得登上年度大作?

Silverlight 2.5D RPG游戏技巧与特效处理:(十五)任务剧情

任务是贯穿游戏剧情发展的核心线索,具有极强的多元性.组合性.循环性与随机性:它的设计原则浓缩起来便是:触发-执行-完成.别小看这短短6个字,里面的学问可大了,由什么触发.如何触发的,因素很多:怎样执行.什么样的过程,一切随便:怎么算完成,完成后的奖励是啥,什么都行.而不同的故事背景.不同的操作玩法,在任务设计方面都会大相径庭.比如RPG游戏,角色扮演即是虚拟人生,需要还原一个完整而虚幻的世界,因此它的任务系统通常会被设计得极其丰富,可以比喻:人生有多复杂,RPG的任务系统就有多庞大:又比如SLG

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(十二)魔法系统

世界首款Silverlight – MMORPG:<<窝窝世界>>震撼登场!伴着与XNA合体后的Silverlight 5 强势发布,一波Silverlight网游研发海啸即将席卷全球!  多磨的好事依旧让人激动,于是一不小心写下10款全新的魔法效果旨在祝贺.今天的教程不会让你失望,没错,又是一场超豪华魔法盛宴!接下来您将看到的是本教程ARPG Demo战斗实景,一切灵感与临摹均来源于近期即将内测的2.5D大作<倩女幽魂Online>(以下左边为倩女幽魂实景,右边为De

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(三)动态光影

通常来说,只要谈到影子及影子制作,首先想到的不外乎3D.游戏中的影子设计大致可分为硬实现和软实现两种,比如像"游戏影子制作技术"这篇文章所谈到3D游戏影子制作方案Projective Shadow.Shadow Map以及Shadow Volume均属于硬实现.硬实现的效果最逼真,相对的运算量也较高:而对于Silverlight开发2.5D网游来说,我们通常会采用折中的软实现去表述场景中的动态光影效果.精致的光影能让玩家充分体验到空间立体感,当然也是2.5D网游所不可或缺的条件之一.