铁血丹心

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

[通用] 主地图上少量亮点以及绘图顺序的问题

[复制链接]
发表于 2012-12-24 22:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 weyl 于 2012-12-25 01:24 编辑

本来我以为是绘图顺序有问题,今天在修改完贴图算法之后,发现仍然没有解决。检查地图文件之后,发现有一些明显不正确的贴图。即原版的数据文件中有很多长和宽都是1的白色像素,目前没有发现这些贴图有任何作用。因此解决方法就是在RLE8部分将长宽小于等于1的贴图屏蔽掉。我是将其中只要有一个为1的就屏蔽了。

主地图的正确绘图顺序代码如下,但是因为原版的建筑引用数据好像有些错误,效果并不及中点排序的方法,因此并未优化。

具体的内容就不解释了,说一下思路:

1. 找出可见部分的建筑并标记,暂定一个顺序。找出这些建筑的引用坐标,这表示该建筑占据了哪些地面。
2. 对所有发现的建筑,搜索其身后,游泳的鱼给的代码好像是只搜索一个坐标,这里是搜索其身后的两个方向,其实更严格和有效率的方法应是只搜索其身后能够出现遮挡的部分,即屏幕上两条垂线之间,见附图。令当前定位的建筑为A,如果发现身后有另一建筑B的引用,则说明B会被A遮挡,应该在A的前面画。这时,需将B在画图顺序中放到A的前面,同时,A到B之间(包括A不包括B)所有的建筑都后移一位。


这个计算可能涉及大量的内存操作,用解释语言会比较慢,可以增加一个序列标记和一个索引标记,索引保存的是序列中相应元素的位置。

例如5个建筑的序列为:
一四三五二
则索引为:
1 5 3 2 4

