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);
}

感谢您的宝贵时间。

XNA平台游戏背景不再改变

好的,我要注意几点:

  1. 当你改变它允许滚动时,你的图层从一个段变成了3个。
  2. 每个单段图层的图像都是随机选择的(从三个中),现在每个图层都有所有三个段的顺序,因为你的for循环加载。
  3. 你没有把你的关卡指数考虑到你的纹理选择。

所以,在过去,每个关卡都会给你一个随机选择的背景,现在你每次都得到相同的选择,因为你在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]...
...

因为leftSegmentrightSegment依赖于segmentWidth,对吧?

int segmentWidth = Textures[0].Width;

这个宽度总是相同的吗?如果是,则不需要在draw方法的纹理索引上这样做,因为它总是相同的索引…

我不太明白你的意思(对不起,我有点笨),但它只是听起来…我觉得很奇怪……我不知道,也许我只是在说一些无意义的东西。