游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10029|回复: 11

求助,关于vs2005无法调试的问题

[复制链接]

2

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2006-8-30 20:48:00 | 显示全部楼层 |阅读模式
我在学习Directx9种编写了一个显示三角形面的程序,可以执行但不能调试,如果调试会弹出一下信息:无法找到“绘制三角形面.exe”的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.
下面选择"是"后会出现反汇编的调试信息

生成文件后会在输出栏显示一下信息.
“绘制三角形面.exe”: 已加载“E:\vc++\Visual C++ DirectX9 3D游戏开发引导\第三章 DirectX 3D游戏开发入门\绘制三角形面\debug\绘制三角形面.exe”,未使用调试信息生成二进制文件。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\dinput8.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\msvcrt.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\advapi32.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\rpcrt4.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\user32.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\gdi32.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\d3d9.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\d3d8thk.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\version.dll”,未加载任何符号。
“绘制三角形面.exe”: 已加载“D:\WINDOWS\system32\winmm.dll”,未加载任何符号。
程序“[3292] 绘制三角形面.exe: 本机”已退出,返回值为 0 (0x0)。


哪位大哥帮帮忙,如果有必要,我再将源代码法上来.

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-8-30 23:12:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

不能调试是你VS2005设置的问题。你在项目中的设置里找有一个与调试有关的项是关闭的,你打开就可以了,具体是哪个我忘了,我用于开发的那台电脑刚关,不想在打开了,你先自己找吧,我明天开发时顺便帮你查一下,如果明晚你还没找到,我上网告诉你好了。

11

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2006-8-31 01:20:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

是用的debug模式编译的么?

2

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2006-8-31 09:03:00 | 显示全部楼层

Re: 求助,关于vs2005无法调试的问题

是哪个选项?

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-8-31 10:45:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

改一下项目的配置选项
在Debug里

2

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2006-8-31 11:11:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

改哪个选项,能否说具体点.

2

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2006-8-31 11:47:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

我在网上查了半天,总算能调试了,但是我设置了断点却没有用,我将书附带的源代码拷贝上去后能调试也能在断点处停下来,我所编的代码完全是参考书上的,只不过是将英文的变量名和函数名全部用中文代替,不知道是不是这方面的原因。
下面附上我的代码
main.cpp:

#include "GameEngine_Common.h"
#include "GameEngine_App.h"
#include "GameEngine_Input.h"
#include "渲染.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                                         HINSTANCE hPrevInstance,
                                         LPSTR lpCmdLine,
                                         int nCmdShow)
{
        CGameEngine_App 游戏引擎;
        CGameEngine_Input 游戏输入;
        渲染 渲染;
        HWND 窗口句柄;
        MSG 消息;
        if(!游戏引擎.CreateWnd("基本三角形面的绘制",hInstance,hPrevInstance,nCmdShow))
        {
                return false;
        }
        窗口句柄 = 游戏引擎.GetHWnd();
        if(!游戏输入.CreateInput(hInstance,窗口句柄))
        {
                MessageBox(NULL,"初始化输入设备失败","警告",MB_OK|MB_ICONINFORMATION);
                return false;
        }
        SetWindowPos(窗口句柄,0,0,0,0,0,SWP_NOSIZE);
        SetCursorPos(0,0);
        if(!渲染.创建3D设备(窗口句柄,false))
        {
                return false;
        }
        if(!渲染.初始化定点缓冲区())
        {
                return false;
        }
        while(消息.message!=WM_QUIT)
        {
                if(PeekMessage(&消息,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&消息);
                        DispatchMessage(&消息);
                }
                else
                {
                        if(游戏输入.ReadKeyboard())
                        {
                                if(游戏输入.IsKeyPressed(DIK_R))
                                        渲染.描绘();
                                if(游戏输入.IsKeyPressed(DIK_ESCAPE))
                                        PostQuitMessage(0);
                        }
                }
        }

        UnregisterClass(WNDCLASSNAME,hInstance);
        return true;
}

****************************************************************
渲染.h
****************************************************************
#ifndef 三角形
#define 三角形
#define 定制顶点 (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
#include "GameEngine_Common.h"

struct 顶点
{
        float x,y,z,rhw;
        D3DCOLOR 颜色;
};

