0

私は C# と XNA の初心者で、現在ボード ゲーム LUDO を作ろうとしています。私は以前にいくつかのJavaプログラミングを行ったことがあり、オブジェクト指向プログラミングと共通しています。現時点で私が立ち往生しているのは、「ボード」のスプライトを描画することです。

MS ペイントで自分で使用しているすべてのスプライトを作成しました。すべての異なるスプライト (26 の異なるスプライト) はすべて同じサイズの 45px X 45px です。私が考えていたのは、数値を含む 2Darray を作成することでした。これらの数値は、テクスチャ配列内の特定のスプライトを参照します。例: ここに、私が設定しているボードの種類へのリンクがあります: http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Klassisk_ludo-spill.JPG/220px-Klassisk_ludo-spill.JPG

私の 2Darray のセットアップは次のとおりです。ボードの上部から開始し、左から右に進みます。だから、これは私が私の2Darrayを作った方法です:

//Create the full grid of the board, where the numbers refer to the sprites that is supposed to be
    // placed here. the array starts from the top of the bord from left to right and then goes downwards.
    int[,] myArray = new  int[,] {{3,3,3,3,3,3,4,4,4,0,0,0,0,0,0},
                                  {3,24,25,23,25,3,4,0,0,0,12,13,12,13,0},
                                  {3,22,23,22,23,3,4,0,4,0,10,11,10,11,0},
                                  {3,24,25,23,25,3,4,0,4,0,12,13,12,13,0},
                                  {3,22,23,22,23,3,4,0,4,0,10,11,10,11,0},
                                  {3,3,3,3,3,3,4,0,4,0,0,0,0,0,0},
                                  {4,3,4,4,4,4,6,0,5,4,4,4,4,4,4},
                                  {4,3,3,3,3,3,3,9,1,1,1,1,1,1,4},
                                  {4,4,4,4,4,4,7,2,8,4,4,4,4,1,4},
                                  {2,2,2,2,2,2,4,2,4,1,1,1,1,1,1},
                                  {2,20,21,20,21,2,4,2,4,1,16,17,16,17,1},
                                  {2,18,19,18,19,2,4,2,4,1,14,15,14,15,1},
                                  {2,20,21,20,21,2,4,2,4,1,16,17,16,17,1},
                                  {2,18,19,18,19,2,2,2,4,1,14,15,14,15,1},
                                  {2,2,2,2,2,2,4,4,4,1,1,1,1,1,1}};

私が言ったように、これらの数値は、別のテクスチャ配列の特定のスプライトに対応すると想定されています。どの番号がどのスプライトに対応するかの概要は次のとおりです。

textureArray = newTexture2D[26];
0 = blueblock;
1 = redblock;
2 = yellowBlock;
3 = greenBlock;
4 = whiteBlock;
5 = blueredBlock;
6 = greenblueBlock;
7 = greenyellowBlock;
8 = yellowredBlock;
9 = xcenterBlock;
10 = BlueBottomLeftBlock;
    11 = BlueBottomRightBlock;
    12 = BlueTopLeftBlock;
    13 = BlueTopRightBlock;
    14 = RedBottomLeftBlock;
    15 = RedBottomRightBlock;
    16 = RedTopLeftBlock;
    17 = RedTopRightBlock;
    18 = YellowBottomLeftBlock;
    19 = YellowBottomRightBlock;
    20 = YellowTopLeftBlock;
    21 = YellowTopRightBlock;
    22 = GreenBottomLeftBlock;
    23 = GreenBottomRightBlock;
    24 = GreenTopLeftBlock;
    25 = GreenTopRightBlock;

現時点では、バックグラウンド クラスで次のようなコンテンツ マネージャーを作成しました。

// ContentManager that is loadedes textures and position for the objects in to game1
    public void LoadContent(ContentManager content)
    {
        this._BlueBlock = content.Load<Texture2D>("blue-block");
        this._RedBlock = content.Load<Texture2D>("red-block");
        this._YellowBlock = content.Load<Texture2D>("yellow-block");
        this._GreenBlock = content.Load<Texture2D>("green-block");
        this._WhiteBlock = content.Load<Texture2D>("white-block");
        this._BlueRedBlock = content.Load<Texture2D>("blue-red-block");
        this._GreenBlueBlock = content.Load<Texture2D>("green-blue-block");
        this._GreenYellowBlock = content.Load<Texture2D>("green-yellow-block");
        this._YellowRedBlock = content.Load<Texture2D>("yellow-red-block");
        this._XCenterBlock = content.Load<Texture2D>("x-center-block");
        this._BlueBottomLeftBlock = content.Load<Texture2D>("blue-bottomleft-block");
        this._BlueBottomRightBlock = content.Load<Texture2D>("blue-bottomright-block");
        this._BlueTopLeftBlock = content.Load<Texture2D>("blue-topleft-block");
        this._BlueTopRightBlock = content.Load<Texture2D>("blue-topright-block");
        this._RedBottomLeftBlock = content.Load<Texture2D>("red-bottomleft-block");
        this._RedBottomRightBlock = content.Load<Texture2D>("red-bottomright-block");
        this._RedTopLeftBlock = content.Load<Texture2D>("red-topleft-block");
        this._RedTopRightBlock = content.Load<Texture2D>("red-topright-block");
        this._YellowBottomLeftBlock = content.Load<Texture2D>("yellow-bottomleft-block");
        this._YellowBottomRightBlock = content.Load<Texture2D>("yellow-bottomright-block");
        this._YellowTopLeftBlock = content.Load<Texture2D>("yellow-topleft-block");
        this._YellowTopRightBlock = content.Load<Texture2D>("yellow-topright-block");
        this._GreenBottomLeftBlock = content.Load<Texture2D>("green-bottomleft-block");
        this._GreenBottomRightBlock = content.Load<Texture2D>("green-bottomright-block");
        this._GreenTopLeftBlock = content.Load<Texture2D>("green-topleft-block");
        this._GreenTopRightBlock = content.Load<Texture2D>("green-topright-block");



    }

