gpt4 book ai didi

c++ - 关于在 C++/SDL/OpenGL 中实现视差滚动的问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:54 25 4
gpt4 key购买 nike

我一直在与软件工程类(class)的团队合作,我们认为使用视差滚动将帮助我们的游戏看起来非常漂亮,但我们不确定我们的实现想法是否正确,所以我希望有人能为我们的计划提供一些指导。

首先,我们有三个类,Level、Tileset、Layer,第一个有 Layers 和 Tilesets 的两个 vector ,所以我们的想法是将第一层的 TMX 文件中的所有数据加载到一个 vector 中>,但是我们只绘制当前在相机中的 map 部分,因此在一个循环中我们绘制每一层,但我们不确定如何为每一层定义速度,以便视差滚动像预期的那样工作。

PD:如果有人需要更多信息,请不要怀疑。

最佳答案

抱歉回答晚了。我已经发现了问题,我留下了新代码,这样也许有人会觉得这很有用。问题是处理瓦片 map 每一行的不同偏移量,但现在已经解决了。

void Tilemap::drawTilemap(int indexTileset)
{
GLfloat offsetXTemp = offset.x;

offsetXTemp = transformOffsetXToIntervalValues(offset.x);

GLfloat variableSizeTile = 32.f;

GLfloat widthTilesetImage = tilesetList.at(indexTileset).getWidthImage();
GLfloat heightTilesetImage = tilesetList.at(indexTileset).getHeightImage();

int widthMap = (1280 / (int)sizeTiles) + 1;
int heigthMap = (int) ceil( 720.0f / sizeTiles );

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );

glBindTexture( GL_TEXTURE_2D, tilesetList.at(indexTileset).getTexture() );

GLfloat posXPrevious = 0.0f, posXPreviousOnTexture = 0.0f;

for (int i = 0; i < heigthMap; i++)
{
int startX = (int)floor(offset.x/sizeTiles);
posXPrevious = 0.0f;

posXPrevious -= offsetXTemp;
variableSizeTile = 32.f;

for (int j = 0; j < widthMap; j++)
{
if ( startX == widthLevelInTiles )
{
break;
}

int frameIndex = layerMap[i][startX].getID();

if ( frameIndex == 0 )
{
startX++;
variableSizeTile = 32.f;
posXPrevious = posXPrevious + variableSizeTile;

continue;
}

if ( j == 0 && offsetXTemp != sizeTiles)
{
posXPreviousOnTexture = offsetXTemp/widthTilesetImage;
variableSizeTile -= offsetXTemp;
posXPrevious = 0.0f;
}

else
{
variableSizeTile = 32.f;
posXPreviousOnTexture = 0.0f;
}

if ( j == 40 )
{
variableSizeTile = offsetXTemp;
}

frameIndex -= 1;

const GLfloat tileX = posXPrevious;
const GLfloat tileY = sizeTiles * i;
posXPrevious = tileX + variableSizeTile;

const GLfloat verts[] = {
tileX, tileY,
tileX + variableSizeTile, tileY,
tileX + variableSizeTile, tileY + sizeTiles,
tileX, tileY + sizeTiles
};

const GLfloat textureWidth = variableSizeTile / (GLfloat)widthTilesetImage;
const GLfloat textureHeight = sizeTiles / (GLfloat)heightTilesetImage;
const int numFramePerRow = (int)widthTilesetImage / (int)sizeTiles;
const GLfloat textureX = ( (frameIndex % numFramePerRow) * sizeTiles/(GLfloat)widthTilesetImage )
+ posXPreviousOnTexture;
const GLfloat textureY = ( frameIndex / numFramePerRow ) * textureHeight;

const GLfloat texVerts[] = {
textureX, textureY,
textureX + textureWidth, textureY,
textureX + textureWidth, textureY + textureHeight,
textureX, textureY + textureHeight
};

glVertexPointer(2, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, texVerts);
glDrawArrays(GL_QUADS, 0, 4);

startX++;
}
}

glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
}

关于c++ - 关于在 C++/SDL/OpenGL 中实现视差滚动的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7295654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com