class 渲染
{
private:
        IDirect3D9 * 接口;
        IDirect3DDevice9 * 设备;
        IDirect3DVertexBuffer9 * 顶点缓冲区;

public:
        渲染(void);
        ~渲染(void);
        bool 创建3D设备(HWND hWnd,bool 是否全屏=true);
        bool 初始化定点缓冲区();
        void 描绘();
        void 释放3D对象();
};

#endif

*************************************************************
渲染.cpp
*************************************************************
#include "渲染.h"


渲染::渲染(void)
{
}

渲染::~渲染(void)
{
        释放3D对象();
}

bool 渲染::创建3D设备(HWND hWnd, bool 是否全屏)
{
        //创建IDirect3D9对象
        接口 = Direct3DCreate9(D3D_SDK_VERSION);
        if(接口==NULL)
        {
                return false;
        }
        D3DCAPS9 硬件属性;
        接口->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&硬件属性);
        bool 是否支持顶点变换光照处理;
        if(硬件属性.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        {
                是否支持顶点变换光照处理 = true;
        }
        else
        {
                是否支持顶点变换光照处理 = false;
        }

        //取得显示模式

        D3DDISPLAYMODE 显示模式;
                if(FAILED(接口->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&显示模式)))
                {
                        return false;
                }

                //设置d3d设备的渲染参数
                D3DPRESENT_PARAMETERS 渲染参数;
                ZeroMemory(&渲染参数,sizeof(渲染参数));
                渲染参数.BackBufferWidth = 640;
                渲染参数.BackBufferHeight = 480;
                渲染参数.BackBufferFormat = 显示模式.Format;
                渲染参数.BackBufferCount = 1;                                                                        //一个后绘图表面
                渲染参数.hDeviceWindow = hWnd;
                渲染参数.Windowed = true;
                渲染参数.SwapEffect = D3DSWAPEFFECT_FLIP;
                渲染参数.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

                //创建d3d设备
                if(是否支持顶点变换光照处理)
                {
                        if(FAILED(接口->CreateDevice(D3DADAPTER_DEFAULT,
                                                                                D3DDEVTYPE_HAL,hWnd,
                                                                                D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                                                                &渲染参数,
                                                                                &设备)))
                        {
                                return false;
                        }
                }
                else
                {
                        if(FAILED(接口->CreateDevice(D3DADAPTER_DEFAULT,
                                                                                D3DDEVTYPE_HAL,hWnd,
                                                                                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                                &渲染参数,
                                                                                &设备)))
                        {
                                return false;
                        }
                }
                return true;
}


bool 渲染::初始化定点缓冲区()
{
        顶点 顶点[]={
                {0.0f,0.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
                {640.0f,0.0f,10.8f,1.0f,D3DCOLOR_XRGB(0,255,0)},
                {640.0f,480.0f,30.0f,1.0f,D3DCOLOR_XRGB(0,0,255)}
        };
        BYTE * 顶点缓冲区指针;

        //创建顶点缓冲区的指针
        if(FAILED(设备->CreateVertexBuffer(3*sizeof(顶点),
                                                                                0,
                                                                                定制顶点,
                                                                                D3DPOOL_MANAGED,
                                                                                &顶点缓冲区,
                                                                                NULL)))
        {
                return false;
        }

        //锁定并取得顶点缓冲区的指针
        if(FAILED(顶点缓冲区->Lock(0,0,(void**)&顶点缓冲区指针,0)))
        {
                return false;
        }

        //写入定点数据到顶点缓冲区
        memcpy(顶点缓冲区指针,顶点,sizeof(顶点));

        //解锁
        顶点缓冲区->Unlock();
        return true;
}

void 渲染::描绘()
{
        if(设备==NULL)
        {
                return;
        }

        //晴空绘画表面的BackBuffer为黑色
        设备->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);

        //开始渲染
        设备->BeginScene();

        //渲染三角形面
        设备->SetStreamSource(0,顶点缓冲区,0,sizeof(顶点));
        设备->SetFVF(定制顶点);
        设备->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

        //结束渲染
        设备->EndScene();

        //置换前后绘图表面缓冲区,显示当前帧
        设备-&gtresent(NULL,NULL,NULL,NULL);
}

