铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3642|回复: 5

[通用] 复刻版更新的一些记录

[复制链接]
发表于 2013-1-29 16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 weyl 于 2013-7-6 01:05 编辑

近期随着对猪3的一些更新,对原版的引擎也更新了很多东西,现在Google Code上工程的版本号到了65,目前已经基本可以说比较完美了,估计更新的频率会慢下来。

随着最近的这一批更新内容,也零零散散发了几个帖子,这里把它们整合一下,再加上些补充内容。主要的语言是pascal,但是略加修改放到C上面也是没什么问题的。
全部代码可以在 http://code.google.com/p/kys-jedisdl/source/browse/#svn%2Ftrunk 任意查看。如果需要下载其中某个文件,点击进去,并选择View raw file,也可以右键另存来下载。

一、引擎的重要更新

1. 画面的任意拉伸
主要内容见此贴:
http://www.txdx.net/thread-650596-1-1.html
需要注意的是,这是将绘制好的SDL图形转为OpenGL输出的一个方案,目的主要是利用OpenGL的硬件性能。但是使用这个方案时,仅更新屏幕的一部分似乎是不行的,当然OpenGL中确实有仅刷新纹理某个部分的函数,但是经我试验之后发现要注意的地方比较多,而且速度改善并不明显。
因为仅更新一个矩形范围内的内容在此方案中无效,所以可以使用一个手动双缓冲方案,即实际上除了内部的Screen用来绘图之外,用于转换纹理的则是另一个prescreen,具体转换纹理的语句为:
  1. dest.x := x;
  2.   dest.y := y;
  3.   dest.w := w;
  4.   dest.h := h;
  5.     SDL_BlitSurface(screen, @dest, prescreen, @dest);
  6.     glGenTextures(1, @TextureID);
  7.     glBindTexture(GL_TEXTURE_2D, TextureID);
  8.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screen.w, screen.h, 0, GL_BGRA, GL_UNSIGNED_BYTE, prescreen.pixels);
复制代码
这个语句的效率可以不用担心,Blit的速度非常快,耗时几乎可以忽略;而OpenGL如果一秒不能处理几百张纹理也没法做游戏。不过这实际上是一个SDL转OpenGL的方案,可以说是一个附加办法。
在猪3目前的版本中,是引入了一个全局变量来处理刷新范围,在putpixel检查这个范围。这绝对不是一个好方案,但是占用的资源可以小一点(其实对现在的电脑来说,多占个100M谁在乎?),在猪3基本完善后可能也会换成手动缓冲的方案。

2. 更换音效引擎
参看:
http://www.txdx.net/thread-663055-1-1.html
SDL_Mixer本身有大量bug,论坛上所有复刻版,包括基于pascal和lua的全部版本,均存在由这个库导致的打开音乐时无规律跳出现象。
不过libav的授权实际上是比较严格的,虽然不要求付费,但是要求一旦使用了GPL的部分就必须开源(我也不知道哪些属于这个部分)。虽然我跟游泳的鱼基本都是开源,但是我不能要求每个作者都要开源(实际根本没人管)。目前我的处理方案是使用一个游戏适用的音效引擎BASS,这个引擎用法并不复杂,需要修改的地方很少。
换掉SDL_Mixer之后,目前在猪3已经基本杜绝跳出现象了。

3. 场景和战场的处理方式
先生成整体映像,均为SDL的surface,需要时载入其中一部分,利用遮挡值画主角和人物。
其中战场映像将地面和建筑分开,因为不包含动态效果,可以以极快的速度绘制。
而场景映像因为含有动态效果(水面闪烁和动态事件,涉及全部层),因此必要时采用多线程来处理。在场景中,有可能出现一些贴图宽度过大,因此也需要特别处理一下。实际上最彻底的方案是像原版一样每次均采用硬件方式重画。pascal版本中几乎全部是软件方式处理,所以需要一些变通方案。
在第二线程中,不要使用任何刷新屏幕的语句,否则会出现十分奇怪的现象!
需要注意的是,采用预先映像绘图时,需要在场景上方留下足够的地方,否则可能有部分建筑看不到(红颜录中有很明显的这个错误)。同时,在主角走到场景边缘的时候,也需要将整个屏幕先填充为黑色,否则可能出现显示不正常的情况。
大量频繁绘画的部分需要先画为较小的surface(例如半即时的进度条),之后再用blit画到屏幕上。而武功效果仍用的原方法,其实也可以改为使用surface,但是速度提高不明显就没有做。除非你制作mod时需要全屏画效果图,这时如果出现明显拖慢则需要考虑。

4. fpc对宽字串的处理
fpc对宽字串的处理居然是以下注释中提到的方式!好一个透明处理!做fpc的人大概根本没有仔细考虑其他地方的编码!
  1. {$IFDEF fpc}
  2.   //widestring在fpc中的默认赋值动作是将utf8码每字节间插入一个00.
  3.   //此处删除这些0, 同时统计这些0的数目, 若与字串长度相同
  4.   //即认为是一个纯英文字串, 或者是一个直接赋值的widestring,
  5.   //需要再编码为Unicode, 否则即认为已经是Unicode
  6.   len := length(pwidechar(word));
  7.   setlength(word1, len * 2 + 1);
  8.   p1 := @word1[1];
  9.   p2 := pbyte(word);
  10.   k := 0;
  11.   for i := 0 to len - 1 do
  12.   begin
  13.     p1^ := p2^;
  14.     Inc(p1);
  15.     Inc(p2);
  16.     if p2^ = 0 then
  17.     begin
  18.       k := k + 1;
  19.       Inc(p2);
  20.     end
  21.     else
  22.     begin
  23.       p1^ := p2^;
  24.       Inc(p1);
  25.       Inc(p2);
  26.     end;
  27.   end;
  28.   p1^ := 0;
  29.   if k >= len then
  30.   begin
  31.     word2 := UTF8Decode(word1);
  32.     word := @word2[1];
  33.   end;
  34. {$ELSE}

  35. {$ENDIF}
