PDA

View Full Version : CD3DMesh???



ngocquang19877
18-02-2004, 12:24
có ai có tut để sử dụng CD3DMéh ko3cho tui xin,cái lớp này khi tui truy cập hàm create mặc dù thành công nhưng nó chả hiện lên gì cả ? mặc dù đã chỉ lệnh render.

lonelyheart
22-02-2004, 05:25
Tui bạn create thành công nhưng nó vẫn chưa có dữ liệu ngoài 1 vùng bộ nhớ mà thôi. Muốn hiện mesh bạn nên load trực tiếp từ file X bàng hàm D3DXLoadMeshFromFileX hay dùng hàm Create như trên nhưng bạn bạn phải lấy Vertex buffer và Index buffer của Mesh ấy và fill các tọa độ vào , như tọa độ 1 cái hộp chẳng hạn....

ngocquang19877
25-02-2004, 17:21
hehehe! cám ơn bác,lâu lém mới thất bác trả lời.nhưng xin lỗi bác trước.bug nó kô nằm ở đó. thuc ra goi ham create xong,thi phai goi them ham restore device moi duoc ( nho coi source code cua no).con cai class frame (cung la load mesh nhung la cho skin mesh) thi su dung sao nhi?? tuc la lam sao cho no load tung chuyen dong,danh dau key frame cho no day???

hoi bac tiep: co cach nao bitblt trong ñirectx,0 khong ?,con cai vu sprites thi bac co tut nao de hieu khong??chi cho em vai cai voi.con ky thuat shadow volume,bill board clip mirror bac chi cho em lun nhe (tut+ source code de hieu ) cam on bac nhiu

lonelyheart
27-02-2004, 13:24
nếu muốn bitblt thì chỉ còn cách dùng Directdraw nhưng DD kể từ bản 7 không được phát triển nữa nhưng bác có thể dùng nó trong DX8,9 đều được. CÒn nếu không bác dùng 2D trong 3D như các game thường dùng để làm giao diện, tức là bác sử dụng các vertex đã được transform và không được chiếu sáng cụ thể
D3DFVF_FLAG = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX
Sau đó bác set 1 cai texture là cái hình cần bitblt
Sau đó gọi hàm các hàm vẽ để vẽ, nên nhớ là tọa độ của Vertex lúc này không còn trong thế giới thực nữa mà là tọa độ 2D tính từ góc trái trên màn hình Window (tính bằng Pixel )..
Tới giờ tui đi học rồi để mai trả lời bác tiếp ha :-)

lonelyheart
28-02-2004, 13:01
Còn sprites nên dùng cách đơn giản như trong Demo Donut của DX SDK đã làm. Bác cần 1 texture có dang sprite gồm những hình liên tiếp nhau, giả sử bác có 1 mặt hình chữ nhật cần dùng sprite trên đó thì bác chỉ cần chỉnh tọa độ texture sao cho nó nằm trong Frame thứ 1 của Sprite sau đó xây dựng 1 hàm thay đổi tọa độ tex dựa trên số thứ tự Frame. Nói tóm lại bác chỉ cần thay đổi tọa độ tU, tV của từng ver tương ứng là được
Sau đậy là 1 lớp đơn giản đã cài đặt

//------------------------------------------------------------------------
// Sprite class
//------------------------------------------------------------------------

class CSprite
{
protected:
int FramePerLine; // number of frames in 1 bitmap line
int nFrame; // frame number
float fTimePerFrame; // fTime

int FrameCount; // total frames
int OriginOffsetY;
int BitmapHeight;

float fFrameOffset;
public:
float tu1, tv1, tu2, tv2; // Texture coord

protected:
void SetTexCoord(); // calculate texture coord
public:
CSprite();
CSprite( int FrameCount, int FramePerLine, int BmHeight = 0, int OffsetY = 0, int FrameNumber = 1, float TimePerFrame = 0.034f );

inline int GetFrameNumber() { return nFrame; }
inline int GetFrameCount() { return FrameCount; }

inline void SetSpriteInfo( int FrameCount, int FramePerLine, int BmHeight = 0,int OffsetY = 0, int FrameNumber = 1, float TimePerFrame = 0.034f )
{
this->BitmapHeight = BmHeight;
this->OriginOffsetY = OffsetY;
this->FrameCount = FrameCount;
this->FramePerLine = FramePerLine;
this->fTimePerFrame = TimePerFrame;
this->nFrame = FrameNumber;

this->fFrameOffset = 1.0f / FramePerLine;
SetTexCoord();
}
inline void SetCurrentFrame( int nFrame ){
if( nFrame > FrameCount ) nFrame = FrameCount;
this->nFrame = nFrame;
SetTexCoord();
}
inline void SetRandomFrame(){
this->nFrame = rand() % FrameCount + 1;
SetTexCoord();
}

// Main func
void AnimateSprite( float dTime );
};

// Cài đăt
//------------------------------------------------------------------------// [ CSprite class ]
//------------------------------------------------------------------------
CSprite::CSprite()
{
BitmapHeight = 0;
OriginOffsetY = 0;
FrameCount = 1;
FramePerLine = 1;
fTimePerFrame = 0.034f;
nFrame = 1;

fFrameOffset = 1.0f / FramePerLine;
SetTexCoord();
}

//------------------------------------------------------------------------
CSprite::CSprite( int FrameCount, int FramePerLine, int BmHeight,int OffsetY,
int FrameNumber, float TimePerFrame )
{
this->BitmapHeight = BmHeight;
this->OriginOffsetY = OffsetY;
this->FrameCount = FrameCount;
this->FramePerLine = FramePerLine;
this->fTimePerFrame = TimePerFrame;
this->nFrame = FrameNumber;

this->fFrameOffset = 1.0f / FramePerLine;
SetTexCoord();
}

//------------------------------------------------------------------------
void CSprite::SetTexCoord()
{
float OriginV = 0.0f;
if( BitmapHeight > 0 )
OriginV = (float)OriginOffsetY / BitmapHeight;
tu1 = fFrameOffset * ((nFrame - 1) % FramePerLine);
tv1 = OriginV + fFrameOffset * ((nFrame-1) / FramePerLine);
tu2 = tu1 + fFrameOffset;
tv2 = tv1 + fFrameOffset;
}


//------------------------------------------------------------------------
void CSprite::AnimateSprite( float dTime )
{
static float fCountTime = 0.0f;
fCountTime += dTime;
if( fCountTime >= fTimePerFrame )
{
nFrame += (int)(fCountTime / fTimePerFrame);
if( nFrame > FrameCount )
nFrame = (nFrame - 1) % FrameCount + 1;
SetTexCoord();
fCountTime = 0.0f;
}
}