我需要在XNA中修复这个Tile bug

时间:2015-12-06 15:37:25

标签: c# math xna game-physics tiles

我目前正在制作太空射击游戏。对于这个游戏,我想要一个带有星星的背景,这些背景将永恒地循环。

为了创建这个,我创建了一个基于图块的系统,只为每个纹理创建一个矩形。我已经能够使纹理有点循环,但是当他们这样做时,我得到一个非常奇怪的bug。

Image link for that bug

正如你所看到的,我的瓷砖有时会在彼此之间产生一个小的间隙,我不确定为什么。

问题可能在于我的 Background.cs 文件,但我不确定在哪里。

另外,我想为“Background.cs”提供更好的名称。你觉得像“Tile.cs”这样的东西会更好吗?

Background.cs

Data data = Collections.min(listOfData, 
               Comparator.comparingInt(d -> Math.abs(d.getVal1() - d.getVal2())));

Game.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace SpaceShooter
{
    class Background
{
    public Texture2D texture;
    public List<Rectangle> tiles = new List<Rectangle>();
    public Color color;
    public int tileSize;
    public int speed;
    GraphicsDevice graphicsDevice;

    public Background(Texture2D texture, GraphicsDevice graphicsDevice, int tileSize)
    {
        this.texture = texture;
        this.graphicsDevice = graphicsDevice;
        this.tileSize = tileSize;
        speed = 3;
        this.color = Color.White;
        CalculateTiles();
    }

    public void Update()
    {
        for (int i = 0; i < tiles.Count(); i++)
        {
            tiles[i] = new Rectangle(tiles[i].X, tiles[i].Y + speed, tiles[i].Width, tiles[i].Height);
            if (tiles[i].Y >= graphicsDevice.Viewport.Height)
            {
                tiles[i] = new Rectangle(tiles[i].X, 0 - tiles[i].Height, tiles[i].Width, tiles[i].Height);
            }
        }
    }

    public void CalculateTiles()
    {
        if (tiles.Count() > 0)
        {
            for (int i = 0; i < tiles.Count(); i++)
            {
                tiles.Remove(tiles[i]);
            }
        }
        int XT = (int)(graphicsDevice.Viewport.Width / (tileSize / 1.5f));
        int YT = (int)(graphicsDevice.Viewport.Height / (tileSize / 1.5f));
        for (int i = 0; i < XT; i++)
        {
            tiles.Add(new Rectangle(tileSize * i, 0, tileSize, tileSize));

            for (int j = 0; j < YT; j++)
            {
                tiles.Add(new Rectangle(tileSize * i, tileSize * j, tileSize, tileSize));
            }
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        for (int i = 0; i < tiles.Count(); i++)
        {
            spriteBatch.Draw(texture, tiles[i], color);
        }
    }
}
}

2 个答案:

答案 0 :(得分:0)

我认为您的问题可以通过 LinearWrap

轻松解决

如果您在 Game1.draw 中执行以下操作。

spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap);
background.Draw(spriteBatch);
spriteBatch.End();

获取比例只需进行此计算:

float scale = 128 / 512; // Where 128 is your desired size. and 512 your actual texture size.

并在 Background.cs 绘制方法中。

spriteBatch.Draw(texture, new Vector2(0,0), new Rectangle(pos.X, pos.Y, graphicsDevice.Viewport.Width / scale, graphicsDevice.Viewport.Height / scale), Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, 0);

这应该在整个屏幕上重复纹理。

编辑:

要使图像动态化,您可以使用相机。但是使用你所拥有的系统只需更新即可:

pos += new Vector2(movementX, movementY);

请注意,spriteBatch.Draw有一个参数&#34; Source Rectangle&#34;。如果你改变这个矩形的位置,你的纹理就会移动。

答案 1 :(得分:0)

问题已经解决。
我现在把瓷砖相对于屏幕高度放置而不是原始编程为0.

buf = new byte[size];