根据索引定位需要操作的元素,例如,在刚才这个序列中,我们发现建筑五应在建筑四前面,需要处理这个序列,通过索引我们知道建筑五现在第4位,建筑四现在第2位,那么第2到第4就是要操作的,把第4位的建筑五放到第2位,原来的第2位和第3位均后移1位,同时索引要重新编制。
  1. procedure DrawMMap;
  2. var
  3.   i1, i2, i, sum, x, y, k, j1, j2, BAmount, mini1, mini2, swaptemp, a, b, col: integer;
  4.   temp, tempindex: array[0..479, 0..479] of smallint;
  5.   width, height: smallint;
  6.   pos: TPosition;
  7.   List, ListIndex, BuildingPic: array[0..10000] of integer;
  8.   BuildingPos: array[0..10000] 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.   for i1 := 0 to 479 do
  19.     for i2 := 0 to 479 do
  20.     begin
  21.     temp[i1, i2] := -1;
  22.       tempindex[i1, i2] := -1;
  23.     end;

  24.   mini1 := Mx - 16 - 14;
  25.   mini2 := My - 16 - 15;
  26.   k := 0;
  27.   for sum := -29 to 41 do
  28.     for i := -16 to 16 do
  29.     begin
  30.       i1 := Mx + i + (sum div 2);
  31.       i2 := My - i + (sum - sum div 2);
  32.       Pos := GetPositionOnScreen(i1, i2, Mx, My);
  33.       if (i1 >= 0) and (i1 < 480) and (i2 >= 0) and (i2 < 480) then
  34.       begin
  35.         if (sum >= -27) and (sum <= 28) and (i >= -9) and (i <= 9) then
  36.         begin
  37.           DrawMPic(earth[i1, i2] div 2, pos.x, pos.y);
  38.           if surface[i1, i2] > 0 then
  39.             DrawMPic(surface[i1, i2] div 2, pos.x, pos.y);
  40.         end;
  41.       end
  42.       else
  43.         DrawMPic(0, pos.x, pos.y);

  44.       if building[i1, i2] > 0 then
  45.       begin
  46.         List[k] := k;
  47.         ListIndex[k] := k;
  48.         BuildingPos[k].x := i1;
  49.         BuildingPos[k].y := i2;
  50.         BuildingPic[k] := building[i1, i2] div 2;
  51.         temp[i1, i2] := k;
  52.         for j1 := i1 downto mini1 do
  53.         begin
  54.           for j2 := i2 downto mini2 do
  55.           begin
  56.             if j1 + j2 < Mx + My - 29 then
  57.               continue;
  58.             if (BuildX[j1, j2] = i2) and (BuildY[j1, j2] = i1) then
  59.             begin
  60.               tempindex[j1, j2] := k;
  61.             end;
  62.           end;
  63.         end;
  64.         k := k + 1;
  65.       end;
  66.       if (i1 = Mx) and (i2 = My) then
  67.       begin
  68.         List[k] := k;
  69.         ListIndex[k] := k;
  70.         BuildingPos[k].x := i1;
  71.         BuildingPos[k].y := i2;
  72.         temp[i1, i2] := k;
  73.         tempindex[i1, i2] := k;
  74.         if InShip = 0 then
  75.           if still = 0 then
  76.             BuildingPic[k] := 2500 + MFace * 7 + MStep
  77.           else
  78.             BuildingPic[k] := 2528 + Mface * 6 + MStep
  79.           else
  80.             BuildingPic[k] := 3714 + MFace * 4 + (MStep + 1) div 2;
  81.         k := k + 1;
  82.       end;
  83.     end;
  84.   BAmount := k;

  85.   for sum := -29 to 41 do
  86.   begin
  87.     for i := -16 to 16 do
  88.     begin
  89.       i1 := Mx + i + (sum div 2);
  90.       i2 := My - i + (sum - sum div 2);
  91.       if temp[i1, i2] < 0 then
  92.       begin
  93.         continue;
  94.       end;
  95.       for j1 := i1 downto mini1 do
  96.       begin
  97.         for j2 := i2 downto mini2 do
  98.         begin
  99.           if j1 + j2 < Mx + My - 29 then
  100.             continue;
  101.           b := temp[i1, i2];
  102.           a := tempindex[j1, j2];
  103.           if (ListIndex[b] < ListIndex[a]) and (a < BAmount) then
  104.           begin
  105.             swaptemp := List[ListIndex[a]];
  106.             for k := ListIndex[a] downto ListIndex[b] + 1 do
  107.               List[k] := List[k - 1];
  108.             List[ListIndex[b]] := swaptemp;
  109.             for k := 0 to BAmount - 1 do
  110.             begin
  111.               ListIndex[List[k]] := k;
  112.             end;
  113.           end;
  114.         end;
  115.       end;
  116.     end;
  117.   end;

  118.   for i := 0 to BAmount - 1 do
  119.   begin
  120.     x := BuildingPos[List[i]].x;
  121.     y := BuildingPos[List[i]].y;
  122.     Pos := GetPositionOnScreen(x, y, Mx, My);
  123.     DrawMPic(BuildingPic[List[i]], pos.x, pos.y);
  124.   end;

  125.   DrawClouds;

  126.   if (SDL_MustLock(screen)) then
  127.   begin
  128.     SDL_UnlockSurface(screen);
  129.   end;
  130.   //SDL_UpdateRect(screen, 0,0,screen.w,screen.h);

  131. end;
复制代码

评分

参与人数 1声望 +10 收起 理由
winson7891 + 10 感谢努力

查看全部评分

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

占位贴图的话删了就好了吧~无论是从资源删,还是从地图删

有必要花力气再去这样改么?

这样做是不是让以后的开发者更加无所适从呢?

点评

长宽有一个为1的贴图好像真没什么用,屏蔽了也好。  发表于 2012-12-24 23:26
现在的开发者都会自己处理引擎上的问题吧。这些东西只是作为完美复刻的补充罢了,有些实际上已经比较落伍了。  发表于 2012-12-24 23:26
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-3-30 22:55 | 显示全部楼层
回复 weyl 的帖子

今天玩了一下原版,发现一个细节,就是世界地图中的福威镖局上面有个池塘,上面有简单的水波纹的动画,这个动画好像用到了那些1个像素的亮点,难道每个带水的建筑都进行了特殊的水波添加?还有泰山派那个也很明显。

点评

水流效果是调色板变化  发表于 2013-3-31 02:44
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-5-3 09:13

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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