void 渲染::释放3D对象()
{
        SafeRelease(顶点缓冲区);
        SafeRelease(设备);
        SafeRelease(接口);
}

****************************************************************
GameEngine_App.h
****************************************************************
#ifndef GameEngine_App_Include
#define GameEngine_App_Include

#define WNDCLASSNAME "MyGame"
class CGameEngine_App{
private:
        HWND m_hWnd;
        WNDCLASSEX m_WndClassEx;
public:
        CGameEngine_App(){};
        ~CGameEngine_App(){};
        bool CreateWnd(LPCTSTR szWinTitle,HINSTANCE hInstance, HINSTANCE hPrevInstance,int nCmdShow);
           static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
        inline WNDCLASSEX GetWndClass(){return m_WndClassEx;}  //在类头文件中定义的函数,默认为inline,可省略inline关键字
        inline HWND GetHWnd(){return m_hWnd;}
private:
        ATOM RegWndClass(HINSTANCE hInstance);
};
#endif

****************************************************************
GameEngine_App.cpp
****************************************************************
#include "GameEngine_Common.h"
#include "GameEngine_App.h"

bool CGameEngine_App::CreateWnd(LPCTSTR szWinTitle,HINSTANCE hInstance, HINSTANCE hPrevInstance,int nCmdShow)
{
        if(!hPrevInstance){ //判断是否已有应用程序实例在运行
                RegWndClass(hInstance);  //注册窗口类
        }
        //创建窗口
    m_hWnd= CreateWindow(WNDCLASSNAME, szWinTitle, WS_SYSMENU|WS_CAPTION|WS_VISIBLE,                                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if (!m_hWnd){
                return false;
        }
        ShowWindow(m_hWnd, nCmdShow);  //显示窗口
        UpdateWindow(m_hWnd);  //刷新窗口
        return true;
}

ATOM CGameEngine_App::RegWndClass(HINSTANCE hInstance)
{
        m_WndClassEx.cbSize         = sizeof(WNDCLASSEX);
        m_WndClassEx.style                    = CS_HREDRAW | CS_VREDRAW;  
        m_WndClassEx.lpfnWndProc        = (WNDPROC)WndProc;  //回调的窗口过程函数
        m_WndClassEx.cbClsExtra                = 0;
        m_WndClassEx.cbWndExtra                = 0;
        m_WndClassEx.hInstance                = hInstance;
        m_WndClassEx.hIcon                    = 0;
        m_WndClassEx.hCursor                = LoadCursor(NULL, IDC_ARROW);
        m_WndClassEx.hbrBackground        = (HBRUSH)GetStockObject(BLACK_BRUSH);
        m_WndClassEx.lpszMenuName        = 0;
        m_WndClassEx.lpszClassName        =WNDCLASSNAME;  //define WNDCLASSNAME "Game"
        m_WndClassEx.hIconSm                =NULL;
        return RegisterClassEx(&m_WndClassEx);
}

LRESULT CALLBACK CGameEngine_App::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message){
                case WM_DESTROY:
                        PostQuitMessage(0);
                        break;
                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
        }
           return 0;
}

*****************************************************************
GameEngine_Input.h
*****************************************************************
#ifndef GameEngine_Input_Include
#define GameEngine_Input_Include

#define ITEMS_NUM 10
static LPDIRECTINPUT8 g_pIDirectInput=NULL;
BOOL CALLBACK EnumJSCallback(LPCDIDEVICEINSTANCE,LPVOID);