そして、これが私の主な問題に出くわすところです。このようにコンテンツをロードする必要がありますか? もしそうなら、textureArray のテクスチャをどのように参照して、数値が 2DArray にあるはずのテクスチャと一致するようにすればよいでしょうか?

ボードは 15 X 15 スプライト (合計 225) であるため、すべてのスプライトを正しい位置に配置するネストされた for ループを作成することを考えていました。また、「public void Draw(SpriteBatch spriteBatch)」メソッドで foreach ステートメントを使用する必要がありますか?

誰かが私にいくつかの指針を教えてくれることを本当に願っています。

よろしくお願いします!

4

2 に答える 2

0

ビットマップなしで楽しみのためにコーディングしました... :)

https://dl.dropbox.com/u/59983887/ludo.rar

 protected override void Draw( GameTime gameTime ) {
        GraphicsDevice.Clear( Color.CornflowerBlue );

        var ss = 3 * BLOCK_TOTAL_SIZE + BLOCK_GAP;
        var bounds = new Rectangle( S, S, ss, ss );                         // Triangle background
        spriteBatch.Begin( SpriteSortMode.Deferred, BlendState.Opaque );
        spriteBatch.Draw( white, bounds, BackColor );
        spriteBatch.End( );

        Matrix transform = Matrix.Identity;

        for (int i = 0; i < 4; i++) {
            // Player area by color
            spriteBatch.Begin( SpriteSortMode.Deferred, BlendState.Opaque, null, null, null, null, transform );
            DrawPlayerAreaByColor( colors[i] );
            spriteBatch.End( );

            transform = Matrix.CreateRotationZ( -MathHelper.PiOver2 ) * Matrix.CreateTranslation( 0, BLOCK_TOTAL_SIZE * 15 - BLOCK_GAP, 0 ) * transform; 

            // Triangle
            for (int j = 0; j < vertex.Length; j++) vertex[j].Color = colors[i];
            basicEffect.World = Matrix.CreateRotationZ( -i * MathHelper.PiOver2 ) * Matrix.CreateTranslation( bounds.Center.X, bounds.Center.Y, 0 );
            basicEffect.CurrentTechnique.Passes[0].Apply( );
            GraphicsDevice.DrawUserPrimitives<VertexPositionColor>( PrimitiveType.TriangleList, vertex, 0, 1 );
        }


        base.Draw( gameTime );
    }

    void DrawPlayerAreaByColor( Color color ) {
        Rectangle bounds = new Rectangle( 0, 0, S, S );
        spriteBatch.Draw( white, bounds, color );                       // Big area
        bounds.Inflate( -BLOCK_SIZE, -BLOCK_SIZE );
        spriteBatch.Draw( white, bounds, BackColor );                   // Background inside big area
        bounds.Inflate( -BLOCK_GAP, -BLOCK_GAP );
        spriteBatch.Draw( white, bounds, Color.White );                 // White area inside big area

        for (int x = 0; x < 2; x++)
            for (int y = 0; y < 2; y++) {
                var mw = bounds.Width - 2 * BLOCK_SIZE - 4 * BLOCK_GAP;
                var mh = bounds.Height - 2 * BLOCK_SIZE - 4 * BLOCK_GAP;
                mw /= 3;
                mh /= 3;
                var mb = new Rectangle( bounds.X + mw, bounds.Y + mh, BLOCK_TOTAL_SIZE, BLOCK_TOTAL_SIZE );
                mb.X += x * ( mw + BLOCK_SIZE + 2 * BLOCK_GAP );
                mb.Y += y * ( mh + BLOCK_SIZE + 2 * BLOCK_GAP );

                spriteBatch.Draw( white, mb, BackColor );
                mb.Inflate( -BLOCK_GAP, -BLOCK_GAP );
                spriteBatch.Draw( white, mb, color );
            }

        bounds = new Rectangle( 0, S, S, 3 * BLOCK_TOTAL_SIZE + BLOCK_GAP );
        spriteBatch.Draw( white, bounds, BackColor );
        for (int x = 0; x < 6; x++)
            for (int y = 0; y < 3; y++) {
                bounds = new Rectangle( x * BLOCK_TOTAL_SIZE, S + BLOCK_GAP + y * BLOCK_TOTAL_SIZE, BLOCK_SIZE, BLOCK_SIZE );
                spriteBatch.Draw( white, bounds, ( x == 1 && y == 0 || x > 0 && y == 1 ) ? color : Color.White );
            }
    }
