1

私はソフトウェア エンジニアリング クラスのチームと一緒にプロジェクトに取り組んでおり、視差スクロールを使用するとゲームの見栄えが良くなると思いますが、実装のアイデアが正しいかどうかはよくわかりません。誰かが私たちの計画について何らかの指針を与えるでしょう。

まず、Level、Tileset、Layer の 3 つのクラスがあり、最初のクラスには Layers と Tileset の 2 つのベクトルがあるため、最初のレベルの TMX ファイルからすべてのデータをベクトルでロードするという考えですが、描画するのは現在カメラにあるマップの一部であるため、サイクル内ですべてのレイヤーを描画しますが、各レイヤーの速度がどのように定義されているかがわからないため、視差スクロールは想定どおりに機能します.

PD: 誰かがさらに情報を必要としている場合は、疑いを持たずに質問してください。

4

2 に答える 2

1

返事遅れてすみません。私はすでに問題を見つけました、私は新しいコードを残すので、誰かがこれが役に立つと思うかもしれません。問題は、タイルマップの各行で異なるオフセットを処理することでしたが、現在は解決されています。

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 );
}
于 2011-10-09T19:13:33.200 に答える
0

複数の背景レイヤーが適切な奥行きの印象を与える方法で移動する必要がある2D横スクロールゲームを実装していますか?

その場合、1つのアプローチは、各レイヤーのビューアからの距離を定義することです。無限の距離をシミュレートするのに十分な距離にある参照ポイントを選択し、レイヤーを介してそのポイントへのビューベクトルの交点を計算します。ビューアが移動したら、新しいビューアの位置についても同じようにします。古い参照ベクトルと新しい参照ベクトルの交点間の距離を使用して、レイヤーの速度を決定します。

より簡単な方法は、いくつかのコントロールを使用してスクロール速度を調整し(または、フロントレイヤーのスクロール速度と他のレイヤーの速度スケールを調整し)、見栄えが良くなるまでそれを試してみることです。

于 2011-09-03T22:19:08.093 に答える