Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Các bước đầu về DirectX phần 8 pptx
Nội dung xem thử
Mô tả chi tiết
Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN
127
Dòng đầu tiên trong initParticles là lời gọi tới hàm tạo vertex buffer của emitter. Bởi vì vertex
buffer cần được cập nhật thường xuyên, nên nó được tạo ra với các cờ là
D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY.
Tiếp theo, một vòng lặp duyệt qua tất cả các particle chứa trong emitter và thiết lập cờ hoạt
động cho cúng, thiết lập màu, và vị trí ban đầu. Thông thường, các particle của một emitter
thường xuất hiện ở cùng một vị trí.
Hướng và vận tốc của particle được thiết lập một cách ngẫu nhiên. Điều này khiến cho mỗi
particle chuyển động về các hướng khác nhau.
Hàm update dưới đây, cập nhật vị trí cho từng particle mỗi frame:
/******************************************************************************
* update
*****************************************************************************/
void Emitter::update(void)
{
// duyệt qua để cập nhật vị trí cho các particle
for (int i=0; i<numParticles; i++)
{
// cộng vecto vị trí với vecto vận tốc
m_particles[i].m_vCurPos += m_particles[i].m_vCurVel;
}
}
Vị trí của mỗi particle được thay đổi bằng cách cộng vecto vận tốc (bao gồm cả hướng và độ
lớn) với vecto vị trí hiện tại. Bởi vì giá trị này được cập nhật trên mỗi frame, nên ta thu được
các particle chuyển động trên màn hình.
Hàm cuối cùng là render:
/******************************************************************************
* render
******************************************************************************/
void Emitter::render()
{
CUSTOMVERTEX *pPointVertices;
// Khóa vertex buffer và cập nhật các particle trong đó
pVertexBuffer->Lock( 0,
numParticles * sizeof(CUSTOMVERTEX),
(void**)&pPointVertices,
D3DLOCK_DISCARD );
// duyệt qua các particle
for( int i = 0; i < numParticles; ++i )
{
pPointVertices->psPosition = m_particles[i].m_vCurPos;
pPointVertices->color = m_particles[i].m_vColor;
pPointVertices++;
}
// Mở khóa vertex buffer
pVertexBuffer->Unlock();
// thiết lập texture
emitterDevice->SetTexture( 0, pTexture );
// thiết lập luồng vertex
emitterDevice->SetStreamSource( 0, pVertexBuffer, 0, sizeof(CUSTOMVERTEX) );
// thiết lập định dạng vertex
emitterDevice->SetFVF( D3DFVF_CUSTOMVERTEX );