性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-4-7 20:20 资料 个人空间 短消息 只看该作者 QQ
上回做了一个方阵人物图,可以用来比较粗糙地确定坐标,但是缺点很多:

1 地图障碍物很多,人只能放到有限的范围里。
2 人物形状复杂,不好确定参考点。

由于上述两条缺点,那个方阵图只能粗糙地确定坐标,但不能给出明确的公式。

于是,在下今天做了这样一个实验:

1 修改解压之后的PMap.e5,使第一个地图(即MMap.e5的41号图)所有坐标皆可放人。

顺便说一下PMap.e5。这是R场景的地形设置。每个场景20016字节,其中前16字节是附加信息,后20000字节是地形(只有F0和FF两种。F0表示有障碍,FF表示无障碍)。但这20000个字节与具体坐标的对应关系还需研究。

2 修改PMapobj.e5的第一张图。用背景色抹掉原图,然后贴着左侧边缘画一条宽度为1的红线。

3 修改Data.e5,使一些人的形象变为0

4 修改MMap.e5的第41张图,变成一个白板。

5 制作一个R_00.eex剧本,在(32,32),(32,48),(32,64),(48,32),(48,48),(48,64),(64,32),(64,48),(64,64)放9个人(这9个人的形象都是0)

6 进入游戏,截图,在PS里精确截出场景(640*400),见附图

7 在PS里读取各红线下端坐标。在Excel里列表

8 对坐标进行线性拟合,得到公式:

(公式里x,y表示屏幕坐标,即在PS里读出的坐标;a,b表示游戏里的坐标)

a=0.0625x+0.125y+4.625
b=0.125y-0.0625x+43.625

注意:这里的x,y表示Pmapobj的左下角的坐标。一般编剧本常用人脚确定位置。粗略地认为两脚之间就是Pmapobj的下端中点。则公式变成:

a=0.0625x+0.125y+3.125
b=0.125y-0.0625x+45.125


图片附件: R.jpg (2005-4-7 20:20, 34.24 K)



顶部
性别:女-离线 叶落秋寒

英国公主监造使谏议大夫

Rank: 12Rank: 12Rank: 12
组别 翰林学士
级别 后将军
功绩 447
帖子 1572
编号 108
注册 2005-1-29
来自 天界




QUOTE:
8 对坐标进行线性拟合,得到公式:

(公式里x,y表示屏幕坐标,即在PS里读出的坐标;a,b表示游戏里的坐标)

a=0.0625x+0.125y+4.625
b=0.125y-0.0625x+43.625

注意:这里的x,y表示Pmapobj的左下角的坐标。一般编剧本常用人脚确定位置。粗略地认为两脚之间就是Pmapobj的下端中点。则公式变成:

a=0.0625x+0.125y+3.125
b=0.125y-0.0625x+45.125

这个横坐标当初偶是算过滴,应该是无误滴,等有空偶来试试纵坐标


顶部
性别:女-离线 叶落秋寒

英国公主监造使谏议大夫

Rank: 12Rank: 12Rank: 12
组别 翰林学士
级别 后将军
功绩 447
帖子 1572
编号 108
注册 2005-1-29
来自 天界


zengpoem,偶根据你给滴公式把坐标器写了一下,我这只有导出的场景图,没有游戏了,只能看到大概,觉得差不多,所以就将你的两种计算方法全放在里面,你可以进游戏后截个图出来试一试看看。

应该偏差不大吧,偶用肉眼看了许久,好像是滴

坐标器见附件


附件: 曹操传地图坐标简易查看器.exe (2005-4-7 22:04, 36 K)
该附件被下载次数 593
顶部
性别:男-离线 peacockwang

Rank: 7Rank: 7Rank: 7Rank: 7
组别 羽林都尉
级别 破虏将军
好贴 1
功绩 75
帖子 776
编号 30530
注册 2005-1-18
来自 秦——长安
家族 轩辕学院


发表于 2005-4-8 08:24 资料 文集 短消息 只看该作者
加油!热切等待坐标查看器的出现!
顶部
性别:男-离线 peacockwang

Rank: 7Rank: 7Rank: 7Rank: 7
组别 羽林都尉
级别 破虏将军
好贴 1
功绩 75
帖子 776
编号 30530
注册 2005-1-18
来自 秦——长安
家族 轩辕学院


发表于 2005-4-8 08:35 资料 文集 短消息 只看该作者
试了下,效果不错,
提个建议,用鼠标在地图上找坐标的时候,
将箭头能否换成曹操的形象,可以找坐标更直观一点。
顶部
性别:男-离线 博雅张生
(张生手持石鼓文)

象郡公中书令枢密直学士

Rank: 19Rank: 19Rank: 19Rank: 19
资政殿大学士(从一品)
组别 经略使
级别 前将军
好贴 3
功绩 1118
帖子 1730
编号 28805
注册 2004-12-26


发表于 2005-4-8 11:44 资料 个人空间 短消息 只看该作者 QQ


QUOTE:
原帖由peacockwang于2005-04-08, 8:35:15发表
试了下,效果不错,
提个建议,用鼠标在地图上找坐标的时候,
将箭头能否换成曹操的形象,可以找坐标更直观一点。

有道理。从Pmapobj中截出一张48*64的人物图作为鼠标指针,以左下角为参考点。用第一个公式,基本上就是所见即所得了。

另外战场的坐标查看也改一改吧,直接查看大地图,指针可以用白框,就像游戏里面一样。
顶部
性别:男-离线 peacockwang

Rank: 7Rank: 7Rank: 7Rank: 7
组别 羽林都尉
级别 破虏将军
好贴 1
功绩 75
帖子 776
编号 30530
注册 2005-1-18
来自 秦——长安
家族 轩辕学院


发表于 2005-4-8 12:43 资料 文集 短消息 只看该作者


QUOTE:
原帖由zengpoem于2005-04-08, 11:44:29发表

QUOTE:
原帖由peacockwang于2005-04-08, 8:35:15发表
试了下,效果不错,
提个建议,用鼠标在地图上找坐标的时候,
将箭头能否换成曹操的形象,可以找坐标更直观一点。

有道理。从Pmapobj中截出一张48*64的人物图作为鼠标指针,以左下角为参考点。用第一个公式,基本上就是所见即所得了。

另外战场的坐标查看也改一改吧,直接查看大地图,指针可以用白框,就像游戏里面一样。

可以在右下加个选择项,表明四个方向,分别为四个方向的人物形象,
而后在背景地图上查询坐标,更方便点。
顶部
性别:男-离线 peacockwang

Rank: 7Rank: 7Rank: 7Rank: 7
组别 羽林都尉
级别 破虏将军
好贴 1
功绩 75
帖子 776
编号 30530
注册 2005-1-18
来自 秦——长安
家族 轩辕学院


发表于 2005-4-8 19:28 资料 文集 短消息 只看该作者
最好将中国地图的察看器也加入进去!当然鼠标还是要换成人物头像的。
顶部
性别:男-离线 jsnjlxw

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 12
编号 113469
注册 2007-2-26


发表于 2007-4-13 22:32 资料 短消息 只看该作者
为什么我打开查看器没反应?
顶部
性别:男-离线 神的儿子

Rank: 5Rank: 5
组别 士兵
级别 安国将军
功绩 8
帖子 815
编号 140361
注册 2007-4-16
来自 天堂


我在做剧本的时侯把内场景编辑器打开, 那样我就自然的知道坐标了.
顶部
性别:男-离线 WHITESHIP

★★
谏议大夫

Rank: 16
组别 翰林学士
级别 征北将军
功绩 380
帖子 4210
编号 170977
注册 2007-6-3
家族 轩辕学院


发表于 2013-2-15 13:26 资料 个人空间 短消息 只看该作者
补充下游戏里的计算代码

先列出汇编代码,这段代码全是计算,看得倍儿晕,我用IDA转成C才看懂,C代码贴在后面了。
汇编代码只做几个注释。

4272C5函数只会依次根据人物的坐标计算位置,并不会对20000个字节依次计算。

004272C5  /$  55            PUSH EBP
004272C6  |.  8BEC          MOV EBP,ESP
004272C8  |.  83EC 10       SUB ESP,10
004272CB  |.  56            PUSH ESI
004272CC  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]              读取人物的横坐标
004272CF  |.  33C9          XOR ECX,ECX
004272D1  |.  66:8B08       MOV CX,WORD PTR DS:[EAX]

004272D4  |.  C1E1 03       SHL ECX,3
004272D7  |.  66:894D F0    MOV WORD PTR SS:[EBP-10],CX
004272DB  |.  8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]              读取人物的纵坐标
004272DE  |.  33C0          XOR EAX,EAX
004272E0  |.  66:8B02       MOV AX,WORD PTR DS:[EDX]

004272E3  |.  6BC0 F8       IMUL EAX,EAX,-8
004272E6  |.  66:8945 FC    MOV WORD PTR SS:[EBP-4],AX
004272EA  |.  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
004272ED  |.  81E1 FFFF0000 AND ECX,0FFFF
004272F3  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
004272F6  |.  81E2 FFFF0000 AND EDX,0FFFF
004272FC  |.  03CA          ADD ECX,EDX
004272FE  |.  66:894D F8    MOV WORD PTR SS:[EBP-8],CX
00427302  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00427305  |.  33C9          XOR ECX,ECX
00427307  |.  66:8B08       MOV CX,WORD PTR DS:[EAX]
0042730A  |.  8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
0042730D  |.  33C0          XOR EAX,EAX
0042730F  |.  66:8B02       MOV AX,WORD PTR DS:[EDX]
00427312  |.  03C8          ADD ECX,EAX
00427314  |.  C1E1 02       SHL ECX,2
00427317  |.  8B55 10       MOV EDX,DWORD PTR SS:[EBP+10]
0042731A  |.  81E2 FFFF0000 AND EDX,0FFFF
00427320  |.  C1E2 03       SHL EDX,3
00427323  |.  2BCA          SUB ECX,EDX
00427325  |.  66:894D F4    MOV WORD PTR SS:[EBP-C],CX
00427329  |.  8B75 F8       MOV ESI,DWORD PTR SS:[EBP-8]
0042732C  |.  81E6 FFFF0000 AND ESI,0FFFF
00427332  |.  6A 08         PUSH 8                                   ; /Arg1 = 00000008
00427334  |.  E8 7DF8FFFF   CALL 00426BB6                    
00427339  |.  83C4 04       ADD ESP,4
0042733C  |.  25 FFFF0000   AND EAX,0FFFF
00427341  |.  C1E0 03       SHL EAX,3
00427344  |.  99            CDQ
00427345  |.  2BC2          SUB EAX,EDX
00427347  |.  D1F8          SAR EAX,1
00427349  |.  8D4406 F8     LEA EAX,DWORD PTR DS:[ESI+EAX-8]
0042734D  |.  66:8945 F8    MOV WORD PTR SS:[EBP-8],AX
00427351  |.  33C9          XOR ECX,ECX
00427353  |.  66:8B0D B4CE4>MOV CX,WORD PTR DS:[49CEB4]              49CEB4=60
0042735A  |.  C1E1 03       SHL ECX,3
0042735D  |.  66:8B55 F8    MOV DX,WORD PTR SS:[EBP-8]
00427361  |.  66:2BD1       SUB DX,CX
00427364  |.  66:8955 F8    MOV WORD PTR SS:[EBP-8],DX
00427368  |.  33C0          XOR EAX,EAX
0042736A  |.  66:A1 B6CE490>MOV AX,WORD PTR DS:[49CEB6]              49CEB6=25
00427370  |.  8D0CC5 F8FFFF>LEA ECX,DWORD PTR DS:[EAX*8-8]
00427377  |.  66:8B55 F4    MOV DX,WORD PTR SS:[EBP-C]
0042737B  |.  66:2BD1       SUB DX,CX
0042737E  |.  66:8955 F4    MOV WORD PTR SS:[EBP-C],DX
00427382  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00427385  |.  66:8B4D F8    MOV CX,WORD PTR SS:[EBP-8]
00427389  |.  66:8908       MOV WORD PTR DS:[EAX],CX
0042738C  |.  8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
0042738F  |.  66:8B45 F4    MOV AX,WORD PTR SS:[EBP-C]
00427393  |.  66:8902       MOV WORD PTR DS:[EDX],AX
00427396  |.  5E            POP ESI
00427397  |.  8BE5          MOV ESP,EBP
00427399  |.  5D            POP EBP
0042739A  \.  C3            RETN



