快捷搜索:

Silverlight游戏设计(Game Design):(十一)梦幻西游(D

无论是单机游戏照样收集游戏,富厚剧情的背后都离不开NPC默默无闻的事情;有的吆喝着卖药卖武器,有的做为宠物常拌阁下,更机动的还可以如《暗黑破坏神》那样,作为随从帮忙杀敌。强大年夜的游戏离不开高智能的AI,而AI的背后则暗藏着更为繁杂的技巧,脚本系统便是其核心。想深入懂得游戏脚本的同伙,我保举涉猎脚本AI与脚本引擎这篇文章。简单的说,脚本,以自力于游戏主法度榜样代码之外为特性,可以让游戏设计者而不是游戏法度榜样员编写和精制大年夜部分的游戏布局,玩家同样可以很随意马虎的溶入到脚本的编写中并创造出一个全新的游戏天下,这统统都展示了脚本简单神奇之美。

本节,我将在上一节创建的梦幻西游天下中添加一些精灵NPC,并为它们附加一些简单的脚本AI,目的是让游戏显得更为生气愿望勃勃,乐趣无边。

在与嵌入式脚本说话Lua & JavaScript的交互这篇文章中,我已很具体的解说了若何实现Silverlight法度榜样与JavaScript脚本的交互。于是,我们首先同样的必要在梦幻西游Demo源码中添加一个JavaScript脚本文件,并在嵌有游戏Demo的Index.htm页面里对该脚本进行调用:

接着,我们还要在法度榜样中加入作为脚本调用工具的一些精灵自身措施;这里,我添加了两种措施:继续随机措辞及继续随意跑动:

///

/// 继续随机措辞

///

///

[ScriptableMember]

public void RandomSay(string content) {

Dialog dialog = new Dialog() {

Duration = 5,

LocatedSpriteWidth = BodyWidth,

Top = BodyTop

};

this.Children.Add(dialog);

dialog.Completed += (s, e) => {

this.Children.Remove(s as Dialog);

HtmlPage.Window.Invoke("RandomSay", this, new int[] { TalkContentCode });

};

dialog.Show(content);

}

///

/// 继续随机跑动

///

///

走动范围动身点X

///

走动范围动身点Y

///

走动范围终点X

///

走动范围终点Y

[ScriptableMember]

public void RandomMoveTo(int startX, int startY, int endX, int endY) {

Random random = new Random();

int x = random.Next(startX, endX);

int y = random.Next(startY, endY);

Point start = this.Coordinate;

Point end = new Point(x, y);

this.destination = end;

double spendTime = Math.Sqrt(Math.Pow((end.X - start.X) / LocatedScene.GridSize, 2) + Math.Pow((end.Y - start.Y) / LocatedScene.GridSize, 2)) * Speed * LocatedScene.GridSize; //谋略总的移动花费

PointAnimation pointAnimation = new PointAnimation() {

To = end,

Duration = new Duration(TimeSpan.FromMilliseconds(spendTime))

};

Storyboard.SetTarget(pointAnimation, this);

Storyboard.SetTargetProperty(pointAnimation, new PropertyPath("Coordinate"));

Move();

StopMovingAnimation();

moveingAnimation = new Storyboard();

moveingAnimation.Children.Add(pointAnimation);

moveingAnimation.Completed += (s, e) => {

RandomMoveTo(startX, startY, endX, endY);

};

moveingAnimation.Begin();

}

必要再次强调,为了能让JavaScript脚本所识别,措施体必须标记为[ScriptableMember]。然后是书写相关脚本,代码截图如下(具体的请查看源码):

着末,我们经由过程在场景Scene.xml设置设置设备摆设摆设文件中为精灵设置响应的脚本参数即可:

Sprites>

Sprite Code="1" Weapon="-1" Mount="-1" X="85" Y="82" Direction="0" Scripts="RandomSay:0"/>

Sprite Code="2" Weapon="-1" Mount="-1" X="87" Y="82" Direction="2" Scripts="RandomSay:1"/>

Sprite Code="1" Weapon="-1" Mount="-1" X="86" Y="78" Direction="4" Scripts="RandomMove:84,75,88,80"/>

Sprite Code="3" Weapon="-1" Mount="-1" X="86" Y="78" Direction="3" Scripts="RandomSay:2_RandomMove:88,79,91,82"/>

Sprites>

当场景初始化后,法度榜样将经由过程如下代码自动解析该场景中每个精灵所持有的脚本:

//调用脚本

sprite.Loaded += (s, e) => {

string str = xSprite.Attribute("Scripts").Value;

if (str != "") {

string[] scripts = str.Split('_');

for (int n = 0; n

string[] values = scripts[n].Split(':');

string[] args = values[1].Split(',');

HtmlPage.Window.Invoke(values[0], sprite, args);

……

}

}

};

脚本引擎的好处显而易见,经由过程在主法度榜样中事先封装好对脚本的解析逻辑,共同上自力于主法度榜样之外的xml数据存储文件加上JavaScript脚本文件即可分层实现。我们不仅可以零丁的为某个精灵付与某个脚本,也可以为其同时付与多个脚本;更有代价的是,因为脚本文件的自力性与外置性(均可作为自力的设置设置设备摆设摆设文件寄放于办事器上),改动时无需从新编译主法度榜样而经由过程记事本即可轻松应对。当然了,有同伙或许会提出质疑,上面的随机措辞脚本彷佛还算凑合,然则随意移动脚本感到牵强了些吧?主法度榜样经由过程类似HtmlPage.Window.Invoke("RandomMove", sprite, new int[] { x1,y1,x2,y2 });的措施调用JavaScript的RandomMove措施,而该RandomMove措施又反回调用Silverlight中的RandomMoveTo措施,这不是范例的吃饱了撑着-没事谋事。着实,本节我是为了向大年夜家演示脚本的动态性与随意组合特点而特意制作的该两个简略单纯的脚本。实际游戏开拓中,脚本会更为繁杂且多变,最直接的例子便是类似《征途》中的跑商义务。假设在游戏中,某个NPC与主角对话后,将骑上代号为5的坐骑,并启动A*寻路移动到特定的目的地坐标。于是我的做法是付与该精灵代号为0的脚本,该脚本的内容如下:

//0号脚本

function Script0(sprite, args) {

sprite.Mount = 5;

sprite.AStarMoveTo(args[0], args[1], args[2], args[3]);

}

意外环境1呈现了,游戏测试时项目经理感觉5号坐骑不敷绚,要求换上8号坐骑,并且让该NPC处于无敌状态,我们该怎么办?很简单,用记事本改动Script0:sprite.Mount = 8; sprite.State = States.Invincible; 就OK了。

意外环境2呈现了,公司老总感觉该精灵在移动历程中应该不绝的随机措辞,话的内容为鼓吹本公司的产品及相关营业,我们该怎么办?很简单,用记事本打开Script.js,为talkContent增添一行,写上公司必要鼓吹的内容,并在Script0中添加:RandomSay(sprite,3);

意外环境3呈现了,NPC移动到目的地后应该急速消掉,而法度榜样员们遗漏落了这点,该怎么办呢?同样很简单,首先在Sprite.cs中将精灵移动完成事故及销毁措施均标记为[ScriptableMember]:

[ScriptableMember]

public event EventHandler MovingCompleted;

[ScriptableMember]

public void Dispose(){…}

接着用记事本改动Script0添加:sprite.MovingCompleted = function(sender,e){sender.Dispose();}即可。

是否简单到不可?嘿嘿,这便是脚本系统的良好性。假如不嫌麻烦,你完全可以为每个NPC精灵设定不合的脚本,而同一个脚本又可以随时随地的进行内部布局逻辑变动;不仅如斯,脚本还可更广泛的感化于场景、邪术、以致主角身上(外挂?^ ^ HOHO),真正实现“心随我动,想怎么动就怎么动”。

说到此,不由又让我想到了Silverlight4中一个彷佛不太起眼却又意义不凡的新特点:新增对9种脚本说话的支持,包括大年夜名鼎鼎的RubyPython。这条讯息犹如Silverlight3中的HLSL衬着一样,必将为Silverlight的开拓供给更大年夜的便捷与机动性,同样也将吸引更多的开拓喜欢者投身此中,由于你总能找到一款对得上你口味的Coding要领;没错,这便是Silverlight!

到此,Silverlight脚本引擎入门就解说完了。随便提示一下,脚本终究不合于游戏主法度榜样说话,它们无需编译带来的是犹如反射般机能上的问题,过度频繁的调用(解析)将会使浏览器耗损持续占用大年夜量的CPU资本,最范例的体现便是浏览器假逝世;是以作为帮助,建议大年夜家照样酌情应用,不要倒置了主次。

下面让我们运行法度榜样,并将主角移动的宽敞的地方(放出的精灵一旦碰着障碍物会自动竣事,当然,逻辑是可以在主法度榜样中随意改动的),测试一下成果吧:

着末,我还想弥补一些关于游戏素材的设定问题,由于这会直接影响到游戏的各方面机能。

不停有同伙反应梦幻西游的Demo彷佛有些卡,问题到底出在哪?是Silverlight机能问题吗?非也,着实病根可回溯到精灵、舆图背景、音乐等方面。首先,主角精灵所用的素材单位图片尺寸为200*200,且由身段、武器、坐骑3部分组成,也便是说同时有3张200*200的图片不停在动。这确凿因为我小我业余光阴有限而无法对每张图片设定偏移量所致的。并且,每个精灵的素材为整图,实际运行时还做了不时的切割处置惩罚,类似如下代码:

if (currentFrame > endFrame) {

currentFrame = startFrame;

}

double translateX = BodyWidth * currentFrame,

translateY = BodyHeight * (int)Direction;

body.Clip = new RectangleGeometry() {

Rect = new Rect() {

X = translateX,

Y = translateY,

Width = BodyWidth,

Height = BodyHeight,

}

};

body.RenderTransform = new TranslateTransform() { X = -translateX, Y = -translateY };

虽然便于简单的编写按需下载模块(Downloader),然则却晦气于鼠标悬停时的Effect效果;由于假云云时对精灵进行衬着,就意味着Silverlight实际上衬着了全部大年夜图,机能耗损可想而知是相称伟大年夜的,大年夜家可以从三国策Demo中体会到。办理法子也并非没有,我们可以经由过程对精灵名字进行高亮凸起或在精灵脚底添加一个光环来标记玩家拾取了该精灵;其次,在舆图方面我采纳2.8D双背景舆图,为了简单起见,前景舆图切片均应用的是PNG款式,带A通道的机能耗损自然更高些。大年夜家着实可以经由过程预先后台处置惩罚的要领对JPG进行去背,在不打断UI线程的条件下同样可以获得完美的出现;再者,经由过程MediaElement去继续播放脚步声彷佛有些杀鸡用牛刀的感到,外加这个音效是从网上获取的,容量大年夜了些,是以在设置设置设备摆设摆设较低的电脑上测试你会发明脚步声常常性的发不出,可见MediaElement进行继续操作时机能耗损也很大年夜。而游戏中除了脚步声外,还有背景音乐等等。着实,游戏只需背景音乐就好了,而脚步声这个华而不实的器械大年夜家还需考虑再三,终究机能是第一位嘛;着末,因为所有代码均在场景编辑器的根基上改动而成,假如必要进行商业话应用,必须去掉落至少一半的无关代码,比如3D场景变更等,并应用更多的Const、ReadOnly以及Static来调换掉落那些公式中的动态参数。综上所述,如能从以上各角度启程并做出精确处置惩罚后,我包管游戏的终极整体机能至少提升50%以上。当然了,风雅的游戏必要更为细腻的游戏设计思维及技术,中游在线的《WOWO天下》便是一款精彩的代表,不远了,MMORPG大年夜作即将粉墨登场,到时让天下一同来见证Silverlight给我们带来的事业!

一口气又写了这么多,总结:脚本系统作为游戏的紧张帮助,对付提升游戏的机动性及拓展性有着伟大年夜的感化,不仅仅作为AI系统的一部分,同样它还能实现更富厚的功能,比如经由过程正则表达式樊篱脏字眼以及代替XML进行数据存储等等。同伙们,Silverlight的游戏天下无比富厚,从速加入到我们的行列中吧,未来或许会因你而改变!

转自:http://www.cnblogs.com/alamiye010/archive/2010/04/25/1719680.html

您可能还会对下面的文章感兴趣: