铁血丹心

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

[通用] 推测的主地图和内场景的画图顺序

[复制链接]
发表于 2009-9-22 00:38 | 显示全部楼层 |阅读模式
游泳的鱼反汇编得到的贴图顺序是正确的,写在lua版和fishedit中,但是没有注释,完全看不懂……
因此自己推了一个,似乎基本没什么问题,主要的方法就是根据贴图的宽度计算中心位置。之后按照这个中心位置排序。
变量用得有些浪费资源了。

  1. //显示主地图场景于屏幕

  2. procedure DrawMMap;
  3. var
  4.   i1, i2, i, sum, x, y, k: integer;
  5.   temp: array[0..479, 0..479] of smallint;
  6.   width, height: smallint;
  7.   pos: TPosition;
  8.   BuildingList, CenterList: array[0..1000] of TPosition;
  9. begin
  10.   if (SDL_MustLock(screen)) then
  11.   begin
  12.     if (SDL_LockSurface(screen) < 0) then
  13.     begin
  14.       MessageBox(0, PChar(Format('Can''t lock screen : %s', [SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);
  15.       exit;
  16.     end;
  17.   end;

  18.   //由上到下绘制, 先绘制地面和表面, 同时计算出现的建筑数目
  19.   k := 0;
  20.   for sum := -29 to 41 do
  21.     for i := -16 to 16 do
  22.     begin
  23.       i1 := Mx + i + (sum div 2);
  24.       i2 := My - i + (sum - sum div 2);
  25.       Pos := GetPositionOnScreen(i1, i2, Mx, My);
  26.       if (i1 >= 0) and (i1 < 480) and (i2 >= 0) and (i2 < 480) then
  27.       begin
  28.         if (sum >= -27) and (sum <= 28) and (i >= -9) and (i <= 9) then
  29.         begin
  30.           DrawMPic(earth[i1, i2] div 2, pos.x, pos.y);
  31.           if surface[i1, i2] > 0 then
  32.             DrawMPic(surface[i1, i2] div 2, pos.x, pos.y);
  33.         end;

  34.         temp[i1, i2] := 0;
  35.         if building[i1, i2]<> 0 then temp[i1, i2] := building[i1, i2];
  36.         //将主角的位置计入建筑
  37.         if (i1 = Mx) and (i2 = My) then
  38.         begin
  39.           if (InShip = 0) then
  40.             if still = 0 then
  41.               temp[i1, i2] := 2500 + MFace * 7 + MStep
  42.             else
  43.               temp[i1, i2] := 2528 + Mface * 6 + MStep
  44.           else
  45.             temp[i1, i2] := 3714 + MFace * 4 + (MStep + 1) div 2;
  46.           temp[i1, i2] := temp[i1, i2] * 2;
  47.         end;
  48.         if temp[i1, i2] > 0 then
  49.         begin
  50.           BuildingList[k].x := i1;
  51.           BuildingList[k].y := i2;
  52.           width := smallint(Mpic[MIdx[temp[i1, i2] div 2-1]]);
  53.           //根据图片的宽度计算图的中点,为避免出现小数,实际是中点坐标的2倍
  54.           CenterList[k].x := i1 * 2 - (width + 35) div 36 + 1;
  55.           CenterList[k].y := i2 * 2 - (width + 35) div 36 + 1;
  56.           k := k + 1;
  57.         end;
  58.       end
  59.       else
  60.         DrawMPic(0, pos.x, pos.y);
  61.     end;
  62.   //按照中点坐标排序
  63.   for i1 := 0 to k - 2 do
  64.     for i2 := i1 + 1 to k - 1 do
  65.     begin
  66.       if CenterList[i1].x + CenterList[i1].y > CenterList[i2].x + CenterList[i2].y then
  67.       begin
  68.         pos := BuildingList[i1];
  69.         BuildingList[i1] := BuildingList[i2];
  70.         BuildingList[i2] := pos;
  71.         pos := CenterList[i1];
  72.         CenterList[i1] := CenterList[i2];
  73.         CenterList[i2] := pos;
  74.       end;
  75.     end;
  76.   for i := 0 to k - 1 do
  77.   begin
  78.     x := BuildingList[i].x;
  79.     y := BuildingList[i].y;
  80.     Pos := GetPositionOnScreen(x, y, Mx, My);
  81.     DrawMPic(temp[x, y] div 2, pos.x, pos.y);
  82.   end;

  83.   if (SDL_MustLock(screen)) then
  84.   begin
  85.     SDL_UnlockSurface(screen);
  86.   end;
  87.   //SDL_UpdateRect(screen, 0,0,screen.w,screen.h);

  88. end;
复制代码
[发帖际遇]: weyl在华山山谷捡到被令狐冲打落的宝剑,送回给宁女侠,宁女侠感谢万分,送你银两10.


[ 本帖最后由 weyl 于 2009-9-22 00:49 编辑 ]

本帖子中包含更多资源

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

x

评分

参与人数 1声望 +15 收起 理由
黄顺坤 + 15 继续推测

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-9-22 00:46 | 显示全部楼层

内场景的画图顺序

根据反汇编的结果,应是先画无高度的地面,之后有高度地面和建筑,物品,人物,事件一起画出来。目前的复刻版包括fishedit的绘图顺序应都是错误的
坐标的顺序根据反汇编的结果似乎是一列列扫过去,但是看来winson的顺序似乎比较合理

待编辑

[发帖际遇]: weyl去客栈吃饭,碰到郭靖,郭靖请你吃饭,并赠送银两23.


[ 本帖最后由 weyl 于 2009-9-22 00:52 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-22 01:54 | 显示全部楼层
首先感谢weyl回应我的推测并作出努力

其实我认为主地图绘制的问题不大

比较诡异的是场景地图中对高地形(楼梯,恒山派和武道大会之类的高台)的绘制,

其实我想过这种既可看做建筑又可看做地形的东西究竟会不会被绘制2次呢?

如果绘制2次,那么第二次绘制时,一部分地图必须重画,那如何重画才能高效这点让人很想不明白,但更诡异的是如何确认重画范围,如果每个高台都像画主角到场景那样画的话,那是不是太BT了

如果不是,那画法很可能存在超界的可能性

就是是原版的画法高明,还是它本来就存在缺陷而制作者在游戏中故意回避了这些缺陷呢?

例如游戏中的高台都是一大片矩形的,如果这些高台东一个西一个无规则的出现,那会不会超界?

猜测ing~~

[发帖际遇]: winson7891在丽春院喝酒,发掘了人才韦小宝,增加声望5.


[ 本帖最后由 winson7891 于 2009-9-22 02:00 编辑 ]
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-9-22 02:34 | 显示全部楼层
原版中其实是用显存绘图的,先保存所有贴图资源到显存里面,之后在显存里传递。因为显卡运算不占用CPU时间。
复刻版中画主角的方法是我用的,原版和其他版里面都没有。

[发帖际遇]: weyl在华山山谷捡到被令狐冲打落的宝剑,送回给宁女侠,宁女侠感谢万分,送你银两30.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-22 10:50 | 显示全部楼层

你们写的没看懂,搭车问一句

复刻版源码里画建筑之前的判断没看懂,两遍循环,第一遍画地面和地表,记录建筑;第二遍画建筑,可是画之前有个判断不理解。
这里
        if (buildx[i1, i2] > 0) and (((buildx[i1 - 1, i2 - 1] <> buildx[i1, i2]) and (buildx[i1 + 1, i2 + 1] <> buildx[i1, i2]))
          or ((buildy[i1 - 1, i2 - 1] <> buildy[i1, i2]) and (buildy[i1 + 1, i2 + 1] <> buildy[i1, i2]))) then
为啥要在buildx或者buildy和附近的值不一样的时候画建筑,是啥原理呢?

[发帖际遇]: else替小昭千里送信给张无忌,赶到光明顶得到奖励银两12
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2009-9-22 18:52 | 显示全部楼层
这两个坐标是某点上下的值,这是考虑建筑多为菱形,检测到菱形锐角即绘画建筑。基本相当于按中点绘制

[发帖际遇]: weyl去辽东拜祭胡一刀,碰到田归农,被当成胡斐追杀,损失银两14。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-23 12:48 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-9-23 16:08 | 显示全部楼层
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-10-7 11:43 | 显示全部楼层

回复 六当家 的帖子

谢了,我得再结合 fishedit看一下。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2009-10-7 11:52 | 显示全部楼层
我只懂算法的编程。。。。关于贴图。。。。完全不懂。。。。。帮BT同学顶

[发帖际遇]: 孤魂野鬼无意中获得赵敏的木制倚天剑,卖给摆地摊的,获利银两3.
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-23 15:05

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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