49CEB4和49CEB6的值在这里改。但改了人物也只有垂直或水平方向的偏移。
00429828  |.  66:C745 F8 3C>MOV WORD PTR SS:[EBP-8],3C
0042982E  |.  66:C745 F4 19>MOV WORD PTR SS:[EBP-C],19

0042984F  |.  66:8B4D F4    MOV CX,WORD PTR SS:[EBP-C]
00429853  |.  66:890D B6CE4>MOV WORD PTR DS:[49CEB6],CX
0042985A  |.  66:8B55 F8    MOV DX,WORD PTR SS:[EBP-8]
0042985E  |.  66:8915 B4CE4>MOV WORD PTR DS:[49CEB4],DX




=======================================

int16 cdecl sub_4272C5(int a1, int a2, int16 a3)

  int16 result; // ax@1
  int16 v4; // ST0C_2@1

  v4 = 4 *(a2 + a1)-8 * a3-(8 * word_49CEB6 - 8);
  a1 = -8*a2 + 8*a1 + 8 * (unsigned __int16)sub_426BB6(8) / 2 - 8 - 8 * word_49CEB4;
  result = v4;
  a2 = v4;
  return result;
}

其中
a1=游戏里横坐标
a2=游戏里纵坐标

a3=0
(unsigned __int16)sub_426BB6(8)的输出值是0C8H,也就是200。(这两个值是否浮动还未知。)


word_49CEB6=19H。
word_49CEB4=3CH。


所以计算得到的公式:
设bmp里横坐标为x  (0<x<640)
             纵坐标为y  (0<y<400)
    游戏里横坐标为a  
             纵坐标为b


x= 4*(b + a)-8*0-(8*25-8)

y= -8*b + 8*a + 8*200/2-8-8*60

==>化简得:
x=(a-b)*8+312
y=(a+b)*4-216

这个就是最终公式了。

但是不知为什么,算出来的a和b与地形编辑器里的坐标不一样,有点误差。当然大体上对了,常数误差而已。
因为我在游戏里看到的bmp坐标(点击人物后在49CED8,49CEDC显示)和画图软件中查看的坐标不同。
所以这个公式现在还只供参考。
不过要是改成直坐标,那就是非常简单了。

[ 本帖最后由 WHITESHIP 于 2013-2-15 13:32 编辑 ]
顶部
性别:未知-离线 zhouhuan
(神鸟)

光禄大夫
白衣伯爵

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
组别 虎豹骑
级别 安南将军
好贴 1
功绩 233
帖子 2822
编号 89468
注册 2006-10-30


发表于 2013-2-19 11:47 资料 个人空间 短消息 只看该作者
能有英雄无敌编辑器那样的功能就好了,直接把人拖放到地图里
顶部
性别:未知-离线 athenalp

Rank: 1
组别 百姓
级别 在野武将
功绩 0
帖子 15
编号 335666
注册 2009-8-20


发表于 2013-3-21 22:47 资料 短消息 只看该作者
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2024-9-30 05:57
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.013229 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP