2011-07-28 14 views
0

最初の点:私はC++の専門家ではありません。私は約1年前にそれを少し見て、約2週間前に再び触れていませんでした。私はDirectXをC++で教えることにしました。私はエラーの公平な分担を持っていますが、(ほとんどの場合)自分で解決することができました。私はこの1つをあきらめます。限り、問題を私がどのようにmapCubeクラスの.hと.cppファイルを使用していることを伝えることができるので、私はそれらを投稿します。未解決の外部シンボルがクラスファイルで発生する

エラー自体は少ないが、腹立たしい:私はLINK取得:除くmapCube のすべての機能コンストラクタに関する2019未解決の外部シンボルエラーが、それは彼らが彼らは、メインプログラムが、特許請求の範囲に参照されていると言われます初期化されていません。私が知っている2番目のエラーはcheckColl関数と関係がある、その関数だけでVC++ 2010はx、y、zがもはやmapCubeクラスの一部ではなく、むしろ混乱していると判断します。

コード: mapCube.h

#include <d3d9.h> 
#include <d3dx9.h> 
#include <dinput.h> 

extern const float TILE_WIDTH, TILE_HEIGHT; 
extern LPDIRECT3DDEVICE9 d3ddev; 

// include the Direct3D Library files 
#pragma comment (lib, "d3d9.lib") 
#pragma comment (lib, "d3dx9.lib") 
#pragma comment (lib, "dinput8.lib") 
#pragma comment (lib, "dxguid.lib") 

#ifndef MAPCUBE_H 
#define MAPCUBE_H 

class mapCube{ 
     struct CUSTOMVERTEX {FLOAT X, Y, Z; D3DVECTOR NORMAL; DWORD COLOR;}; //might be able to put these elsewhere 
     #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)    //they are already in main, but mapCube needs them too 
public: 
    LPD3DXMESH cubeMesh; 
    float x,y,z; 
    void setCoord(float, float, float); 
    D3DXVECTOR3 getCoord(){return D3DXVECTOR3(x,y,z);}; 
    mapCube(); 
    mapCube(float, float, float); 
    mapCube(float, float, float, D3DXCOLOR); 
    void draw(D3DXMATRIX); 
    void setColor(D3DXCOLOR); 
    int checkColl(D3DXVECTOR3, D3DXVECTOR3); 
}; 

#endif 

mapCube.cpp

#include "mapCube.h" 

mapCube::mapCube() 
{ 
    x=0; 
    y=0; 
    z=0; 
    setColor(D3DCOLOR_XRGB(128,128,128)); 
} 

mapCube::mapCube(float nx, float ny, float nz) 
{ 
    x=nx; 
    y=ny; 
    z=nz; 
    setColor(D3DCOLOR_XRGB(128,128,128)); 
} 

mapCube::mapCube(float nx, float ny, float nz, D3DXCOLOR color) 
{ 
    x=nx; 
    y=ny; 
    z=nz; 
    setColor(color); 
} 

void mapCube::setCoord(float nx, float ny, float nz) //this function and the next one are both called 
{              //when the cube is created because I'm using 
     x=nx;            //an array of cubes instead of one-by-one 
    y=ny; 
    z=nz; 
}; 

void mapCube::setColor(D3DXCOLOR color)    //basically just colors each vertex 'color' 
{ 
    LPD3DXMESH tmpMesh=NULL; 

    D3DXCreateBox(d3ddev, TILE_WIDTH, TILE_HEIGHT, TILE_WIDTH, &tmpMesh, NULL); 

    tmpMesh->CloneMeshFVF(0, CUSTOMFVF, d3ddev, &cubeMesh); 

    LPDIRECT3DVERTEXBUFFER9 tmpVertBuf=NULL; 

if(SUCCEEDED(cubeMesh->GetVertexBuffer(&tmpVertBuf))) 
{ 
    int nNumVerts = cubeMesh->GetNumVertices(); 
    CUSTOMVERTEX *pVertices = NULL; 

    tmpVertBuf->Lock(0, 0, (void**)&pVertices, 0); 
    { 
      int i=0; 
      while(i<nNumVerts) 
      { 
       pVertices[i].COLOR=color; 
       i++; 
      } 
     } 
    tmpVertBuf->Unlock(); 

    tmpVertBuf->Release(); 
    } 
}; 

