由於我在評論中被要求提供3D方式,以下是一些,這是我前段時間寫的一些代碼的摘錄。它是OpenGL和C++。
每個精靈都會被要求自己繪製。使用適配器模式,我會組合精靈 - 也就是說,將會有精靈會持有兩個或更多精靈,它們具有(0,0)相對位置,一個精靈具有包含所有這些「子」精靈的真實位置。
void Sprite::display (void) const
{
glBindTexture(GL_TEXTURE_2D, tex_id_);
Display::drawTranspRect(model_->getPosition().x + draw_dimensions_[0]/2.0f,
model_->getPosition().y + draw_dimensions_[1]/2.0f,
draw_dimensions_[0]/2.0f, draw_dimensions_[1]/2.0f);
}
void Display::drawTranspRect (float x, float y, float x_len, float y_len)
{
glPushMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x - x_len, y - y_len, Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x + x_len, y - y_len, Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + x_len, y + y_len, Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x - x_len, y + y_len, Z);
glEnd();
glDisable(GL_BLEND);
glPopMatrix();
}
tex_id_
是標識哪個紋理用於OpenGL的整數值。紋理管理器的相關部分就是這些。
TextureManager::texture_id
TextureManager::createNewTexture (Texture const& tex) {
texture_id id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width_, tex.height_, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, tex.texture_);
return id;
}
void TextureManager::loadImage (FILE* f, Texture& dest) const {
fseek(f, 18, SEEK_SET);
signed int compression_method;
unsigned int const HEADER_SIZE = 54;
fread(&dest.width_, sizeof(unsigned int), 1, f);
fread(&dest.height_, sizeof(unsigned int), 1, f);
fseek(f, 28, SEEK_SET);
fread(&dest.bpp_, sizeof (unsigned short), 1, f);
fseek(f, 30, SEEK_SET);
fread(&compression_method, sizeof(unsigned int), 1, f);
// We add 4 channels, because we will manually set an alpha channel
// for the color white.
dest.size_ = dest.width_ * dest.height_ * dest.bpp_/8 * 4;
dest.texture_ = new unsigned char[dest.size_];
unsigned char* buffer = new unsigned char[3 * dest.size_/4];
// Slurp in whole file and replace all white colors with green
// values and an alpha value of 0:
fseek(f, HEADER_SIZE, SEEK_SET);
fread (buffer, sizeof(unsigned char), 3 * dest.size_/4, f);
for (unsigned int count = 0; count < dest.width_ * dest.height_; count++) {
dest.texture_[0+count*4] = buffer[0+count*3];
dest.texture_[1+count*4] = buffer[1+count*3];
dest.texture_[2+count*4] = buffer[2+count*3];
dest.texture_[3+count*4] = 0xff;
if (dest.texture_[0+count*4] == 0xff &&
dest.texture_[1+count*4] == 0xff &&
dest.texture_[2+count*4] == 0xff) {
dest.texture_[0+count*4] = 0x00;
dest.texture_[1+count*4] = 0xff;
dest.texture_[2+count*4] = 0x00;
dest.texture_[3+count*4] = 0x00;
dest.uses_alpha_ = true;
}
}
delete[] buffer;
}
:所述的loadFile代碼上每像素BMP文件24位操作 - 紋理管理器實際上通過檢查,以查看是否讀取的顏色爲純白色(的(FF,FF,FF)RGB)仿真alpha通道這實際上是我閒暇時偶爾開發的一個小Jump'nRun。它也使用gluOrtho2D()模式,順便說一句。如果您留下聯繫方式,我會將您的來源發送給您。
謝謝。你能告訴我在2D中做什麼的方法(如果有的話),以及是否可以將3D僅用於玩家精靈,其餘的用2D? – 2008-12-31 08:55:21
對於結合3D和2D:這當然是可能的,但比它的價值更大的破壞力。不過,在正交模式下使用3D框架本質上是2D的。 – mstrobl 2008-12-31 09:31:25
非常感謝:)。上面給出的用於組合2D和3D的代碼(即3D用於字符和2D用於其他所有內容),還是用2D來完成所有代碼? 謝謝aain! – 2008-12-31 09:40:15