复制代码
5. 两个调色板
为了实现水面闪烁和人物头像不闪烁并存,内部使用了两个调色板,其中第二个自读入开始就不会变化。但是,50指令改写调色板也需要改这里。



二、一些细节

1. 人物的走路方式
主地图和场景内寻路基本沿用的是猪3的方法。为了加快键盘走路速度的响应,定义方向键按下即设置为行走,抬起即设置为不行走,之后对这些地方统一处理。同时,为了令一下一下按键时能精确只走一格,需要设置当只走了一步时,仍然要清键值。
可以设置在主角静止的时候降低帧数,可以让cpu占用率小一点。

2. 主地图上建筑绘画的顺序
参看:
http://www.txdx.net/thread-635242-1-1.html
相比这个方案,目前的中点绘图是比较经济的方法,但是需要注意原版有一座山的y偏移过大(比较明显是在渤泥岛上),因此也需要考虑y偏移。

3. 几个指令的细节问题
播放动画这个指令在后一个参数为-1时,是直接更换主角贴图。因为原来这部分指令写得并不太好,所以改起来有点麻烦。
在播放动画时,全部应当采用循环中时常出现PollEvent的方式,可以避免卡死。参考:http://www.txdx.net/thread-669703-1-1.html

4. 脚本
目前已经将所有基本指令全部封装为脚本,编写时是不区分大小写的。现在也可以用游泳的鱼以前制作的原版的lua文件来运行游戏。这样主要是为了让剧情的编写变得容易。不过KGEdit已经让原本的方案也简单了很多,于是就采取并行存在的方式。

5. 对较早MOD的支持
因为对原有指令和50指令的重现接近完美,因此运行较早的MOD是几乎没有任何问题的,为了降低工作量,将全部较早MOD的数据都写在同一个主程序里面,利用一个ini中可以指定的变量来进行内部的处理。
  1.   MODVersion: integer = 0;
  2.   //0-原版,
  3.   //11-小猪闯江湖, 12-苍龙逐日, 13-金庸水浒传(未包含)
  4.   //21-天书奇侠, 22-菠萝三国(含资料片), 23-笑梦游记, 24-前传(未包含)
  5.   //31-再战江湖,
  6.   //41-PTT
  7.   //51-魏征
复制代码
这样利用扩展数据包配合正确设置的ini文件,可以将全部较早的MOD进行同样的处理。比如我现在在原版里面设定了一个半即时,那么在以上全部mod中就都可以使用(PS:因为MOD本身的数据设定问题,半即时并不一定比回合制就好玩),我将原版移植到了Mac或linux,那么以上全部MOD就同时有了对应版本。

6. AI的设计
目前的AI主要是沿用猪3的AI设计,即攻击时最大化输出,所以AI能打两个就决不打一个,这个AI比之前我随便编的那个强了很多。同时,设计了AI可以使用暗器,用毒,解毒等。AI的主要思路为:
计算全部可以走的位置;
对于全部可以走到的位置,计算攻击范围内每一点的收益,取最大。
实际上就是穷举法。每次AI的计算均返回4个值,即走到的坐标和攻击的坐标。

7. 战场寻路的设计
战场寻路基本沿用猪3的队列寻路的方案,与原版不同的是,敌人身边的格子只能作为终点,这比原版要严格很多。为了避免二次移动时违背上述原则,有两个方案,一是取消二次移动,只能反悔至原位置;二是标记第一次计算的点,在二次移动寻路之后将原本到不了的地方仍标记不能到达。但是第一个方案有些诡异,例如你按下移动之后,多按了一次空格选到了人物原来的地方,那么移动这个选项也会消失。同时为了这个设定完美,必须重新规划人物移动的路线。

8. 50指令的一些细节
读入对话时,最后一个字节应为0,无论是否经过异或均应如此的结果。
生成菜单指令,在大部分老MOD中前面均有另一个画矩形指令,所以有时候会多出一个矩形来。
1C0B90这个地址在原版中记录的是时间的一小时内的部分(居然真有人用)。
显示字串指令在笑梦游记中某个地方的值有明显问题,x坐标写成了负数,原因不明。



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-1-29 17:04 | 显示全部楼层
我也考虑换下音乐引擎。虽然我从来没因为音乐跳出过~
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-1-29 18:59 | 显示全部楼层
为何有魏征巨巨?

点评

魏征是铁血版主原创三大太监MOD之一……  发表于 2013-2-4 21:01
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-1-29 19:00 | 显示全部楼层
为何有魏征巨巨?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-27 10:32 | 显示全部楼层
回复 weyl 的帖子

弱弱的问一下,Blit是什么意思?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-3-27 13:02 | 显示全部楼层
sdl 贴图         
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-3 11:23

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表