使用2d阵列在XNA中绘制棋盘游戏Ludo

时间:2013-03-28 13:08:00

标签: c# xna-4.0 sprite spritebatch

我是C#和XNA的初学者,我目前正在尝试制作LUDO棋盘游戏。我以前做过一些java编程,并且在面向对象编程中很常见。所以我被困在这一刻,就是画出“板子”的精灵。

我制作了我在MS画中使用的所有精灵,所有不同的精灵(26种不同的精灵)都具有45px X 45px的相同尺寸。我想的是制作一个包含数字的2Darray,这些数字将引用纹理数组中的特定sprite。示例:以下是我正在设置的电路板类型的链接:http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Klassisk_ludo-spill.JPG/220px-Klassisk_ludo-spill.JPG

我的2D阵列设置如下:它从板的顶部开始,然后从左到右。所以这就是我制作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}};
像我说的那样,这些数字被认为对应于另一个纹理数组中的特定精灵。以下是与sprite相对应的数字的概述:

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中应该具有的纹理相对应?

我正在考虑制作一个嵌套的for循环,将所有精灵放在正确的位置,因为棋盘是15 X 15精灵(总共225个)。 我也应该在我的“public void Draw(SpriteBatch spriteBatch)”metod中使用foreach语句吗?

我真的希望有人能给我一些指示,非常感谢他们!

祝你好运!

2 个答案:

答案 0 :(得分: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 );
            }
    }

答案 1 :(得分: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);
            }
        }

    }
} 

}