<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Some reminiscences, some memories &#187; 游戏</title>
	<atom:link href="http://www.mikespook.com/index.php/tag/%e6%b8%b8%e6%88%8f/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mikespook.com</link>
	<description>Just another boring day</description>
	<lastBuildDate>Thu, 05 Aug 2010 14:36:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Achron，新的战略？</title>
		<link>http://www.mikespook.com/index.php/archives/388</link>
		<comments>http://www.mikespook.com/index.php/archives/388#comments</comments>
		<pubDate>Fri, 28 Aug 2009 02:40:03 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[即时战略]]></category>
		<category><![CDATA[时间旅行]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=388</guid>
		<description><![CDATA[昨天看到Solidot的一篇报道：Solidot &#124; Achron：基于时间旅行的即时战略游戏看起来很有意思的样子。于是晚上抽空看了视频和开发人员的采访（http://www.escapistmagazine.com/videos/view/the-escapist-show/890-Episode-43-Hazardous-Softwares-Achron）。 从视频上看，似乎是将游戏按照时间线进行记录。玩家可以跳转到之前的时间线修改自己的行为，这种修改立刻就会对现有的战斗格局产生影响。看起来很有趣的样子。 不过我觉得，这更类似一种geek行为。或许那些梦想自己能进行时间旅行的geek会热衷于这个游戏。对于普通玩家，这款游戏在时间跳跃的基础上，对于思维的要求明显有些过高了。 我个人还是比较期待这个游戏的，我非常希望知道他们是如何设计时间线逆转这种反常规的行为。尤其是如何平衡游戏可玩度和时间跳跃这种非常逻辑的事情的关系。 记得有一种时间旅行的观点提出，改变一个过去的事件，不会对现有世界、当前时间产生影响。而在改变的那个时间点，世界分叉了。变成了并行的互不干扰的两个平行世界。 这很类似SVN管理的分支概念…… 不扯淡，上图，大家臆想一下： Solidot &#124; Achron：基于时间旅行的即时战略游戏]]></description>
			<content:encoded><![CDATA[<p>昨天看到Solidot的一篇报道：<a class="l" onmousedown="return clk(0,'','','res','4','')" href="http://solidot.org/article.pl?sid=09/08/27/0621203" target="_blank">Solidot | <em>Achron</em>：基于时间旅行的即时战略游戏</a>看起来很有意思的样子。于是晚上抽空看了视频和开发人员的采访（<a href="http://www.escapistmagazine.com/videos/view/the-escapist-show/890-Episode-43-Hazardous-Softwares-Achron" target="_blank">http://www.escapistmagazine.com/videos/view/the-escapist-show/890-Episode-43-Hazardous-Softwares-Achron</a>）。</p>
<p>从视频上看，似乎是将游戏按照时间线进行记录。玩家可以跳转到之前的时间线修改自己的行为，这种修改立刻就会对现有的战斗格局产生影响。看起来很有趣的样子。</p>
<p>不过我觉得，这更类似一种geek行为。或许那些梦想自己能进行时间旅行的geek会热衷于这个游戏。对于普通玩家，这款游戏在时间跳跃的基础上，对于思维的要求明显有些过高了。</p>
<p>我个人还是比较期待这个游戏的，我非常希望知道他们是如何设计时间线逆转这种反常规的行为。尤其是如何平衡游戏可玩度和时间跳跃这种非常逻辑的事情的关系。</p>
<p>记得有一种时间旅行的观点提出，改变一个过去的事件，不会对现有世界、当前时间产生影响。而在改变的那个时间点，世界分叉了。变成了并行的互不干扰的两个平行世界。</p>
<p>这很类似SVN管理的分支概念……</p>
<p>不扯淡，上图，大家臆想一下：</p>
<p><img class="alignnone" title="Achron" src="http://www.mikespook.com/wp-content/uploads/2009/12/2b0b_AchronThroughTime9.jpg" alt="" width="500" height="313" /></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h3 class="r"><a class="l" onmousedown="return clk(0,'','','res','4','')" href="http://solidot.org/article.pl?sid=09/08/27/0621203" target="_blank">Solidot | <em>Achron</em>：基于时间旅行的即时战略游戏</a></h3>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/index.php/archives/388/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SB玩家，大家围观</title>
		<link>http://www.mikespook.com/index.php/archives/366</link>
		<comments>http://www.mikespook.com/index.php/archives/366#comments</comments>
		<pubDate>Tue, 30 Jun 2009 09:35:17 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[My life]]></category>
		<category><![CDATA[SB]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=366</guid>
		<description><![CDATA[别人发群上的，非常搞笑。转到这里，给大家围观一下…… /*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/ 某马甲悄悄的对JJ说：珊瑚舞，怎么才能离开公会啊？ 珊瑚舞悄悄的对[某马甲]说：/GQUIT 珊瑚舞离开了公会。 [公会][幸福晨晨]：？？？ 珊瑚舞加入了公会。 [公会][卡卡呦]：欢迎回来！ [公会][幸福晨晨]：饿&#8230;.. [公会][卡卡呦]：355，你怎么走了？ [公会][珊瑚舞]：毛巾花露水的！有S B害我，问我怎么退出工会。 [公会][幸福晨晨]：那你是怎么回答的？ 珊瑚舞离开了公会。 [公会][幸福晨晨]：？ [公会][卡卡呦]：&#8230;&#8230;汗!! [公会][疯狂暴击]：。。。。。。。 [公会][卡卡哟]：。。。。。。。 珊瑚舞加入了公会。 [公会][卡卡呦]：再次欢迎355回来 [公会][幸福晨晨]：JJ，你怎么又走了？ [公会][珊瑚舞]：少装蒜，还不是你害我！ [公会][幸福晨晨]：我怎么害你了？ [公会][珊瑚舞]：你问我怎么回答退会指令的！ [公会][幸福晨晨]：那你是怎么回答的啊？ 珊瑚舞离开了公会。 [公会][幸福晨晨]：。。。。。这里不适合我?我回火星去了. 幸福晨晨下线了。 珊瑚舞加入了公会。 [公会][卡卡呦]：再次再次欢迎355回来。。。 [公会][疯狂暴击]：毛了毛了,老婆你退来退去的干什么呢？ [公会][珊瑚舞]：。。。有人害我。。。 [公会][疯狂暴击]：？ [公会][珊瑚舞]：他们问我怎么退会 [公会][疯狂暴击]：你怎么回答的？ [公会][珊瑚舞]：。。。你猜？ 疯狂暴击离开了公会。 [公会][珊瑚舞]：毛了毛了。。。BJ和我一样S B！！真没选错人. 疯狂暴击加入了公会。 [公会][珊瑚舞]：哈哈，回来啦？记得下次在前面加个空格哦。 [公会][疯狂暴击]：在什么前面加空格？ 珊瑚舞离开了公会。 [公会][卡卡哟]：。。。服了！！！ [公会][卡卡哟]：在/gquit前面加空格，就行了。 疯狂暴击开了公会 [公会][卡卡哟]：。。。 珊瑚舞加入了公会。 [公会][珊瑚舞]J那个死人呢？！！！ [公会][卡卡哟]：畏罪潜逃了。。。 疯狂暴击加入了公会。 [公会][疯狂暴击]：日，空格键坏了。 [公会][魍魉魑魅俊]：怎么了？ [公会][珊瑚舞]：有人骗我退出工会 [公会][魍魉魑魅俊]：那你怎么回答的？ [...]]]></description>
			<content:encoded><![CDATA[<p>别人发群上的，非常搞笑。转到这里，给大家围观一下……</p>
<p>/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/<span id="more-366"></span></p>
<p>某马甲悄悄的对JJ说：珊瑚舞，怎么才能离开公会啊？<br />
珊瑚舞悄悄的对[某马甲]说：/GQUIT<br />
珊瑚舞离开了公会。<br />
[公会][幸福晨晨]：？？？<br />
珊瑚舞加入了公会。<br />
[公会][卡卡呦]：欢迎回来！<br />
[公会][幸福晨晨]：饿&#8230;..<br />
[公会][卡卡呦]：355，你怎么走了？<br />
[公会][珊瑚舞]：毛巾花露水的！有S B害我，问我怎么退出工会。<br />
[公会][幸福晨晨]：那你是怎么回答的？<br />
珊瑚舞离开了公会。<br />
[公会][幸福晨晨]：？<br />
[公会][卡卡呦]：&#8230;&#8230;汗!!<br />
[公会][疯狂暴击]：。。。。。。。<br />
[公会][卡卡哟]：。。。。。。。<br />
珊瑚舞加入了公会。<br />
[公会][卡卡呦]：再次欢迎355回来<br />
[公会][幸福晨晨]：JJ，你怎么又走了？<br />
[公会][珊瑚舞]：少装蒜，还不是你害我！<br />
[公会][幸福晨晨]：我怎么害你了？<br />
[公会][珊瑚舞]：你问我怎么回答退会指令的！<br />
[公会][幸福晨晨]：那你是怎么回答的啊？<br />
珊瑚舞离开了公会。<br />
[公会][幸福晨晨]：。。。。。这里不适合我?我回火星去了.<br />
幸福晨晨下线了。<br />
珊瑚舞加入了公会。<br />
[公会][卡卡呦]：再次再次欢迎355回来。。。<br />
[公会][疯狂暴击]：毛了毛了,老婆你退来退去的干什么呢？<br />
[公会][珊瑚舞]：。。。有人害我。。。<br />
[公会][疯狂暴击]：？<br />
[公会][珊瑚舞]：他们问我怎么退会<br />
[公会][疯狂暴击]：你怎么回答的？<br />
[公会][珊瑚舞]：。。。你猜？<br />
疯狂暴击离开了公会。<br />
[公会][珊瑚舞]：毛了毛了。。。BJ和我一样S B！！真没选错人.<br />
疯狂暴击加入了公会。<br />
[公会][珊瑚舞]：哈哈，回来啦？记得下次在前面加个空格哦。<br />
[公会][疯狂暴击]：在什么前面加空格？<br />
珊瑚舞离开了公会。<br />
[公会][卡卡哟]：。。。服了！！！<br />
[公会][卡卡哟]：在/gquit前面加空格，就行了。<br />
疯狂暴击开了公会<br />
[公会][卡卡哟]：。。。<br />
珊瑚舞加入了公会。<br />
[公会][珊瑚舞]J那个死人呢？！！！<br />
[公会][卡卡哟]：畏罪潜逃了。。。<br />
疯狂暴击加入了公会。<br />
[公会][疯狂暴击]：日，空格键坏了。<br />
[公会][魍魉魑魅俊]：怎么了？<br />
[公会][珊瑚舞]：有人骗我退出工会<br />
[公会][魍魉魑魅俊]：那你怎么回答的？<br />
[公会][珊瑚舞]：你少忽悠我！<br />
[公会][卡卡哟]：还是我来解释吧，这两个要再说没准又要退会了。<br />
卡卡哟离开了工会。<br />
[公会][珊瑚舞]：哈哈<br />
[公会][疯狂暴击]：。。。<br />
卡卡哟加入了工会。<br />
[公会][疯狂暴击]：退了就别回来了。。。<br />
[公会][卡卡哟]：NND，我的空格键也坏了，没注意。<br />
[公会][疯狂暴击]：哈哈，你也有今天。<br />
[公会][疯狂暴击]：就一个命令，瞧折腾的。下次别打英文命令了，打中文。<br />
[公会][卡卡哟]：中文命令是什么？<br />
疯狂暴击离开了工会。<br />
[公会][卡卡哟]：。。。<br />
[公会][珊瑚舞]：。。。。<br />
疯狂暴击加入了工会。<br />
[公会][疯狂暴击]：谁再和我说话我怒了啊！<br />
[公会][魍魉魑魅俊]：息怒息怒。。。<br />
[公会][卡卡哟]：我不说了。。。<br />
[公会][珊瑚舞]：。。。是不是打“/退出工会”了？<br />
[公会][疯狂暴击]：。。。你打错字了<br />
[公会][珊瑚舞]：哪个字？<br />
[公会][疯狂暴击]：应该是“公会”。<br />
魍魉魑魅俊离开了工会<br />
[公会][疯狂暴击]：。。。这和我没关系。。<br />
[公会][珊瑚舞]：跟我也没关系。。。。<br />
幸福晨晨上线了<br />
魍魉魑魅俊加入了工会<br />
[公会][Gavin]：真是猪头啊~~<br />
[公会][珊瑚舞]：up<br />
[公会][枫舞]：&#8230;&#8230;<br />
[公会][Gavin]：其实还有更加好玩的命令，例如/gdi**and<br />
[公会][珊瑚舞]：什么命令啊？打了一点反应都没有..<br />
[公会][魍魉魑魅俊]：我也是没有反应，ga你在忽悠我们吧？<br />
[公会][幸福晨晨]：/gdi**and<br />
SilverTimes已经成功解散<br />
[1-综合][奥格瑞玛][珊瑚舞]：饿。。。啊啊啊啊啊<br />
[1-综合][奥格瑞玛][Gavin]：=_=<br />
[1-综合][奥格瑞玛][枫舞]：=。=<br />
[1-综合][奥格瑞玛][逍遥]：靠！都给我回来！！！！ga你死定了！！！<br />
[1-综合][奥格瑞玛][Gavin]：= =||谁叫你打的。。。你当会长都不知道这个命令是解散公会的我有什么办法=。=</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/index.php/archives/366/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>在游戏中使用脚本语言</title>
		<link>http://www.mikespook.com/index.php/archives/330</link>
		<comments>http://www.mikespook.com/index.php/archives/330#comments</comments>
		<pubDate>Fri, 22 May 2009 05:55:34 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=330</guid>
		<description><![CDATA[这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。 阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：下载。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。 I have a dream&#8230; 现在要构建一个极为无聊的小世界。说它小，是因为我只打算让它有三个房间，三个房间之间两两互通的门。仅此而已。首先上图： 我们假设左边上面的房间叫 room-1，右边上面的房间叫 room-2，下面的房间叫 room-3。玩家在这三个房间中穿行，当然，不可能是穿墙。人，一定是要走门的。如图。就这么简单的逻辑而已，不用脚本语言也能轻松完成。不过如果希望多来一点拓展性呢？比如，room-3 不允许等级在5级以下玩家进入；room-2 当十级以上玩家进入后就会自动瞬间移动到 room-1；门锁住以后就不能通过，更夸张一点，门锁住以后如果不把锁打坏就不能通过……可能性太多了。不用脚本的情况下，如果要将这么多都实现，是一件非常繁琐的事情。 好吧，让我们来看看那些游戏公司是怎么解决这个问题的。哦，需要说明的是，这里的解决方案仅仅是一个 demo，只用来解释原理。真正的环境中，还要更复杂一点，不过也就是复杂一点点而已。 游戏中实体类如图设计，为了简化期间，没有实体管理器，所以也没有集成自统一的父类。 Ninny 类也就是玩家，有保存当前所在房间的成员变量。Room 类也就是房间，保存有在当前房间的玩家列表。Door 是描述门的类，保存了这个门连接的两个房间的列表。 为了简单期间，demo 中使用了 java 内置的 javascript 作为脚本语言，详情看这里。 本来还想多写一点的，急着出门。算了，反正有代码，大家看看先。有空回头写。重点在 js 目录下的那几个脚本 enterDoor.js，exitDoor.js，enterRoom.js，exitRoom.js。 好，继续！ 为了用起来方便，稍稍封装了一下Scripting的代码。大家直接看代码，不说话： 1 2 3 4 5 6 7 8 9 10 11 12 [...]]]></description>
			<content:encoded><![CDATA[<p>这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。</p>
<p>阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：<a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting.zip">下载</a>。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。</p>
<p>I have a dream&#8230;<span id="more-330"></span></p>
<p>现在要构建一个极为无聊的小世界。说它小，是因为我只打算让它有三个房间，三个房间之间两两互通的门。仅此而已。首先上图：<a href="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif"><img class="alignright size-full wp-image-333" title="三个房间" src="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif" alt="三个房间" width="241" height="241" /></a></p>
<p>我们假设左边上面的房间叫 room-1，右边上面的房间叫 room-2，下面的房间叫 room-3。玩家在这三个房间中穿行，当然，不可能是穿墙。人，一定是要走门的。如图。就这么简单的逻辑而已，不用脚本语言也能轻松完成。不过如果希望多来一点拓展性呢？比如，room-3 不允许等级在5级以下玩家进入；room-2 当十级以上玩家进入后就会自动瞬间移动到 room-1；门锁住以后就不能通过，更夸张一点，门锁住以后如果不把锁打坏就不能通过……可能性太多了。不用脚本的情况下，如果要将这么多都实现，是一件非常繁琐的事情。</p>
<p>好吧，让我们来看看那些游戏公司是怎么解决这个问题的。哦，需要说明的是，这里的解决方案仅仅是一个 demo，只用来解释原理。真正的环境中，还要更复杂一点，不过也就是复杂一点点而已。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1.jpg"><img class="alignleft size-medium wp-image-334" title="类图" src="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1-300x211.jpg" alt="类图" width="300" height="211" /></a>游戏中实体类如图设计，为了简化期间，没有实体管理器，所以也没有集成自统一的父类。</p>
<p>Ninny 类也就是玩家，有保存当前所在房间的成员变量。Room 类也就是房间，保存有在当前房间的玩家列表。Door 是描述门的类，保存了这个门连接的两个房间的列表。</p>
<p>为了简单期间，demo 中使用了 java 内置的 javascript 作为脚本语言，详情看<a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/" target="_blank">这里</a>。</p>
<p><span style="text-decoration: line-through;">本来还想多写一点的，急着出门。算了，反正有代码，大家看看先。有空回头写。重点在 js 目录下的那几个脚本 enterDoor.js，exitDoor.js，enterRoom.js，exitRoom.js。</span></p>
<p>好，继续！</p>
<p>为了用起来方便，稍稍封装了一下Scripting的代码。大家直接看代码，不说话：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.FileNotFoundException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.FileReader</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.logging.Level</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.logging.Logger</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.script.ScriptEngine</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.script.ScriptEngineManager</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.script.ScriptException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Script <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> ScriptEngineManager factory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ScriptEngineManager<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">static</span> ScriptEngine engine <span style="color: #339933;">=</span> factory.<span style="color: #006633;">getEngineByName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;JavaScript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> put<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> key, <span style="color: #003399;">Object</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        engine.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>key, value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> get<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> key<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> engine.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> eval<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> fileName<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ScriptException <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> engine.<span style="color: #006633;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileReader</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;user.dir&quot;</span>, <span style="color: #0000ff;">&quot;.&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;/js/&quot;</span> <span style="color: #339933;">+</span> fileName <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;.js&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">FileNotFoundException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Logger.<span style="color: #006633;">getLogger</span><span style="color: #009900;">&#40;</span>Script.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">log</span><span style="color: #009900;">&#40;</span>Level.<span style="color: #006633;">SEVERE</span>, <span style="color: #000066; font-weight: bold;">null</span>, ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>从类图上可以看到，Door 和 Room 都实现了 Enterable 接口，两个方法：一个入 enter，一个出 exit。显然，当进入一个 Room 的时候，必须从另外一个房间出来。为了保证这个一致性，所以限定玩家不能穿墙只能走门：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">        Room r1 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Room<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Room r2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Room<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room-2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Door d12 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Door<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        d12.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>r1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        d12.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>r2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Ninny player <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Ninny<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ninny&quot;</span>, r1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        d12.<span style="color: #006633;">enter</span><span style="color: #009900;">&#40;</span>player<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>在不用脚本的情况下怎么写这个 Door 的 enter 方法呢？首先判断一下 ninny 是不是跟 Door 在同一个房间；获得 ninny 的当前房间后 exit；获得门另一端的房间 enter。就是这么简单。不过考虑到前面说说的那种种可能性，为了拓展让我们来看一看用脚本是如何处理的：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Door 的 enter 方法</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> enter<span style="color: #009900;">&#40;</span>Ninny ninny<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Room currentRoom <span style="color: #339933;">=</span> ninny.<span style="color: #006633;">getOwner</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// 玩家在当前门所在的房间</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>member.<span style="color: #006633;">containsKey</span><span style="color: #009900;">&#40;</span>currentRoom.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// 门另一侧的房间</span>
        Room nextRoom <span style="color: #339933;">=</span> getAnotherRoom<span style="color: #009900;">&#40;</span>currentRoom<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            Script script <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Script<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            script.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room1&quot;</span>, currentRoom<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            script.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;room2&quot;</span>, nextRoom<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            script.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;door&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            script.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;player&quot;</span>, ninny<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            script.<span style="color: #006633;">eval</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;enterDoor&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;enterDoor: &quot;</span> <span style="color: #339933;">+</span> script.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Boolean</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>script.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ScriptException ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Logger.<span style="color: #006633;">getLogger</span><span style="color: #009900;">&#40;</span>Door.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">log</span><span style="color: #009900;">&#40;</span>Level.<span style="color: #006633;">SEVERE</span>, <span style="color: #000066; font-weight: bold;">null</span>, ex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>        
    <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这里实际上 enter 什么也没有做，只是传递了一些数据到 Script，然后执行了 enterDoor 这个脚本：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Room</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Ninny</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Door</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
room1.<span style="color: #660066;">exit</span><span style="color: #009900;">&#40;</span>player<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
room2.<span style="color: #660066;">enter</span><span style="color: #009900;">&#40;</span>player<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> message <span style="color: #339933;">=</span> player.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; enter from the room &quot;</span> <span style="color: #339933;">+</span> room1.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span>  <span style="color: #3366CC;">&quot; to the romm &quot;</span> <span style="color: #339933;">+</span> room2.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>脚本也很简单，只是让玩家推出当前房间，进入下一个房间。如果房间对进入的玩家有等级要求，则只需：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Room</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Ninny</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
importClass<span style="color: #009900;">&#40;</span>Packages.<span style="color: #660066;">foobar</span>.<span style="color: #660066;">Door</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> message <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>room2.<span style="color: #660066;">needLevel</span> <span style="color: #339933;">&gt;=</span> player.<span style="color: #660066;">level</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    room1.<span style="color: #660066;">exit</span><span style="color: #009900;">&#40;</span>player<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    room2.<span style="color: #660066;">enter</span><span style="color: #009900;">&#40;</span>player<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    message <span style="color: #339933;">=</span> player.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; enter from the room &quot;</span> <span style="color: #339933;">+</span> room1.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span>  <span style="color: #3366CC;">&quot; to the romm &quot;</span> <span style="color: #339933;">+</span> room2.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;!&quot;</span><span style="color: #339933;">;</span>
    result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    message <span style="color: #339933;">=</span> player.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; can't enter the romm &quot;</span> <span style="color: #339933;">+</span> room2.<span style="color: #660066;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;! Level&quot;</span> <span style="color: #339933;">+</span> room2.<span style="color: #660066;">needLevel</span> <span style="color: #339933;">+</span><span style="color: #3366CC;">&quot; needed!&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>在我的例子代码中并没有这部分代码，实际上 Room、Door、Ninny 这几个类都应该从一个父类 Entity 中继承。这个 Entity 有一个 Map<String, Object> 的成员变量。通过 setAttr(String, Object) 和 getAttr(String) 两个方法就可以分别设置和获取每个 Entity 的属性。这样就可以在脚本中自由的使用各种属性来实现各种功能。<br />
通过 Enterable（可进入），Pickable（可捡起），Attackable（可攻击）等接口，调用对应的脚本来完成真正的游戏逻辑。<br />
其实那神秘的游戏脚本化就是这么简单。本来还想画几个序列图说明一下脚本的调用，实在有些困了。<br />
准备洗洗睡觉。尚未补充完整的内容，全当大家进阶学习吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/index.php/archives/330/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Xnova是山寨版的 ogame？ogame 是作强了的山寨版？</title>
		<link>http://www.mikespook.com/index.php/archives/253</link>
		<comments>http://www.mikespook.com/index.php/archives/253#comments</comments>
		<pubDate>Wed, 24 Dec 2008 07:17:04 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[My life]]></category>
		<category><![CDATA[ogame]]></category>
		<category><![CDATA[xnova]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/index.php/archives/253</guid>
		<description><![CDATA[这里要说说 Xnova，哦，就是 ogame 泄露出来的代码。不是技术层面，技术层面没什么好说的。想了解的可以看 http://blog.csdn.net/lanphaday/category/493714.aspx。 最开始知道 ogame 代码泄露，是从赖勇浩（http://blog.csdn.net/lanphaday/）那里听说的。这哥们也够意思，直接给我传了一份代码过来。临近期末，准备课程论文，忙……（数日后） 今日得闲简单研究了一下。 首先要说的是README_GER.TXT 的内容。伴随 google translation 大体了解了Xnova 是什么。这里有两个地方值得注意： LICENCE ======= G.N.U. (Please read LICENCE.txt for more informations) INFORMATIONS ============ OGame Script based on UGamela Developed by XNova Team and XNova-Ugamela-World 第一点说，XNova 是 GNU 协议，也就是 GPL 的。而不是像坊间所传是泄露的代码。所以在安装我手头这份代码显示的诸如“仅供学习研究，不能公开使用”纭纭完全是臆断了。 第二点说，Ogame 是基于 UGamela。我估计是 Ogame 现在的运营公司从Xnova 手中购买了某个版本的代码。不确切，但是就从这个地方来看，是先有了 Xnova 后才有 ogame。 从程序角度来看 Xnova 不算非常优秀。使用 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">这里要说说 Xnova，哦，就是 ogame 泄露出来的代码。不是技术层面，技术层面没什么好说的。想了解的可以看 <a href="http://blog.csdn.net/lanphaday/category/493714.aspx" target="_blank">http://blog.csdn.net/lanphaday/category/493714.aspx</a>。</p>
<p style="text-align: left;">最开始知道 ogame 代码泄露，是从赖勇浩（<a href="http://blog.csdn.net/lanphaday/" target="_blank">http://blog.csdn.net/lanphaday/</a>）那里听说的。这哥们也够意思，直接给我传了一份代码过来。临近期末，准备课程论文，忙……（数日后）<br />
今日得闲简单研究了一下。<br />
首先要说的是README_GER.TXT 的内容。伴随 google translation 大体了解了Xnova 是什么。这里有两个地方值得注意：<br />
LICENCE<br />
=======<br />
G.N.U.<br />
(Please read LICENCE.txt for more informations)</p>
<p>INFORMATIONS<br />
============<br />
OGame Script based on UGamela<br />
Developed by XNova Team<br />
and XNova-Ugamela-World<br />
第一点说，XNova 是 GNU 协议，也就是 GPL 的。而不是像坊间所传是泄露的代码。所以在安装我手头这份代码显示的诸如“仅供学习研究，不能公开使用”纭纭完全是臆断了。<br />
第二点说，Ogame 是基于 UGamela。我估计是 Ogame 现在的运营公司从Xnova 手中购买了某个版本的代码。不确切，但是就从这个地方来看，是先有了 Xnova 后才有 ogame。</p>
<p>从程序角度来看 Xnova 不算非常优秀。使用 php4 编写的典型应用。有不少漏洞，同时在一些执行效率上欠缺考量。我甚至有点怀疑用这个程序，同时在线游戏人数能不能超过1000人。<br />
但是，从另外一个角度来看，在一个简陋的技术环境下建立的游戏，比如 ogame，成为了一个很多人追随的游戏。成功的原因肯定不是因为技术如何如何出色。</p>
<p><strong>游戏策划对于游戏的成败起到决定作用。</strong></p>
<p>所以例如暴雪这么多年作为游戏业的龙头老大，似乎对于游戏开发技术并没有太多建树。反倒是对于游戏题材、类型、内容等贡献颇为深刻。做游戏？反思啊，一定要反思啊！！！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/index.php/archives/253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
