找回密码
 点一下
查看: 912|回复: 9

向各位老师求教:如何获得函数/变量真实地址?

[复制链接]
发表于 2012-10-21 08:25:20 | 显示全部楼层 |阅读模式
本帖最后由 bitblt_1 于 2012-10-22 18:11 编辑

    就是想要获得函数(或变量)在内存中的地址,我记得好像有jass api可以直接获得,可是忘记了,向老师们求教!谢谢各位老师。
   附:另还想请教如何获得当前镜头的四个角的坐标(左上、左下、右上、右下,不是整个地图的角哟);再次感谢~

结果:暂时没有想到方法能得到

发表于 2012-10-21 22:05:36 | 显示全部楼层
LZ可以去找jass api的教程看一下~
应该就是先找到魔兽存在哪,然后再加个偏移

至于镜头四角。。如果LZ指的是屏幕显示区域的四角的话(我不知道镜头区域是不是就是屏幕的区域)
我能想到的就是可以在默认视角下在四个角创建单位测坐标,记下这几个值就行,当然游戏中如果镜头不需要转动的话最好锁死,否则镜头改下高度或角度就没用了
回复

使用道具 举报

发表于 2012-10-21 22:25:28 | 显示全部楼层
本帖最后由 Asuna 于 2012-10-22 09:16 编辑

1、
Jass里面是没有指针类型变量的,handle类型和指针类型不一样
所以除了通过下面这个可以读取魔兽内存的Bug可能获得变量的内存地址之外,大概就没有其他的方法了
http://bbs.islga.org/forum.php?mod=viewthread&tid=26938
我猜楼主大概问的是“如何获得物体和函数的handle值”而不是“如何获得变量的内存地址”吧

在1.24(及以上版本)中,使用函数GetHandleId可以直接获得物体的handle值
在1.20(及以下版本)中,可以使用ReturnBug(H2I)来获得物体的handle值

2、通过函数可以获得“当前镜头目标点”,还可以获得“镜头距离”“旋转角度”等属性
然后你就可以通过这些数据+高中数学,计算出镜头区域的坐标了

具体计算过程可以参考以下帖子
http://bbs.islga.org/read-htm-tid-1107318-page-1-fpage-1.html

不过这里有一个问题,“镜头区域四个角“如果不限定Z轴坐标的话,就会有无数个点
所以还是要看你自己的需求,然后写公式计算
回复

使用道具 举报

 楼主| 发表于 2012-10-22 06:47:25 | 显示全部楼层
真是感激不尽,谢谢两位大哥如此详尽的回答!特别是asuna大哥。 马上去试试
回复

使用道具 举报

 楼主| 发表于 2012-10-22 06:57:20 | 显示全部楼层
再次向您们请教:  一个函数(自定义的function)在游戏中使用的时候可以转化为类似”10096“(十六进制的,和别的单位Unit ID类似)这样的ID呢?我在地图编辑器里的时候一个函数过程转化成了数字“8”,就是下面的【call TriggerAddAction(gg_trg____________________002, function Trig____________________002Actions)
】变成了【call TriggerAddAction(gg_trg____________________002, 8)】,但想要转化为类似“10096“(十六进制的),这样就方便跟踪地址什么的。

===========
function Trig____________________002Actions takes nothing returns nothing
call BJDebugMsg( I2S( GetHandleId( GetTriggerUnit()) ) )
endfunction
function InitTrig____________________002 takes nothing returns nothing
    set gg_trg____________________002 = CreateTrigger()
#ifdef DEBUG
    call YDWESaveTriggerName(gg_trg____________________002, "未命名触发器 002")
#endif
    call TriggerRegisterPlayerSelectionEventBJ( gg_trg____________________002, Player(0), true )
    call TriggerAddAction(gg_trg____________________002, function Trig____________________002Actions)
endfunction
=========
回复

使用道具 举报

发表于 2012-10-22 15:33:33 | 显示全部楼层
本帖最后由 Asuna 于 2012-10-22 15:40 编辑

不是太明白你的意思
TriggerAddAction函数的第二个参数必须是triggeraction,不能是integer
call TriggerAddAction(gg_trg____________________002, 8)这样写是肯定会报错的

如果想要把随便写的一个数字转换为对象,你需要1.20之前的ReturnBug
[jass]
function I2CD takes integer i returns code
    return i
    return null
endfunction
[/jass]
比如你写了这个I2CD函数之后,就可以
call TriggerAddAction(CreateTrigger(),I2CD(8))
使用I2CD(8) 将integer“8”转换为一个code对象了

id.w3x (11.33 KB, 下载次数: 23)
例如此演示

[jass]
function TA2I takes triggeraction ta returns integer
    return ta
    return 0
endfunction

function I2TA takes integer i returns triggeraction
    return i
    return null
endfunction

function CD2I takes code c returns integer
    return c
    return 0
endfunction

function I2CD takes integer i returns code
    return i
    return null
endfunction

function Trig________________u_Actions takes nothing returns nothing
   
endfunction

function InitTrig________________u takes nothing returns nothing
    local code c = function Trig________________u_Actions
    local integer id
    local triggeraction ta
    set id = CD2I(c)
    call DisplayTextToPlayer(Player(0),0,0,"某函数的ID是"+I2S(id))

    set gg_trg________________u = CreateTrigger(  )
    set ta = TriggerAddAction( gg_trg________________u,  I2CD(id))
    call DisplayTextToPlayer(Player(0),0,0,"添加的动作的ID是"+I2S(TA2I(ta)))

    call DisplayTextToPlayer(Player(0),0,0,"你也可以随便I2CD一个数字")
    call TriggerAddAction(CreateTrigger(),I2CD(8))
    call DisplayTextToPlayer(Player(0),0,0,"但是否那个数字是否对应着一个函数就要看你的运气了")
endfunction
[/jass]
回复

使用道具 举报

发表于 2012-10-22 15:36:58 | 显示全部楼层
注:此演示只能在1.20运行,不能在1.24里面运行
因为1.24已经修复了ReturnBug

1.24可以使用GetHandleId函数来获得物体的id
但是不能把随便一个数字转换为物体了
回复

使用道具 举报

 楼主| 发表于 2012-10-22 16:45:36 | 显示全部楼层
本帖最后由 bitblt_1 于 2012-10-22 16:46 编辑

Asuna大哥的RP没话说,感动啊~~打自心底的~
马上去试,这么认真细致的分析和代码,再不出个结果,小弟要惭愧到家了!
回复

使用道具 举报

 楼主| 发表于 2012-10-22 18:10:11 | 显示全部楼层
初步结果: 和Asuna大哥在楼上说的一致,1.24中部分数据类型之间的转化可以做到(1.20则完全可以),但我没有办法获得函数的ID,更别说真实地址...  1.20根据这篇文章看有可能http://www.2cto.com/kf/200908/40848.html , 不过1.20对我意义不大,而且水平有限,就不往下郁闷自己了....
再次感谢Asuna哥一直以来的帮助和点拨! Thank you very  much~
回复

使用道具 举报

发表于 2012-10-22 18:20:00 | 显示全部楼层
本帖最后由 Asuna 于 2012-10-22 18:35 编辑

额,不用谢啦...

不过H2I(1.20)或GetHandleId(1.24)不是都可以获得函数的handleid吗?

貌似我没能解决你的问题呢~~

不知道楼主想要实现什么效果
看起来你是想要获得函数的真实内存地址,对这方面我不怎么了解

楼主可以去查一下japi的相关资料,可能还是有方法可以获得函数的内存地址的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 10:32 , Processed in 0.153446 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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