0

所以我正在开发一个横向滚动平台游戏。我更改了一些代码以允许滚动背景,效果很好;但是现在当我的水平提高时,背景保持不变。

这是图层的类

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

这是类级别加载部分的级别构造函数

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

感谢您的时间。

4

2 回答 2

0

我在这里没有得到你想要的东西:

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 方法的纹理索引执行此操作,因为它始终是相同的索引...

我不太明白你在那里尝试了什么(对不起,我有点笨),但这听起来......对我来说很奇怪......我不知道,也许我只是在胡说八道东西...

于 2013-04-17T12:27:00.087 回答
0

好的,我注意到几点:

  1. 当您将其更改为允许滚动时,您的图层从 1 段变为 3 段。
  2. 每个单段图层的图像是随机选择的(从三个中选择),现在每个层都按顺序包含所有三个段,由 for 循环加载。
  3. 您不会在选择纹理时考虑级别索引。

所以,在过去,每个级别都会给你一个随机选择的背景,现在你每次都得到相同的选择,因为你在 for 循环中加载了第 1 段,然后是 2 段,然后是 3 段。

建议:

  • 重新引入随机性
  • 绘制更多背景,并将您的等级指数纳入背景选择
于 2013-04-17T00:54:22.733 回答