void mapCube::draw(D3DXMATRIX matWorld) 
{ 
    D3DXMATRIX matTranslate; 
    D3DXMatrixTranslation(&matTranslate,x,y,z);   //translation to the cubes stored coordinates 

    d3ddev->SetTransform(D3DTS_WORLD, &(matTranslate * matWorld));  //...combined with the total world transform 
    cubeMesh->DrawSubset(0); 
}; 

int checkColl(D3DXVECTOR3 vecTest, D3DXVECTOR3 vecThis)   //2nd arg bc compiler decided to forget 
{                //that this class has x,y,z vars 
    if(vecTest.x>=vecThis.x-(TILE_WIDTH/2.0f) || vecTest.x<=vecThis.x+(TILE_WIDTH/2.0f)) //rudimentary attempt at collision checking 
    { 
     return 1; 
    } 
    else if(vecTest.z>=vecThis.z-(TILE_HEIGHT/2.0f) || vecTest.z<=vecThis.z+(TILE_HEIGHT/2.0f)) 
    { 
     return 2; 
    } 
    else 
    { 
     return 0; 
    } 
} 

申し訳フォーマットはビットオフである場合、これは私はこのインタフェースを使用した最初の時間です。とにかく最後の関数のx/z参照を渡されたD3Dベクトルに変更すると、コンパイラは構文エラーなどを報告しません。 d3dやC++に関係なく、どんな助けや批判も歓迎です。問題があるとは思わないので、私は主な情報源を投稿しませんでしたが、尋ねられたら私もそれを投稿します。

この問題の解決に続いて、この警告に気付きました。 1> Debug \ mapCube.obj:警告LNK4042:複数回指定されたオブジェクト。エキストラが無視されました CUSTOMVERTEXとFVFの重複した定義を削除し、ヘッダーでexternを作成しましたが、これらの問題を解決できません。

+1

「MAPCUBE_H」ヘッダーガードは、何かを含める前にヘッダーファイルの先頭にある必要があります。 –

+0

ありがとうございました。エラーチェックなどのために大したことはありませんでしたので、私はちょっと行きました。 – coderCobra

答えて

0

おそらく、あなたのVC++プロジェクトにmapCube.cppを追加するのを忘れていたかもしれません。 mapCube.cppの先頭に次の行を追加します。

#error This file is indeed being compiled 

その行はコンパイラエラーを生成しない場合は、mapCube.cppがコンパイルされていません。


再構築ソリューションをお試しください。場合によっては同期が外れることがあり、最初からすべてを再コンパイルする必要があります。

+0

悪い点:悪い点(問題解決の点で)=エラーを表示しました。Good =私はコンパイルされていることを知っていて、フレーズによって痛いほど笑いが出ました。 – coderCobra

+0

実際にmapCubeを追加しました。cppをソースファイル(Add Source File)としてプロジェクトに追加し、 '#include" mapCube.cpp "'のような愚かなことはしませんでしたか? –

+0

また、Rebuild Solutionを試すこともできます。場合によっては同期が外れることがあり、最初からすべてを再コンパイルする必要があります。 –

0

明らかに出血を指摘する価値があると思っただけですが、あなたのプロジェクトにはmapCube.cppが含まれていますか?

0

2番目の問題は簡単に解決されます。checkColl実装(mapCube.cpp)には、mapCube::という接頭辞がありません。これにより、コンパイラは、それが "自由な関数"であると考えるようになり、mapCubeのメンバ関数ではありません。

+0

一日中、コードを一日一回見ていると思います。 – coderCobra

関連する問題