|
|

楼主 |
发表于 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();
//置换前后绘图表面缓冲区,显示当前帧
设备-> resent(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对象
}
哪位大哥看看出了什么问题,是不是用中文有问题 |
|