XNA平台游戏背景不再改变
本文关键字:改变 不再 游戏背景 平台 XNA | 更新日期: 2023-09-27 18:09:47
我正在制作一款侧面滚动平台游戏。我改变了一些代码,以允许滚动背景,这是完美的工作;然而,现在当我的水平推进背景保持不变。
这是图层的类
class Layer
{
public Texture2D[] Textures { get; private set; }
public float ScrollRate { get; private set; }
public Layer(ContentManager content, string basePath, float scrollRate)
{
// Assumes each layer only has 3 segments.
Textures = new Texture2D[3];
for (int i = 0; i < 3; ++i)
Textures[i] = content.Load<Texture2D>(basePath + "_" + i);
ScrollRate = scrollRate;
}
public void Draw(SpriteBatch spriteBatch, float cameraPosition)
{
// Assume each segment is the same width.
int segmentWidth = Textures[0].Width;
// Calculate which segments to draw and how much to offset them.
float x = cameraPosition * ScrollRate;
int leftSegment = (int)Math.Floor(x / segmentWidth);
int rightSegment = leftSegment + 1;
x = (x / segmentWidth - leftSegment) * -segmentWidth;
spriteBatch.Draw(Textures[leftSegment % Textures.Length], new Vector2(x, 0.0f), Color.White);
spriteBatch.Draw(Textures[rightSegment % Textures.Length], new Vector2(x + segmentWidth, 0.0f), Color.White);
}
}
这是类level
加载部分的level构造函数 public Level(IServiceProvider serviceProvider, Stream fileStream, int levelIndex)
{
// Create a new content manager to load content used just by this level.
content = new ContentManager(serviceProvider, "Content");
timeRemaining = TimeSpan.FromMinutes(2.0);
LoadTiles(fileStream);
// Load background layer textures.
layers = new Layer[3];
layers[0] = new Layer(Content, "Backgrounds/Layer0", 0.2f);
layers[1] = new Layer(Content, "Backgrounds/Layer1", 0.5f);
layers[2] = new Layer(Content, "Backgrounds/Layer2", 0.8f);
// Load sounds.
exitReachedSound = Content.Load<SoundEffect>("Sounds/ExitReached");
}
在允许滚动之前它是这样的
layers = new Texture2D[3];
for (int i = 0; i < layers.Length; ++i)
{
// Choose a random segment if each background layer for level variety.
int segmentIndex = random.Next(3);
layers[i] = Content.Load<Texture2D>("Backgrounds/Layer" + i + "_" + segmentIndex);
}
感谢您的宝贵时间。
好的,我要注意几点:
- 当你改变它允许滚动时,你的图层从一个段变成了3个。
- 每个单段图层的图像都是随机选择的(从三个中),现在每个图层都有所有三个段的顺序,因为你的for循环加载。
- 你没有把你的关卡指数考虑到你的纹理选择。
所以,在过去,每个关卡都会给你一个随机选择的背景,现在你每次都得到相同的选择,因为你在for循环中加载了片段1,然后2,然后3。
建议:
- 重新引入随机性
- 绘制更多背景,并在选择背景时考虑你的关卡指数
我不太明白你的意思:
spriteBatch.Draw(Textures[leftSegment % Textures.Length], new Vector2(x, 0.0f), Color.White);
spriteBatch.Draw(Textures[rightSegment % Textures.Length], new Vector2(x + segmentWidth, 0.0f), Color.White);
更准确地说,是这两件事:
leftSegment % Texture.Length
rightSegment % Textures.Length
您是否尝试手动绘制插入索引?像…
spriteBatch.Draw(Textures[0]...
spriteBatch.Draw(Textures[1]...
...
因为leftSegment和rightSegment依赖于segmentWidth,对吧?
int segmentWidth = Textures[0].Width;
这个宽度总是相同的吗?如果是,则不需要在draw方法的纹理索引上这样做,因为它总是相同的索引…
我不太明白你的意思(对不起,我有点笨),但它只是听起来…我觉得很奇怪……我不知道,也许我只是在说一些无意义的东西。