2015-03-31 25 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文件中的類對象解決了問題。