我确信这很容易修复,而且我确实搜索过高低,遍及东西,北,南的网但是没有占上风......
我的问题是这个。我正试图制作一个宝石般的克隆,只是为了让我开始在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个图标/宝石/图片 - &gt; 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。
有人理解我试图描述的是什么吗?我差点把自己的头发拉出来。猫的头发已被拉了......
提前谢谢
答案 0 :(得分:1)
每帧调用Draw
函数一次。这一行:
int x = slump.Next(2);
每帧产生一个随机数(在这种情况下为0或1),因此闪烁。
之后的行根据该数字从精灵图谱中选择一个精灵(特别是它指定包含该精灵的矩形)。在接下来的循环中,您将绘制该精灵的多个副本(始终是相同的图像)。
您应该在Update
功能中执行所有游戏逻辑。该函数会给你一些时间,你可能想要在生成一个随机块之前实现一个等待一定时间的方法(所以要不断积累每个Update
之间经过的时间,直到它达到一定的门槛)。您想要生成随机区块的确切机制取决于您。
当然,这并不代表您的代码结构存在其他缺陷。宝石迷阵在具有不同颜色块的固定尺寸的板上播放(每个块可以用1到X的数字表示)。块的位置应该是隐式在您的数据结构中(因此您不需要生成platser
列表)。
所以你的Game类应该有:
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);
}