最初の点:私は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を作成しましたが、これらの問題を解決できません。
「MAPCUBE_H」ヘッダーガードは、何かを含める前にヘッダーファイルの先頭にある必要があります。 –
ありがとうございました。エラーチェックなどのために大したことはありませんでしたので、私はちょっと行きました。 – coderCobra