我是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语句吗?
我真的希望有人能给我一些指示,非常感谢他们!
祝你好运!
答案 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);
}
}
}
}
}