经过三个礼拜的不懈努力(刨去有几天跑团,有几天出去,大概两个礼拜),终于把地图编辑器0.4版做出来了。上次做0.3版时还是二月份的事,那时候我也就刚学MFC。这次也一样,我一边学一边做,总算是完成了。
在Matrix申请的blog也没怎么用过,这次就作为个人原创的第一篇blog吧,也是对自己制作的过程做个记录。
设计:
地图编辑器概述
做这东西的起因,是因为跑团的时候发现法术范围不容易表示,经过简单测试,IRC的脚本可以实现这一点,碰巧那时候在学MFC,就做了一个0.2版的(0.1版的更烂,只给DINO一个人看过),经熊猫,TAGE,ANDOR各位老爷的指点,以及诸位DM的建议,改成现在的0.3版。
其实0.3版也很烂,不过能凑合用而已,一开始的设想是背景色用于法术范围,现在发现,用背景色画地形的DM貌似很多,所以,功能上的定义有一些变化(详情见下)。而且,由于本人初学MFC,经验很少,所以有一些细节没有充实,属于历史遗留问题,这些都会在0.4版中改进。
地图编辑器功能概述
1.地图编辑器是以IRC为基础的,没有IRC以及脚本,便无意义
2.表示地图时,可以利用以下资源:字符(以全角为主)以及颜色,背景色。由于IRC的颜色只有16种,尽管可以自己定制,但是传送的是颜色的控制符,如果其他人使用不同的调色板,看到的显示就不一样,所以一般以默认颜色为主。
3.由于控制符的加入,需要传输的内容比以前大,所以速度会慢一点,这个是没办法的事。如果有人发现生成的脚本有冗余的地方,请指出,我会尽可能的简化。
新版编辑器的功能
由于各位DM在背景色的使用上超出了我的预计,所以我无法设定比较合理的操作流程。所以希望大家能够说出自己的想法,你觉得该怎么操作比较好,尽管提出来,由大家讨论,尽量详细一些,千万不要简单化(我不太善于处理抽象的事物)。而且要在功能多样和操作的简便上有一个折中。 初步设想基础:地形可以用前景+背景表示,生物可以用前景表示,法术范围可以用背景表示(讨论1)。我觉得分开地形、生物、法术,会容易控制一些。界面相关的元素:一个地图的画布(请不要被这个词迷惑,就是那个跟表格一样的东西),一个用于显示图例的列表框(类似于IRC的右边栏,只能单选),一组添加/删除/修改的按钮,一组上移/下移按钮。
操作流程:
a.添加图例的过程都一样,点选添加,出现一个输入框,选择添加地形/生物/法术,输入相关的信息,确定。
b.在地图上画的过程,略有不同,先在列表框选一个图例,如果是地形,那么可以画在任何地方,数量没有限制,可以是分开的;如果是生物,那么只能画一个格或者矩形区域,如果以前已经用这个图例画过了,新画的会删除以前画的(讨论2);如果是法术范围,与地形相同。
c.删除操作相同,删除一个图例会导致地图上相同图例全部消失。
d.一个图例在列表框里的位置,决定了显示的优先权(讨论3),比如地图上有一块石头,一个人站在石头上,如果列表框中人在石头之上,那么人显示,石头只显示背景(如果有的话),如果人在石头下,那么人不显示。
相关讨论
1.也许可以分得更细,也许仍然使用0.3版的设定,总之,操作方便跟功能多样的折中
2.这样就省掉了移动等操作,但是如果有多个地精,就需要定义多个图例,也有不方便的地方。
3.这个还有值得商榷的地方,主要就是俯视一片场地一样,有层次的问题。法术通常为背景,生物总在法术之上,如果有人使用了Obscuring Mist,那么法术该在人之上,我还没想清楚,所以看大家的意见。
考虑过的功能
1.把生物弄成棋子:这个确实考虑过,不过柿子姐姐认为体型变动的情况不少,总改来改去的麻烦,这个需要大家讨论。
2.自动画法术:确定法术范围很容易,PHB上就五种,但是碰到墙等障碍需要附加的处理,这样就需要对地形做更多的规定,从而导致操作复杂度大大增加,所以此特性以放弃为主。
3.隐藏某些图例:陷阱可以提前画,然后设置隐藏,用的时候再改成显示,有人用了隐形术时,也可以这么处理。
4.图例的输出:这样就不会有人问,那个符号什么意思之类的。
历史遗留问题的处理
1.地图尺寸:肯定会扩大,然则这东西占内存,所以在测试后给一个比较合理的大小,初步定为128X128
2.编辑器最大化:这个是我FC,下次一定会做到
3.改用java编写:我放弃了MFC,这东西真不好用,还是java合我的性子,代价就是,大家需要安装JRE5.0,一个15M的东西。
4.存储:因为地图扩大了,而且功能跟以前不一样,所以存储方式要换一个,跟以前的地图不兼容(这个应该没什么问题吧)
制作:
SWT我是初学,对能做到什么不能做到什么也不是很清楚,于是决定边做边改。
SWT里的表格只能按行处理,不能达到我的要求。所以我去sourceforge找了一下,发现swt+table关键字只能找到一个叫ktable的项目,于是check out,看了一下example和代码,发现这个控件功能很强大,而且用途多样,代码也比较复杂,不过设计上很巧妙。但是有一个在我看来致命的缺点,就是速度慢,在演示程序里,一个10*6(显示出来的)的texttable,重画时能明显的看出来(我是CIII800, TNT2, 256SDR),对于地图那样一屏内有几百个格的情况来说,太慢了。所以我决定自己写。在动手之前,我找了一下SWT的优点,发现SWT用的是原生码,我希望能够直接使用原生码编写,这样效率高,于是我看了三天SWT的源码,了解了一下OS包,结果发现一点富余的都没有,于是作罢。然后在eclipse的网站找到一篇文章《Creating Your Own Widgets using SWT》,并且看到一篇有补充性质的文章《开发Eclipse自定义控件》,这两篇文章帮了我非常大的忙。
下面说说遇到的问题。
1.最小化后,再显示出来,速度很快,比ktable快不少,但是使用滚动条时,屏幕闪得厉害,后来尝试用了scroll方法,发现就不那么闪了。
2.滚动条向下向右滚动很正常,向上向左就不对,会多画一行/列表头,只好每次多重画那行/列的单元格
3.与ktable比较时发现,ktable增大size时,只重化新显示出来的那部分,尝试实现未果。用gridlayout+label写了一个,能做到这个效果,但是暴慢,于是放弃,不考虑此问题,毕竟更改size的情况很少。
4.实现了绘制和滚动后,开始做界面,发现gridlayout制作流布局的效果最好,折腾一天终于解决了界面布局。
5.在主界面的main中为DTable增加鼠标事件,发现十分混乱,权衡之后决定重新设计。经历了三四次折腾,成为现在的结构。
6.表格的select,背景用深蓝,前景用白色,那么按下鼠标后移动该如何实现?一开始时用的是一个Rectangle,利用两次重绘,先取消原来的,再画上新的,效果不好,特别晃眼。最后使用两个set,一个是pointToDraw,一个是pointToCancel,先把最新的rect里的点存到pointToDraw,然后用一个临时的set存储Cancel和Draw的交集,然后用这两个removeAll这个临时set,再取消Cancel,画Draw,再把Draw和临时set的并集赋给Cancel。处理速度不错,没有延时的问题。
7.画法术范围,一开始drawFocus时画在紧贴表格线的地方,后来发现画两次focus可以互相抵消,于是就直接画在表格线上,因为表格线太深看不出来,就调浅了。
8.显示地图的时候发现,用半角的字母或者智能ABC里那些●■之类的速度很快,如果换成汉字或者全角的字母,就慢很多,全屏幕的话,时间上要差五倍以上。试着给gc设置一下字体(宋体),就正常了。我担心有些系统没有宋体,就把字体名改成asdf,发现没报异常,速度也正常,十分奇怪,然则跟目标没太大的关系,不管了。
9.画法术范围时,改代码的过程中出现过的现象:先向下后向上滚动,新画出来的法术没有下面那条边;然后是滚动效果完全不对,有时候地图动了,法术没动。最后发现问题的关键,画地图(包括法术范围)时,用的gc是event的,而按下按钮时,画法术范围用的是自己创建的gc,因为按钮事件不提供gc,而且画地图是DTable的事,不能让主界面介入,于是把全部的gc都改成自己建立的,不使用event的,这样就正常了。
10.本来写好了输入框,使用也正常,忽然发现一按esc,输入框跟直接点了确定一样,可是这时候确定按钮明明是灰的,只好改了。
11.添加快捷键,找了差不多两个小时,居然没有实现swt快捷键的,本来菜单能实现快捷键,但是菜单项不能隐藏,于是作罢。对shell加一个KeyAdapter,结果shell不能获得焦点。最后实现一个KeyAdapter,让所有能获得焦点的控件都加上这个,这办法真笨。
12.因为在退出前要提醒是否保存,所以对shell加了个disposeListener,结果无法防止退出,而且也无法禁止那个关闭按钮。用google搜索,总算找到个方法,加一个ShellAdapter,把event的doit给否了就行。
13.打包之后,发现按钮上的图片读不了了,找了两个小时(关键字有问题,而且相关信息确实不多),可以用class.getResourceAsStream读图片,而swt的Image可以直接根据InputStream生成图片,于是就能用了。
14.有一位台湾朋友希望能有繁体的版本,正好java也支持国际化,所以一开始做的时候就那么准备了,只不过繁体字实在不好输入,而且同一个简体字可能对应好几个繁体字,最后找到个窍门,用word转,快捷方便。
15.后来又发现存好的地图读不出来,不对啊,我用的是序列化,怎么可能读不出来?后来发现是eclipse给加的那个什么号惹的祸,把需要序列化的类里面的那个号都清掉,再改动类也没关系了。
总结:
这些都是碰到的比较难缠的问题,更多的细小问题数不胜数,而且我是纯手工编码,除了重构可以自动,代码输入有提示,完全没有其他方便可言。经过这回,我对SWT有了不错的了解,算不上精通,可是再做东西,也难不住我了。这次也暴露出一些问题,我在设计上还缺乏锻炼,控件前后重写了好几遍,浪费了不少时间。代码还不够优秀,可以修改的地方不少,这个也跟设计能力有关,以后有时间要好好改改代码。
下载:请在下载后把扩展名改为rar http://blog.matrix.org.cn/resources/deafwolf/MapEditor.jpg
苹果园的下载http://www.ellesime.net/bbs/index.php?showtopic=5701
05年12月8日首发matrix,07年2月2日转javaeye
分享到:
相关推荐
无限TRPG核心规则2.32正式版.chm
"TRPG角色人物背景故事生成器"是一个专为此目的设计的工具,旨在帮助玩家快速创建丰富多样的角色背景,提高游戏体验。 项目采用了TypeScript(TS)进行编写,TypeScript是JavaScript的一个超集,添加了静态类型系统...
本项目的目的是翻译FFG出品的星球大战TRPG规则书,并编译成CHM文件。HHP文件用于编译CHM文_STAR_WARS_FFG_TRPG_CHINESEHHP文件用于编译CHM文_STAR_WARS_FFG_TRPG_CHINESE.zip
TRPG盒子.apk
实验采用了简化版的TRPG场景,没有涉及NPC的角色,专注于AI如何处理玩家输入并推动故事发展。 ##### 4.2 结果分析 通过对实验数据的分析,研究团队发现: - **合作玩家**:对于合作型玩家,AI能够很好地理解和响应...
《ArnoldC-TRPG:探索ArnoldC中的文本冒险游戏编程》 ArnoldC-TRPG 是一个独特的项目,它将 ArnoldC 这种趣味编程语言与传统的文本冒险游戏(TRPG)相结合,为编程爱好者提供了一种新颖的学习方式。在本文中,我们...
TRPG,全称为Tabletop Role-Playing Game,中文通常称为桌上角色扮演游戏,是一种集策略、角色扮演、叙事和社交元素于一体的游戏形式。玩家通过扮演虚构角色,在游戏主持人(也称GM,Game Master)构建的虚拟世界中...
《tRPG:简单的二维RPG》是一款基于C#编程语言开发的轻量级游戏引擎,专注于构建2D角色扮演游戏。这个项目旨在为初学者和爱好者提供一个学习和实践C#编程以及游戏开发的平台,同时也适合有经验的开发者快速搭建自己...
Berkana是玩TRPG的 Berkana是一种用于轻松玩TRPG的工具。使用该工具,您可以更轻松地管理角色的HP和MP等资源。 Berkana是玩TRPG的有用工具。 使用此工具时,您可以更轻松地管理角色的资源。 Berkana从Dontofu服务器...
オンラインでTRPGができるよ。よ。样本推荐环境谷歌浏览器构建和设置要求Node.js(作者环境は12.6.2) CouchDB(初期データは胜手につくられます) BCDice(どこかにあればいい)设置server/constants.js及びserver/...
FoundryVTT 系统 - 巫师 TRPG#字符表此表格代表玩家角色及其所有统计数据技能标签此选项卡允许您滚动技能并跟踪您的改进点种族和职业选项卡此选项卡用于处理种族和职业。 它允许您滚动专业技能。 您可以创建种族和/...
TRPG,全称为Tabletop Role-Playing Game,是一种玩家通过扮演虚构角色,在设定好的规则下进行的扮演游戏。在本项目“CEN3031的TRPG项目”中,我们可能涉及的是使用Java编程语言来设计和实现一个TRPG游戏系统。这个...
读书笔记:原创圣杯战争TRPG规则书《FateAtrousGrail》
服务器安装环境本项目基于NodeJS ,因此服务器上必须配备NodeJS才能正常运行本服务器。同时本项目使用npm进行包管理... exports = { db : { database : 'trpg' , username : 'root' , password : 'root' , options : {
【标题】中的“用Java编写的TRPG骰子核心逻辑处理项目”是一个基于Java编程语言开发的项目,专注于实现桌面角色扮演游戏(TRPG)中的骰子掷骰逻辑。TRPG是一种集策略、角色扮演和随机事件于一体的游戏,其中骰子掷出...
《DND中文快速查询手册》是一本为玩家和游戏主持人提供的详尽参考资料,涵盖了桌面角色扮演游戏(Tabletop Role-Playing Game,简称TRPG)领域的经典系统——龙与地下城(Dungeons & Dragons,简称DND)。...
Lovely Tactics Hex项目是使用LÖVE2D引擎构建的战术角色扮演游戏(TRPG)开发框架。 启发该项目的主要游戏是《最终幻想战术进阶》(针对GBA),珍妮·达克和《空中足迹》(均针对PSP)。 名称中的“十六进制”是...
利用Mirai框架的Mirai-Console开发TRPG骰子插件模板。目前集成了大部分的常用指令,并在此基础上实现更多的跑团体系优化指令。例如COC7技能详细查询、DND5e技能列表查询、DND5e怪物图鉴等。目前处于测试阶段
- **TRPG 工具**:Yasumi 可能实现了 TRPG 游戏中常用的工具,如骰子掷点模拟(D&D 的 d20 系统或其他系统)、随机名字生成器、角色属性计算器等。 - **日历和提醒**:为了方便玩家安排游戏时间,Yasumi 可能会...
CoC-Trpg做好记录跑过的团和带过的团甚至甚至卫星跑过的团(未按时间顺序排序)2021.3.14模组个人电脑长生之谜许无央流星消逝的那一夜藤沢人帝国的忠犬川澄拓海红与黑与白水川优希自我的呼唤·改龙司春途猫咪宠物...