class CGameEngine_Input{
private:
        bool m_bUseJoystick;
        LPDIRECTINPUTDEVICE8 m_pKeyboardDevice;     //键盘设备
        LPDIRECTINPUTDEVICE8 m_pMouseDevice;        //鼠标设备
        LPDIRECTINPUTDEVICE8 m_pJoystickDevice;     //游戏杆设备
        char m_KeyBuffer[256];                      //键盘的缓冲区(立即模式)
        DIDEVICEOBJECTDATA m_MouseData[ITEMS_NUM];  //鼠标的缓冲区(缓冲模式)
        DIJOYSTATE2 m_JoystickData;                 //游戏杆的缓冲区(立即模式)         
        long m_lMouseMoveX,m_lMouseMoveY;           //鼠标的X-Y轴总移动量
public:
        CGameEngine_Input();
        ~CGameEngine_Input();
        bool CreateInput(HINSTANCE,HWND,int iMin=-100,int iMax=100,int iDeadZone=20,bool bUseJoystick=false);  
        bool ReadKeyboard();
        bool ReadMouse();
        bool ReadJoystick();
        inline bool IsKeyPressed(int key){return ((m_KeyBuffer[key] & 0x80)?true:false);}    //判断用户按键函数
        inline long GetMouseMoveX(){return m_lMouseMoveX;}   
        inline long GetMouseMoveY(){return m_lMouseMoveY;}
        bool IsLButtonPressed();            //判断鼠标左键按下
        bool IsRButtonPressed();            //判断鼠标右键按下
        bool IsMButtonPressed();            //判断鼠标中间滑轮按下
        inline bool IsJSButtonPressed(int iButton){return ((m_JoystickData.rgbButtons[iButton] & 0x80)?true:false);}  //判断游戏杆按钮按下
private:
        bool CreateDirectInput(HINSTANCE);
        bool CreateKeyboard(HWND);
        bool CreateMouse(HWND);
        bool CreateJoystick(HWND,int iMin,int iMax,int iDeadZone);
        void InputRelease();
};
#endif

**************************************************************
GameEngine_Input.cpp
**************************************************************
#include "GameEngine_Common.h"
#include "GameEngine_Input.h"

CGameEngine_Input::CGameEngine_Input()
{
        m_bUseJoystick=0;  //默认不使用游戏杆
        m_pKeyboardDevice=NULL;
        m_lMouseMoveX=0;
        m_lMouseMoveY=0;
}

bool CGameEngine_Input::CreateInput(HINSTANCE hInst,HWND hWnd,int iMin,int iMax,int iDeadZone,bool bUseJoystick){
        CreateDirectInput(hInst);
        CreateKeyboard(hWnd);
        CreateMouse(hWnd);
        if(bUseJoystick)
                CreateJoystick(hWnd,iMin,iMax,iDeadZone);
        return true;
}

