2015-03-31 73 views
0

我工作的一些directX,从教程代码开始,也陆续将其转化为自己的阶级制度和cpp文件等C++/DX11从.H到的.cpp移动导致错误

一切都已经直到现在一切顺利,但我刚开始修改“Camera.h”和“Camera.cpp”。我有类函数在头文件中,当我将它放在它的类文件中时,会出现一个错误。我有头阻塞等,但我不能看到缺陷。

camera.h编辑

#ifndef CAMERA_H_ 
#define CAMERA_H_ 
#include "Player.h" 
#include "RandomVariables.h" 


class Camera { 
    public: 
     void UpdateCamera(); 
     float camPitch; 
     float camYaw; 
     float Zoom_Amount; //zoom amount from Model_1.Player 
     float charCamDist; //distance from Model_1.Player 

     XMVECTOR camPosition; 
     XMVECTOR camTarget; 
     XMVECTOR camUp; 
     XMVECTOR camRight; 
     XMVECTOR camForward; 

     XMMATRIX camRotationMatrix; 
     XMMATRIX Rotationx; 
     XMMATRIX Rotationy; 
     XMMATRIX Rotationz; 
     XMMATRIX camView; 
     XMMATRIX camProjection; 
}; 

Camera MainCamera; 

#endif 

后编辑

http://i.stack.imgur.com/Evxof.png

camera.h之前,我删除无效照相机:UpdateCamera(),并把它放在摄像头。 CPP和它出现未定义的错误等等,如果无效Camera :: UpdateCamera()在头文件中,所以我感到困惑:S

错误列表

http://i.stack.imgur.com/7G21V.png

Camera.cpp移动updatecamera

#include "Camera.h" 

void Camera::UpdateCamera(){ 
    MainCamera.charCamDist = 135.0f; 

    MainCamera.camTarget = mainPlayer.playerPos; 

    MainCamera.camTarget = XMVectorSetY(MainCamera.camTarget, XMVectorGetY(MainCamera.camTarget)+5.0f); 
    MainCamera.camTarget = XMVectorSetX(MainCamera.camTarget, XMVectorGetX(MainCamera.camTarget) -MainCamera.Zoom_Amount); 


    MainCamera.camRotationMatrix = XMMatrixRotationRollPitchYaw(-MainCamera.camPitch, MainCamera.camYaw, 0); 
    MainCamera.camPosition = XMVector3TransformNormal(DefaultForward, MainCamera.camRotationMatrix); 
    MainCamera.camPosition = XMVector3Normalize(MainCamera.camPosition); 

    MainCamera.camPosition = (MainCamera.camPosition * MainCamera.charCamDist) + MainCamera.camTarget; 

    MainCamera.camForward = XMVector3Normalize(MainCamera.camTarget - MainCamera.camPosition); // Get forward vector based on target 
    MainCamera.camForward = XMVectorSetY(MainCamera.camForward, 0.0f); // set forwards y component to 0 so it lays only on 
    // the xz plane 
    MainCamera.camForward = XMVector3Normalize(MainCamera.camForward); 
    MainCamera.camRight = XMVectorSet(-XMVectorGetZ(MainCamera.camForward), 0.0f, XMVectorGetX(MainCamera.camForward), 0.0f); 

    MainCamera.camUp =XMVector3Normalize(XMVector3Cross(XMVector3Normalize(MainCamera.camPosition - MainCamera.camTarget), MainCamera.camRight)); 

    MainCamera.camView = XMMatrixLookAtLH(MainCamera.camPosition, MainCamera.camTarget, MainCamera.camUp); 


}; 

RandomVariables.cpp

//Global Declarations - Interfaces// 

#ifndef RAND_H 
#define RAND_H 
#include "Models.h" 
#include "Player.h" 
#include "Camera.h" 

///start 
My_Player mainPlayer; 

XMMATRIX WVP; 

XMVECTOR DefaultForward = XMVectorSet(0.0f,0.0f,1.0f, 0.0f); 
XMVECTOR DefaultRight = XMVectorSet(1.0f,0.0f,0.0f, 0.0f); 

float tilt_X = 0.0f; 

int NumSphereVertices; 
int NumSphereFaces; 

XMMATRIX sphereWorld; 


XMMATRIX Scale; 
XMMATRIX Translation; 

///end 



IDXGISwapChain* SwapChain; 
ID3D11Device* d3d11Device; 
ID3D11DeviceContext* d3d11DevCon; 
ID3D11RenderTargetView* renderTargetView; 
ID3D11DepthStencilView* depthStencilView; 
ID3D11Texture2D* depthStencilBuffer; 
ID3D11VertexShader* VS; 
ID3D11PixelShader* PS; 
ID3D11PixelShader* D2D_PS; 
ID3D10Blob* D2D_PS_Buffer; 
ID3D10Blob* VS_Buffer; 
ID3D10Blob* PS_Buffer; 
ID3D11InputLayout* vertLayout; 
ID3D11Buffer* cbPerObjectBuffer; 
ID3D11BlendState* d2dTransparency; 
ID3D11RasterizerState* CCWcullMode; 
ID3D11RasterizerState* CWcullMode; 
ID3D11SamplerState* CubesTexSamplerState; 
ID3D11Buffer* cbPerFrameBuffer; 

ID3D10Device1 *d3d101Device;  
IDXGIKeyedMutex *keyedMutex11; 
IDXGIKeyedMutex *keyedMutex10; 
ID2D1RenderTarget *D2DRenderTarget; 
ID2D1SolidColorBrush *Brush; 
ID3D11Texture2D *BackBuffer11; 
ID3D11Texture2D *sharedTex11; 
ID3D11Buffer *d2dVertBuffer; 
ID3D11Buffer *d2dIndexBuffer; 
ID3D11ShaderResourceView *d2dTexture; 
IDWriteFactory *DWriteFactory; 
IDWriteTextFormat *TextFormat; 

IDirectInputDevice8* DIKeyboard; 
IDirectInputDevice8* DIMouse; 

ID3D11Buffer* sphereIndexBuffer; 
ID3D11Buffer* sphereVertBuffer; 

ID3D11VertexShader* SKYMAP_VS; 
ID3D11PixelShader* SKYMAP_PS; 
ID3D10Blob* SKYMAP_VS_Buffer; 
ID3D10Blob* SKYMAP_PS_Buffer; 

ID3D11ShaderResourceView* smrv; 

ID3D11DepthStencilState* DSLessEqual; 
ID3D11RasterizerState* RSCullNone; 

ID3D11BlendState* Transparency; 

#endif 
后10
+0

'摄像头MainCamera;'把它放在标题中会让你容易受到“多重定义”链接错误的影响。如果在多个源文件中包含'camera.h',则会声明多个MainCamera,这会导致这样的错误。事实上,即使你解决了编译问题,这就是*将会发生的事情。 – PaulMcKenzie 2015-03-31 15:26:11

+0

鉴于它有#ifndef它不应该能够重新定义MainCamera?它包含在多个文件中,然后移动cameraupdate功能 – Invictus 2015-03-31 15:32:22

+0

不会。这不会发生。你有2个独立的模块,RandomVariables.cpp和Camera.cpp。他们将分开编译,不是?所以当链接器现在看到'MainCamera'变量出现在RandomVariables和Camera对象代码中时,链接器将发出错误。要么停止使用全局变量,要么学习如何在多模块程序中使用它们。 http://stackoverflow.com/questions/9702053/how-to-declare-a-global-variable-in-c – PaulMcKenzie 2015-03-31 15:35:52

回答

0

使用externs只是声明相对cpp文件中的类对象解决了问题。