我有一个游戏类 -
Game.h :
#pragma once
#include "D3DGraphics.h"
#include "Mouse.h"
#include "Screen.h"
#include "Script.h"
class Game
{
public:
Game( HWND hWnd, const MouseServer &mouseServer, const ScreenServer &screenServer );
void Go();
void Config();
private:
void ComposeFrame();
D3DGraphics gfx;
MouseClient mouse;
ScreenClient screen;
Script * scripts[ 1 ];
};
我有一个D3DGraphics类 -
D3DGraphics.h :
#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#include "Screen.h"
#include "Script.h"
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag
DWORD color; // from the D3DFVF_DIFFUSE flag
};
class D3DGraphics
{
public:
D3DGraphics( HWND hWnd, ScreenClient screenClient );
~D3DGraphics();
void Begin();
void End();
void Present();
void CreateViewport();
void DefineText( Script *script );
LPDIRECT3D9 d3dObject;
LPDIRECT3DDEVICE9 d3dDevice;
D3DPRESENT_PARAMETERS presParams;
HRESULT hr;
float ResizeLockRatio( float width, float height, float scalingWidth );
float GetGameOffset( float resizedImageHeight );
void DrawRectangle( int x, int y, int width, int height, D3DCOLOR backgroundColor );
void DrawActionBar();
void RenderText( Script *script );
private:
LPDIRECT3DVERTEXBUFFER9 vBuffer;
ScreenClient screen;
};
请注意,Game类同时具有
D3DGraphics gfx;
Script * scripts[ 1 ];
在我的Game.cpp中,我制作了D3DGraphics版本并将其放在gfx中:
Game.cpp :
#include "Game.h"
Game::Game( HWND hWnd, const MouseServer &mouseServer, const ScreenServer &screenServer )
: mouse( mouseServer ),
screen( screenServer ),
gfx( hWnd, screen )
{
//gfx.d3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
std::string debugStringResult;
std::stringstream debugString;
debugString << "Mouse X: " << mouse.GetMouseX() << ",\nMouse Y: " << mouse.GetMouseY() << ",\nLeft mouse down: " << mouse.LeftMouseDown() << ",\nRight mouse down: " << mouse.RightMouseDown() << ",\nScreen width: " << screen.GetScreenWidth() << ",\nScreen height: " << screen.GetScreenHeight() << "\nSystem resolution: " << screen.GetWindowWidth() << " x " << screen.GetWindowHeight();
debugStringResult = debugString.str();
scripts[ 0 ] = new Script( gfx, "Arial", 0, 0, 255, 0, debugStringResult, 10, 10, ( screen.GetWindowWidth() - 10 ), ( screen.GetWindowHeight() - 10 ) );
}
我有一个脚本类 -
Script.h :
#pragma once
#include "D3DGraphics.h"
#include <sstream>
class Script
{
public:
Script( D3DGraphics gfx,
LPCSTR font,
int alpha, int r, int g, int b,
std::string text,
float x, float y, float width, float height );
LPCSTR font;
int alpha, r, g, b;
std::string text;
float x, y, width, height;
D3DCOLOR color;
RECT rect;
ID3DXFont *handle;
private:
};
我的脚本构造函数如下所示:
Script.cpp :
#include "Script.h"
Script::Script( D3DGraphics gfx,
LPCSTR font,
int alpha, int r, int g, int b,
std::string text,
float x, float y, float width, float height )
{
gfx.DefineText( this );
}
等等。现在编译我的应用程序时出现错误:
Error 1 error C2061: syntax error : identifier 'D3DGraphics' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\script.h 9 1 TheGame
Error 8 error C2061: syntax error : identifier 'D3DGraphics' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\script.h 9 1 TheGame
Error 9 error C2661: 'Script::Script' : no overloaded function takes 11 arguments c:\users\james\documents\visual studio 2012\projects\thegame\thegame\game.cpp 14 1 TheGame
Error 10 error C2061: syntax error : identifier 'Script' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\d3dgraphics.h 28 1 TheGame
Error 11 error C2061: syntax error : identifier 'Script' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\d3dgraphics.h 40 1 TheGame
Error 12 error C2660: 'D3DGraphics::DefineText' : function does not take 1 arguments c:\users\james\documents\visual studio 2012\projects\thegame\thegame\script.cpp 9 1 TheGame
Error 13 error C2061: syntax error : identifier 'D3DGraphics' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\script.h 9 1 TheGame
Error 16 error C2061: syntax error : identifier 'D3DGraphics' c:\users\james\documents\visual studio 2012\projects\thegame\thegame\script.h 9 1 TheGame
Script.h的第9行是:
Script( D3DGraphics gfx,...
老实说,我不知道究竟发生了什么?有没有人有线索,过去2个小时我一直在盯着代码看死像。
答案 0 :(得分:2)
如Need4Sleep所述,您的D3DGraphics.h
和Script.h
的循环包含是个问题。解决此问题的一种方法是只转发声明脚本类,而不是在D3DGraphics.h
中包含其标题。
例如:
#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#include "Screen.h"
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
class Script;
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag
DWORD color; // from the D3DFVF_DIFFUSE flag
};
class D3DGraphics
{
public:
D3DGraphics( HWND hWnd, ScreenClient screenClient );
~D3DGraphics();
// rest of D3DGraphics's definition
};
只要D3DGraphics
没有以实质性方式使用Script
类的内联方法,这将有效。例如。指向脚本的指针很好。
答案 1 :(得分:0)
你有一个循环依赖,所以你可能需要指定你想在脚本之前编译D3DGraphics,这是通过以下方式完成的:
#pragma once
#include "D3DGraphics.h"
#include <sstream>
class D3DGraphics;
class Script
{
public:
Script( D3DGraphics gfx,
LPCSTR font,
int alpha, int r, int g, int b,
std::string text,
float x, float y, float width, float height );
LPCSTR font;
int alpha, r, g, b;
std::string text;
float x, y, width, height;
D3DCOLOR color;
RECT rect;
ID3DXFont *handle;
private:
};