于 2013-03-29T20:02:17.573 に答える
0

いいですね、私は質問をした日の後半に自分で問題を解決することになりました。これは私のコードがどのように見えるかです:

namespace Ludo

{クラスの背景{

    //Create the full grid of the board, where the numbers refer to the sprites that is supposed to be
    // placed here. the array starts from the top of the bord from left to right and then goes downwards.
    int[,] myArray = new  int[,] {
        {3,3,3,3,3,3,4,4,4,0,0,0,0,0,0},
        {3,24,25,23,25,3,4,0,0,0,12,13,12,13,0},
        {3,22,23,22,23,3,4,0,4,0,10,11,10,11,0},
        {3,24,25,23,25,3,4,0,4,0,12,13,12,13,0},
        {3,22,23,22,23,3,4,0,4,0,10,11,10,11,0},
        {3,3,3,3,3,3,4,0,4,0,0,0,0,0,0},
        {4,3,4,4,4,4,6,0,5,4,4,4,4,4,4},
        {4,3,3,3,3,3,3,9,1,1,1,1,1,1,4},
        {4,4,4,4,4,4,7,2,8,4,4,4,4,1,4},
        {2,2,2,2,2,2,4,2,4,1,1,1,1,1,1},
        {2,20,21,20,21,2,4,2,4,1,16,17,16,17,1},
        {2,18,19,18,19,2,4,2,4,1,14,15,14,15,1},
        {2,20,21,20,21,2,4,2,4,1,16,17,16,17,1},
        {2,18,19,18,19,2,2,2,4,1,14,15,14,15,1},
        {2,2,2,2,2,2,4,4,4,1,1,1,1,1,1}};

    //Create array that will gives the numbers in myArray the right sprites.
    Texture2D[] textureArray = new Texture2D[26];

    // ContentManager that is loadedes textures and position for the objects in to game1
    public void LoadContent(ContentManager content)
    {

        // Binds the places in textureArray with the right sprites
        textureArray[0] = content.Load<Texture2D>("blue-block");
        textureArray[1] = content.Load<Texture2D>("red-block");
        textureArray[2] = content.Load<Texture2D>("yellow-block");
        textureArray[3] = content.Load<Texture2D>("green-block");
        textureArray[4] = content.Load<Texture2D>("white-block");
        textureArray[5] = content.Load<Texture2D>("blue-red-block");
        textureArray[6] = content.Load<Texture2D>("green-blue-block");
        textureArray[7] = content.Load<Texture2D>("green-yellow-block");
        textureArray[8] = content.Load<Texture2D>("yellow-red-block");
        textureArray[9] = content.Load<Texture2D>("x-center-block");
        textureArray[10] = content.Load<Texture2D>("blue-bottomleft-block");
        textureArray[11] = content.Load<Texture2D>("blue-bottomright-block");
        textureArray[12] = content.Load<Texture2D>("blue-topleft-block");
        textureArray[13] = content.Load<Texture2D>("blue-topright-block");
        textureArray[14] = content.Load<Texture2D>("red-bottomleft-block");
        textureArray[15] = content.Load<Texture2D>("red-bottomright-block");
        textureArray[16] = content.Load<Texture2D>("red-topleft-block");
        textureArray[17] = content.Load<Texture2D>("red-topright-block");
        textureArray[18] = content.Load<Texture2D>("yellow-bottomleft-block");
        textureArray[19] = content.Load<Texture2D>("yellow-bottomright-block");
        textureArray[20] = content.Load<Texture2D>("yellow-topleft-block");
        textureArray[21] = content.Load<Texture2D>("yellow-topright-block");
        textureArray[22] = content.Load<Texture2D>("green-bottomleft-block");
        textureArray[23] = content.Load<Texture2D>("green-bottomright-block");
        textureArray[24] = content.Load<Texture2D>("green-topleft-block");
        textureArray[25] = content.Load<Texture2D>("green-topright-block");



    }
    // Method that draws the sprites to the screen.
    public void Draw(SpriteBatch spriteBatch)
    {
        for (int y = 0; y < 15; y++) {
            for (int x = 0; x < 15; x++) {
                spriteBatch.Draw(textureArray[myArray[x, y]], new Rectangle(x * 45, y * 45, 45, 45), Color.White);
            }
        }

    }
} 

}

于 2013-03-30T12:14:59.410 に答える