2011-02-18 63 views
0

我敢肯定,这是很容易固定,而且我也已经搜查高和低,走过净双方东,西,南,北,但没有占上风......随机性

我的问题是这个。我正在试图制作一个珠光宝气的克隆,只是为了让我开始在XNA。然而我坚持随机绘制宝石/图标/图片。

这就是我所拥有的。

第一位置,随机和矩形的生成的列表:

List<Vector2> platser = new List<Vector2>(); 
Random slump = new Random(); 
Rectangle bildsourcen; 

protected override void Initialize() 
{ 

for (int j = 0; j < 5; j++) 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       platser.Add(new Vector2((i*100),(j*100))); 
      } 
     } 
base.Initialize(); 
} 

漂亮的直线前进。

我也加载了一个纹理,5个图标/宝石/图片 - > 5 * 100px =宽度500px。

allImage = Content.Load<Texture2D>("icons/all"); 

然后出现“错误”。

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

     spriteBatch.Begin(); 

     int x = slump.Next(2); 
     bildsourcen = new Rectangle((x * 100), 0, 100, 100); 

     for (int i = 0; i < platser.Count; i++) 
     { 
     spriteBatch.Draw(allImage, new Rectangle((int)platser[i].X, (int)platser[i].Y, 100, 100), bildsourcen, Color.White); 

     } 

所以,有我的代码。这就是发生了什么: 我希望它随机选取我的图像的一部分,并将其绘制在从vector2-list中获取的给定坐标上。然而,它会在所有坐标上放置相同的图像,并随机替换它们,而不是随机图像,而是使用相同的图像。所以整个板子一直闪烁着相同的图标。即,而不是生成15231,并保持它冻结,它一秒钟放11111和下一秒它放33333.

有没有人明白什么即时通讯试图描述?我几乎要把自己的头发拉出来。猫的毛发已经拉...提前

回答

1

Draw函数被调用一次每帧

THX。此行:

int x = slump.Next(2); 

正在每帧产生一个随机数(在这种情况下为0或1),因此闪烁。

之后的行根据该数字(特别是指定包含该精灵的矩形)从精灵图集中选择一个精灵。在下面的循环中,您将绘制该精灵的多个副本(始终是相同的图像)。

您应该在Update函数中执行所有游戏逻辑。这个函数会给你一个时间,你可能会想要实现一个方法,在生成一个随机块之前等待一段时间才能通过(因此要继续累积每个Update之间的时间,直到达到某个阈值) 。当你想生成你的随机块的确切机制取决于你。

当然,这并不是说你的代码结构中还有其他缺陷。宝石迷阵是在一块带有不同颜色块的固定尺寸的棋盘上玩的(每个块可以用1到X之间的数字表示)。在你的数据结构中块的位置应该是隐含(所以你不需要生成你的platser列表)。

所以,你的游戏类应该是这样:

const int BoardWidth = 10; 
const int BoardHeight = 10; 
int[,] board = new int[BoardWidth, BoardHeight]; 

然后在你的Initialize功能应填写board,也许使用0作为一个空的空间,1至X代表你的颜色,像这样:

for(int x = 0; x < BoardWidth; x++) for(int y = 0; y < BoardHeight; y++) 
{ 
    board[x,y] = slump.Next(1, 6); // gives 5 different sprites 
} 

然后在Update等待用户输入或修改板(取决于您的游戏玩法)之前超时。

然后在你Draw功能做这样的事情:

for(int x = 0; x < BoardWidth; x++) for(int y = 0; y < BoardHeight; y++) 
{ 
    if(board[x,y] == 0) continue; // don't render an empty space 

    Vector2 position = new Vector2(100*x, 100*y); 
    Rectangle bildsourcen = new Rectangle(100*(board[x,y]-1), 0, 100, 100); 
    sb.Draw(allImage, position, bildsourcen, Color.White); 
} 
+0

哦,伙计。谢谢。现在我必须坐下来分析一下你的代码。当然,我的代码是草率的,有缺陷的。但我刚刚开始。再次感谢 ! – Koads 2011-02-18 12:27:22