游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2752|回复: 3

已截获3D坦克游戏的所有IDirect3DDevice9调用,如何检测是否

[复制链接]

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-6-9 06:48:00 | 显示全部楼层 |阅读模式
我做了一个DLL用来注入一个3D的坦克小游戏,该DLL用自己的函数接管D3D9.dll中的函数,截获坦克游戏对D3D9.dll的IDirect3DDevice9的任何调用。这一部分功能已经完全实现,并且经测试证明可以良好工作。现在的问题是,我如何在每次渲染中,检测是否有某个特定的模型的投影覆盖了屏幕中心点。通俗地说,我想做一个只要有敌飞机经过屏幕中心点(也就是经过坦克的射击点),就自动开枪。

我先想到的方法是,自己的DLL也创建一个IDirect3DDevice9对象。然后无论坦克游戏的IDirect3DDevice9对象以什么参数调用以下函数之一(Present;BeginScene;EndScene;Clear;SetTransform;SetRenderState;SetTexture;SetTextureStageState;SetMaterial;DrawIndexedPrimitive;SetFVF;SetStreamSource;SetIndices),我的IDirect3DDevice9对象也以完全相同的参数调用相同的函数。然后我的IDirect3DDevice9对象在DrawIndexedPrimitive中做一个过滤,只渲染敌飞机的3D模型,在Present中,我的IDirect3DDevice9对象将画面输出到我自己的窗口。在我的理想中,我自己的窗口就会是一个与游戏同步的,但是只显示敌飞机的窗口。然后在我自己的窗口中,用一个Timer不断检测窗口的中心点是否有颜色值,如果有颜色值,证明敌飞机位于射击目标上。

理想中这是个不错的方法,但是在实践中,发现除非我屏蔽掉模仿游戏调用DrawIndexedPrimitive的语句,否则我的DLL必然导致整个坦克游戏的崩溃。我的猜想是,尽管我截获并模仿游戏以相同的参数调用了那么多IDirect3DDevice9函数,但是在具体运行中,由于我的DLL是在运行期注入坦克游戏的,可能我的IDirect3DDevice9对象和游戏的IDirect3DDevice9对象并不具有完全相同的环境状态,导致以相同的方式调用IDirect3DDevice9函数出现莫名其妙的问题。

我想了整整一夜没有想好怎么解决问题。我在想我是不是应该回到更简单的路线上来,即:不要试图创建一个与游戏同步的IDirect3DDevice9对象,而是采用某种更直接的办法,在游戏的IDirect3DDevice9对象进行Present之前,判断出是否有特定的模型覆盖了屏幕中心点。但是我以前从没有接触过Direct3D编程,所以现在希望求助于这方面有经验的朋友赐教。

2

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-6-10 19:18:00 | 显示全部楼层

Re:已截获3D坦克游戏的所有IDirect3DDevice9调用,如何检测是

打飞机竟是如此的难啊

2

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2011-8-16 09:13:00 | 显示全部楼层

Re:已截获3D坦克游戏的所有IDirect3DDevice9调用,如何检测是

哇,楼主厉害啊,也是我努力的方向

9

主题

62

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2011-8-16 10:39:00 | 显示全部楼层

Re:已截获3D坦克游戏的所有IDirect3DDevice9调用,如何检测是

很想跟楼主学习一下如何注入自己的DLL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 15:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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