又经过好几天不停地努力,终于可以正常显示游戏页面了。 这次耗了这么长时间,实际上一直都在完善引擎架构,为以后的代码重用做准备。其实这个游戏完全是 XNA 练习作业,所以也不用着急。 照例,这次记录一下比较关键的几点。
半透明效果
XNA 3.0 和 4.0 在做图片半透明处理的时候都要用到 Image Tint Color 这个参数(详见:SpriteBatch.Draw() 中的 color 参数)。 但是,XNA 3.0 和 4.0 最大的不同也在这里,这也直接导致从网上查到的 XNA 3.0 半透明处理方法(设置 Alpha 数值)在 4.0 上毫无作用。XNA 4.0 要用下面这种语法来实现半透明效果。(Opacity = 不透明度,取值范围:[0f, 1f])
TintColor = new Color(R, G, B, A) * Opacity;
动画效果
动画的基本实现方法就是几幅图案轮流显示。这几幅图案可以来自同一张图片,也可以来自不同图片。如果来自同一张图片,需要用到 Image Source Rectangle(详见:SpriteBatch.Draw() 中的 sourceRectangle 参数)。为了编程方便,每一帧的大小都要一样。 下面是例图:(内含 4 个 16x16 像素帧)
字表生成
之前提到过,XNA 只能直接支持很少一部分字符(字母+数字+常用标点,没了)。所以,如果要显示中文或者其他特殊符号,需要自己建立字表,然后编译成字库。 一开始,我的字表包含 2500 常用汉字 + 1000 次常用汉字。结果编译之后发现没有“眺”这个字。(难道不是常用字么?)后来把字表扩大到约 7000 字(GB2312 字表),结果编译失败。说到底,XNA 还是利用字表文件生成一个超大的图像,然后再从图像中截取一个汉字来显示。但是,Windows Phone 7 的 XNA 最大才支持到 4096x2048 像素图像,7000 字的字表已经超过了这个范围。 没办法,自己动手新建一个工程,做了一个字表生成器。每次在故事脚本中添加文字之后都要用字表生成器来重新生成字表文件。但是,好处是这个字表文件编译起来很快,只需要大概一分钟。同时,也保证所有在脚本中出现过的文字都有对应的定义。
下载链接在最下方。
接下来的工作是完善游戏页面 + 制作控制开关。 不得不说,从某种意义上来讲,做游戏是个体力活,尤其是素材收集/处理/制作部分。背景素材还好说,随便去电影动画里面截取一下就好。但是,人物素材嘛,找不到又不会画的话,只能想点折中方案了……