跑跑卡丁车怎样窗口化
答案:5 悬赏:30 手机版
解决时间 2021-02-18 17:53
- 提问者网友:辞取
- 2021-02-17 17:36
跑跑卡丁车怎样窗口化
最佳答案
- 五星知识达人网友:大漠
- 2021-02-17 18:54
要修改文件是一个游戏程序的DLL,这个游戏的方式有点让人想起来,那个《剑侠情缘》也是这样的风格,还有《大话西游》也是这样的风格,什么风格呢?很简单的,就是主程序在DLL中,而EXE只是负责加载而已!
觉得发这样的贴有点没水平了,不过,通常这样的最实用吧:)!
简要说明一下:
游戏主要加速有两类:一是OpenGL,二是DirectX
而现在不知道怎么滴国产游戏都是后着,我们熟悉一下后者:
/-----------------------------------------------------------------------------------------
我们看到3D类游戏都要用到的一部分初始化,而熟悉这类编程的都说很简单的东西哦!
HRESULT CPNDX::InitD3D(HWND hWd)
{
hWnd=hWd;
// 创建D3D对象
if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
return E_FAIL;
// 获取当前的显示模式
D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 设置交换模式
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.BackBufferFormat = d3ddm.Format; // 设置背景缓冲区格式为当前左面格式
d3dpp.EnableAutoDepthStencil = TRUE; // 打开深度缓冲zbuffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲格式
// 创建D3D设备
// 第一个参数:使用默认的显卡适配器
// 第二个参数:请求使用硬件抽象层(HAL)
// 第三个参数:窗口句柄
// 第四个参数:使用软件处理顶点
// 第五个参数:创建的参数
// 第六个参数:创建的D3D设备指针
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice ) ) )
{
return E_FAIL;
}
// 关闭culling,让我们能看到3角型的正反面
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
// 打开ZBUFFER
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
// Turn off D3D lighting
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
return S_OK;
}
/---------------------------------------------------------------------------------------------------
我们注意的地方是:GetAdapterDisplayMode这个函数全屏幕一般不需要,一般都是枚举
而窗口化是必须要的,如果不要这个函数也可以,那就必须自己初始化D3DDISPLAYMODE结构才可以。
比如:
//前面用其他函数给它初始化了宽和高,那么后面还要初始化屏幕格式和刷新频率。才能窗口化!
d3ddm.Format =D3DFMT_R5G6B5;
d3ddm.RefreshRate=0x3C;
把前面的D3DPRESENT_PARAMETERS d3dpp这个结构赋值修改如下:
d3dpp.Windowed = FALSE;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.hDeviceWindow = hWnd;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC; //这个也是必须的,不然屏幕会闪烁。
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
简要说完了,大家还是不太清楚就查查资料吧!没说太难,就通俗点说一下!
/----------------------------------------------------------------------------------------------------
下面的就简单了:
我们来看一下,把一个程序反汇编会是什么样子:
//很容易就发现这个了:
00406FD0 |. 68 DC000000 push 0DC
00406FD5 |. E8 987F0300 call <jmp.&d3d8.Direct3DCreate8>
==============================
g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ); //也就是这一句了
/-----------------------------------------------------------------
//再往下就看到了这两句:
0040709D |> \C745 F8 17000>mov dword ptr [ebp-8], 17
004070A4 |. C745 F4 3C000>mov dword ptr [ebp-C], 3C
==================================
d3ddm.Format =D3DFMT_R5G6B5;
d3ddm.RefreshRate=0x3C;
/------------------------------------------------------------------
//再往下看就到了一个结构,关建的是这个结构:
004070BB |. C745 D4 01000>mov dword ptr [ebp-2C], 1
004070C2 |. C745 C4 01000>mov dword ptr [ebp-3C], 1
004070C9 |. 8B55 F8 mov edx, dword ptr [ebp-8]
004070CC |. 8955 C0 mov dword ptr [ebp-40], edx
004070CF |. 8B45 EC mov eax, dword ptr [ebp-14]
004070D2 |. 8945 B8 mov dword ptr [ebp-48], eax
004070D5 |. 8B4D F0 mov ecx, dword ptr [ebp-10]
004070D8 |. 894D BC mov dword ptr [ebp-44], ecx
004070DB |. 8B55 08 mov edx, dword ptr [ebp+8]
004070DE |. 8955 D0 mov dword ptr [ebp-30], edx
004070E1 |. C745 CC 04000>mov dword ptr [ebp-34], 4
004070E8 |. C745 E4 00000>mov dword ptr [ebp-1C], 0
004070EF |. C745 E8 00000>mov dword ptr [ebp-18], 0
/------------------------------------------------------------------------------------------------
//再往下我们认识一个函数:
004070F8 |. 6A 47 push 47
004070FA |. 6A 01 push 1
004070FC |. 6A 02 push 2
004070FE |. 8B45 F8 mov eax, dword ptr [ebp-8]
00407101 |. 50 push eax
00407102 |. 6A 01 push 1
00407104 |. 6A 00 push 0
00407106 |. 8B4D FC mov ecx, dword ptr [ebp-4]
00407109 |. 8B51 04 mov edx, dword ptr [ecx+4]
0040710C |. 8B45 FC mov eax, dword ptr [ebp-4]
0040710F |. 8B48 04 mov ecx, dword ptr [eax+4]
00407112 |. 8B01 mov eax, dword ptr [ecx]
00407114 |. 52 push edx
00407115 |. FF50 28 call dword ptr [eax+28]
=============================================================
m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format,
D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32)
/---------------------------------------------------------------------------------------------------
//还有一个关键函数:
004071F3 |. 50 push eax
004071F4 |. 8D4D B8 lea ecx, dword ptr [ebp-48]
004071F7 |. 51 push ecx
004071F8 |. 6A 20 push 20
004071FA |. 8B55 08 mov edx, dword ptr [ebp+8]
004071FD |. 52 push edx
004071FE |. 6A 01 push 1
00407200 |. 6A 00 push 0
00407202 |. 8B45 FC mov eax, dword ptr [ebp-4]
00407205 |. 8B48 04 mov ecx, dword ptr [eax+4]
00407208 |. 8B55 FC mov edx, dword ptr [ebp-4]
0040720B |. 8B42 04 mov eax, dword ptr [edx+4]
0040720E |. 8B10 mov edx, dword ptr [eax]
00407210 |. 51 push ecx
00407211 |. FF52 3C call dword ptr [edx+3C]
===============================================================
//Create a Direct3D device.
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice)))
/----------------------------------------------------------------------------------------------------
窗口化的结束了---------------
觉得发这样的贴有点没水平了,不过,通常这样的最实用吧:)!
简要说明一下:
游戏主要加速有两类:一是OpenGL,二是DirectX
而现在不知道怎么滴国产游戏都是后着,我们熟悉一下后者:
/-----------------------------------------------------------------------------------------
我们看到3D类游戏都要用到的一部分初始化,而熟悉这类编程的都说很简单的东西哦!
HRESULT CPNDX::InitD3D(HWND hWd)
{
hWnd=hWd;
// 创建D3D对象
if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
return E_FAIL;
// 获取当前的显示模式
D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 设置交换模式
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.BackBufferFormat = d3ddm.Format; // 设置背景缓冲区格式为当前左面格式
d3dpp.EnableAutoDepthStencil = TRUE; // 打开深度缓冲zbuffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲格式
// 创建D3D设备
// 第一个参数:使用默认的显卡适配器
// 第二个参数:请求使用硬件抽象层(HAL)
// 第三个参数:窗口句柄
// 第四个参数:使用软件处理顶点
// 第五个参数:创建的参数
// 第六个参数:创建的D3D设备指针
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice ) ) )
{
return E_FAIL;
}
// 关闭culling,让我们能看到3角型的正反面
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
// 打开ZBUFFER
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
// Turn off D3D lighting
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
return S_OK;
}
/---------------------------------------------------------------------------------------------------
我们注意的地方是:GetAdapterDisplayMode这个函数全屏幕一般不需要,一般都是枚举
而窗口化是必须要的,如果不要这个函数也可以,那就必须自己初始化D3DDISPLAYMODE结构才可以。
比如:
//前面用其他函数给它初始化了宽和高,那么后面还要初始化屏幕格式和刷新频率。才能窗口化!
d3ddm.Format =D3DFMT_R5G6B5;
d3ddm.RefreshRate=0x3C;
把前面的D3DPRESENT_PARAMETERS d3dpp这个结构赋值修改如下:
d3dpp.Windowed = FALSE;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferWidth = d3ddm.Width;
d3dpp.BackBufferHeight = d3ddm.Height;
d3dpp.hDeviceWindow = hWnd;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC; //这个也是必须的,不然屏幕会闪烁。
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
简要说完了,大家还是不太清楚就查查资料吧!没说太难,就通俗点说一下!
/----------------------------------------------------------------------------------------------------
下面的就简单了:
我们来看一下,把一个程序反汇编会是什么样子:
//很容易就发现这个了:
00406FD0 |. 68 DC000000 push 0DC
00406FD5 |. E8 987F0300 call <jmp.&d3d8.Direct3DCreate8>
==============================
g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ); //也就是这一句了
/-----------------------------------------------------------------
//再往下就看到了这两句:
0040709D |> \C745 F8 17000>mov dword ptr [ebp-8], 17
004070A4 |. C745 F4 3C000>mov dword ptr [ebp-C], 3C
==================================
d3ddm.Format =D3DFMT_R5G6B5;
d3ddm.RefreshRate=0x3C;
/------------------------------------------------------------------
//再往下看就到了一个结构,关建的是这个结构:
004070BB |. C745 D4 01000>mov dword ptr [ebp-2C], 1
004070C2 |. C745 C4 01000>mov dword ptr [ebp-3C], 1
004070C9 |. 8B55 F8 mov edx, dword ptr [ebp-8]
004070CC |. 8955 C0 mov dword ptr [ebp-40], edx
004070CF |. 8B45 EC mov eax, dword ptr [ebp-14]
004070D2 |. 8945 B8 mov dword ptr [ebp-48], eax
004070D5 |. 8B4D F0 mov ecx, dword ptr [ebp-10]
004070D8 |. 894D BC mov dword ptr [ebp-44], ecx
004070DB |. 8B55 08 mov edx, dword ptr [ebp+8]
004070DE |. 8955 D0 mov dword ptr [ebp-30], edx
004070E1 |. C745 CC 04000>mov dword ptr [ebp-34], 4
004070E8 |. C745 E4 00000>mov dword ptr [ebp-1C], 0
004070EF |. C745 E8 00000>mov dword ptr [ebp-18], 0
/------------------------------------------------------------------------------------------------
//再往下我们认识一个函数:
004070F8 |. 6A 47 push 47
004070FA |. 6A 01 push 1
004070FC |. 6A 02 push 2
004070FE |. 8B45 F8 mov eax, dword ptr [ebp-8]
00407101 |. 50 push eax
00407102 |. 6A 01 push 1
00407104 |. 6A 00 push 0
00407106 |. 8B4D FC mov ecx, dword ptr [ebp-4]
00407109 |. 8B51 04 mov edx, dword ptr [ecx+4]
0040710C |. 8B45 FC mov eax, dword ptr [ebp-4]
0040710F |. 8B48 04 mov ecx, dword ptr [eax+4]
00407112 |. 8B01 mov eax, dword ptr [ecx]
00407114 |. 52 push edx
00407115 |. FF50 28 call dword ptr [eax+28]
=============================================================
m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format,
D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32)
/---------------------------------------------------------------------------------------------------
//还有一个关键函数:
004071F3 |. 50 push eax
004071F4 |. 8D4D B8 lea ecx, dword ptr [ebp-48]
004071F7 |. 51 push ecx
004071F8 |. 6A 20 push 20
004071FA |. 8B55 08 mov edx, dword ptr [ebp+8]
004071FD |. 52 push edx
004071FE |. 6A 01 push 1
00407200 |. 6A 00 push 0
00407202 |. 8B45 FC mov eax, dword ptr [ebp-4]
00407205 |. 8B48 04 mov ecx, dword ptr [eax+4]
00407208 |. 8B55 FC mov edx, dword ptr [ebp-4]
0040720B |. 8B42 04 mov eax, dword ptr [edx+4]
0040720E |. 8B10 mov edx, dword ptr [eax]
00407210 |. 51 push ecx
00407211 |. FF52 3C call dword ptr [edx+3C]
===============================================================
//Create a Direct3D device.
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice)))
/----------------------------------------------------------------------------------------------------
窗口化的结束了---------------
全部回答
- 1楼网友:北方的南先生
- 2021-02-17 22:41
F11,但窗口化以后,就回不来了...必须重新登录...
- 2楼网友:鸠书
- 2021-02-17 21:15
晕倒,F11就行了
- 3楼网友:第幾種人
- 2021-02-17 20:10
键盘上的F11是切换窗口键,但切换不要太频繁,否则很容易掉线
- 4楼网友:渊鱼
- 2021-02-17 19:38
1楼的在干啥呢好麻烦哦我都看晕了
很简单
出现“健康游戏忠告”时按F11就可以了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