bool CGameEngine_Input::CreateDirectInput(HINSTANCE hInst){
        //创建IDirectInput接口对象
        if(FAILED(DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&g_pIDirectInput,NULL))){
                MessageBox(NULL,"建立IDIRECTINPUT8接口对象失败.","警告",MB_OK|MB_ICONINFORMATION);
                return false;
        }
        return true;
}
bool CGameEngine_Input::CreateKeyboard(HWND hWnd){
        //创建键盘输入设备
        if(FAILED(g_pIDirectInput->CreateDevice(GUID_SysKeyboard,&m_pKeyboardDevice,NULL))){
                MessageBox(NULL,"建立键盘输入设备对象失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置键盘输入设备的数据格式
        if(FAILED(m_pKeyboardDevice->SetDataFormat(&c_dfDIKeyboard))){
                MessageBox(NULL,"设置键盘的数据读取数据格式失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置键盘输入设备的协调级别
        if(FAILED(m_pKeyboardDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))){
                MessageBox(NULL,"设置键盘协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //获取键盘输入设备的访问权
        if(FAILED(m_pKeyboardDevice->Acquire())){
                MessageBox(NULL,"取得键盘设备的访问权失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //初始化键盘缓冲区
        ZeroMemory(m_KeyBuffer,sizeof(char)*256);
        return true;
}

//判断用户按键函数
bool CGameEngine_Input::ReadKeyboard(){  //key=DIK_RIGHT,DIK_LEFT,DIK_A,.....
        if(DIERR_INPUTLOST==m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer)){
                m_pKeyboardDevice->Acquire();  //重新获取键盘的使用权
                if(FAILED(m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer))){
                        return false;
                }
        }
        return true;
}

bool CGameEngine_Input::CreateMouse(HWND hWnd){
        //创建鼠标输入设备
        if(FAILED(g_pIDirectInput->CreateDevice(GUID_SysMouse,&m_pMouseDevice,NULL))){
                MessageBox(NULL,"建立鼠标输入设备对象失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标设备的数据格式
        if(FAILED(m_pMouseDevice->SetDataFormat(&c_dfDIMouse))){
                MessageBox(NULL,"设置鼠标的数据读取格式失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标设备的协调级别
        if(FAILED(m_pMouseDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))){
                MessageBox(NULL,"设置鼠标协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置鼠标设备的属性(使用缓冲区读数据)
        DIPROPDWORD dipROPWORD;
        dipROPWORD.diph.dwSize=sizeof(DIPROPDWORD);
        dipROPWORD.diph.dwHeaderSize=sizeof(DIPROPHEADER);
        dipROPWORD.diph.dwObj=0;
        dipROPWORD.diph.dwHow=DIPH_DEVICE;
        dipROPWORD.dwData=ITEMS_NUM;  //#define ITEMS_NUM 10
        if(FAILED(m_pMouseDevice->SetProperty(DIPROP_BUFFERSIZE,&dipROPWORD.diph))){
                MessageBox(NULL,"设置鼠标设备属性失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
               
        }
        //获取鼠标设备的访问权
        if(FAILED(m_pMouseDevice->Acquire())){
                MessageBox(NULL,"取得鼠标的访问权失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        return true;
}

//捕捉鼠标按键和移动数据
bool CGameEngine_Input::ReadMouse(){
        DWORD dwReadNum=1;
        int i;
        //每次读取数据前,一定要使鼠标缓冲区清零
        ZeroMemory(m_MouseData,sizeof(DIDEVICEOBJECTDATA)*ITEMS_NUM);
        //循环读取鼠标数据
        for(i=0;i<ITEMS_NUM;i++){
                if(DIERR_INPUTLOST==m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseData,&dwReadNum,0)){
                        m_pMouseDevice->Acquire();
                        if(FAILED(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseData,&dwReadNum,0))){
                                return false;
                        }
                }
                if(m_MouseData.dwOfs==DIMOFS_X){
                        m_lMouseMoveX+=m_MouseData.dwData;
                }
                if(m_MouseData.dwOfs==DIMOFS_Y){
                        m_lMouseMoveY+=m_MouseData.dwData;
                }
        }
        return true;
}

//判断鼠标左键按下
bool CGameEngine_Input::IsLButtonPressed(){
        for(int i=0;i<ITEMS_NUM;i++){
                if((m_MouseData.dwOfs==DIMOFS_BUTTON0) && (m_MouseData.dwData & 0x80)){
                        return true;
                }
        }
        return false;
}

//判断鼠标右键按下
bool CGameEngine_Input::IsRButtonPressed(){
        for(int i=0;i<ITEMS_NUM;i++){
                if((m_MouseData.dwOfs==DIMOFS_BUTTON1) && (m_MouseData.dwData & 0x80)){
                        return true;
                }
        }
        return false;
}
//判断鼠标滚轮按下
bool CGameEngine_Input::IsMButtonPressed(){
        for(int i=0;i<ITEMS_NUM;i++){
                if((m_MouseData.dwOfs==DIMOFS_BUTTON2) && (m_MouseData.dwData & 0x80)){
                        return true;
                }
        }
        return false;
}

bool CGameEngine_Input::CreateJoystick(HWND hWnd,int iMin,int iMax,int iDeadZone){
        //枚举已安装的所有游戏杆
        if(FAILED(g_pIDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EnumJSCallback,&m_pJoystickDevice,DIEDFL_ATTACHEDONLY))){
                MessageBox(NULL,"枚举游戏杆失败.","警告",MB_OK|MB_ICONINFORMATION);
                return false;
        }
        if(m_pJoystickDevice==NULL){
                MessageBox(NULL,"没有安装游戏杆.","警告",MB_OK|MB_ICONINFORMATION);
                return false;
        }
        //设置DirectInput游戏杆设备的数据格式
        if(FAILED(m_pJoystickDevice->SetDataFormat(&c_dfDIJoystick2))){
                MessageBox(NULL,"设置游戏杆的数据读取数据格式失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置DirectInput游戏杆设备的协调级别
        if(FAILED(m_pJoystickDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_EXCLUSIVE))){
                MessageBox(NULL,"设置游戏杆协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置游戏杆的轴范围属性
        DIPROPRANGE dipROPRANGE;
        dipROPRANGE.diph.dwSize=sizeof(DIPROPRANGE);
        dipROPRANGE.diph.dwHeaderSize=sizeof(DIPROPHEADER);
        dipROPRANGE.diph.dwObj=0;
        dipROPRANGE.diph.dwHow=DIPH_DEVICE;
        dipROPRANGE.lMin=iMin;
        dipROPRANGE.lMax=iMax;
        if(FAILED(m_pJoystickDevice->SetProperty(DIPROP_RANGE,&dipROPRANGE.diph))){
                MessageBox(NULL,"设置游戏杆轴范围属性失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //设置游戏杆的死区范围
        DIPROPDWORD dipROPDWORD;
        dipROPDWORD.diph.dwSize=sizeof(DIPROPDWORD);
        dipROPDWORD.diph.dwHeaderSize=sizeof(DIPROPHEADER);
        dipROPDWORD.diph.dwObj=0;
        dipROPDWORD.diph.dwHow=DIPH_DEVICE;
        dipROPDWORD.dwData=100*iDeadZone;
        if(FAILED(m_pJoystickDevice->SetProperty(DIPROP_DEADZONE,&dipROPDWORD.diph))){
                MessageBox(NULL,"设置游戏杆轴无效范围属性失败.","警告",MB_OK|MB_ICONINFORMATION);
                InputRelease();
                return false;
        }
        //初始化游戏杆缓冲区
        ZeroMemory(&m_JoystickData,sizeof(DIJOYSTATE2));
        return true;
}

//枚举游戏杆的回调函数
BOOL CALLBACK  EnumJSCallback(LPCDIDEVICEINSTANCE pDIDeviceInstance,LPVOID pvRef){
        LPDIRECTINPUTDEVICE8* ppDID=(LPDIRECTINPUTDEVICE8*)pvRef;
        if(FAILED(g_pIDirectInput->CreateDevice(pDIDeviceInstance->guidInstance,ppDID,NULL)))
                return DIENUM_CONTINUE;
        else
                return DIENUM_STOP;
}

bool CGameEngine_Input::ReadJoystick(){
        //获取游戏杆的访问权
        if(FAILED(m_pJoystickDevice->Acquire())){
                return false;
        }
        //检测游戏杆
        if(FAILED(m_pJoystickDevice->Poll())){
                return false;
        }
        //读取游戏杆的输入
        if(DIERR_INPUTLOST==m_pJoystickDevice->GetDeviceState(sizeof(DIJOYSTATE2),&m_JoystickData)){
                m_pJoystickDevice->Acquire();  //重新获取游戏杆使用权
                if(FAILED(m_pJoystickDevice->GetDeviceState(sizeof(DIJOYSTATE2),&m_JoystickData))){
                        return false;
                }
        }
        return true;
}

CGameEngine_Input::~CGameEngine_Input()
{
        InputRelease();
}

void CGameEngine_Input::InputRelease(){
        if(m_pKeyboardDevice){
                m_pKeyboardDevice->Unacquire();                    //释放键盘的使用权
        }
        if(m_pMouseDevice){
                m_pMouseDevice->Unacquire();                       //释放鼠标的使用权
        }
        if((m_bUseJoystick==true) & (m_pJoystickDevice!=NULL)){
                m_pJoystickDevice->Unacquire();                    //释放游戏杆的使用权
        }
        SafeRelease(m_pKeyboardDevice);                               //释放键盘设备对象
        SafeRelease(m_pMouseDevice);                           //释放鼠标设备对象
        if((m_bUseJoystick==true) & (m_pJoystickDevice!=NULL)){
                SafeRelease(m_pJoystickDevice);                    //释放游戏杆设备对象
        }
        SafeRelease(g_pIDirectInput);                          //释放DirectInput对象
}

哪位大哥看看出了什么问题,是不是用中文有问题

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-8-31 11:52:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

设了断点没出来
说明程序根本没运行到那里阿

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2006-9-1 11:07:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

也可能说明你运行的版本和当前的代码不对应!如果是断点处前面的红点上出现"?"就是这种情况。

2

主题

11

帖子

17

积分

新手上路

Rank: 1

积分
17
 楼主| 发表于 2006-9-1 15:02:00 | 显示全部楼层

Re:求助,关于vs2005无法调试的问题

那为什么这段代码却能够显示三角形面,如果程序没运行到那里,那那些功能为什么都实现了呢?哪位大哥帮帮忙,头都搞大了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 07:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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