Я пытаюсь разработать па JRPG / dungeon crawler как летний проект, и сейчас я занимаюсь очисткой своего кода.В бою существуют «панели здоровья», и одна панель здоровья состоит из 3 прямоугольников, которые необходимо нарисовать для каждого персонажа (всего 2-8 символов в зависимости от контекста означает до 24 прямоугольников хилбара одновременно).
Мой старый способ рисовать панель исцеления был основан на 1 текстуре, из которой я взял один пиксель и нарисовал область прямоугольной формы.В основном я использовал текстуру "HealtBar" в качестве цветовой палитры ... например, если исходный прямоугольник был (0, 0, 1, 1), он представлял, чтобы нарисовать черный прямоугольник.
Texture2D mHealthBar;
mHealthBar = theContentManager.Load<Texture2D>("HealthBar");
public override void Draw(SpriteBatch theSpriteBatch)
{
//draw healtbar
theSpriteBatch.Draw(mHealthBar, new Rectangle((int)Position.X+5,
(int)(Position.Y - 20), (MaxHealth * 5)+7, 15),
new Rectangle(0, 0, 1, 1), Color.Black);
theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8),
(int)(Position.Y - 17), ((MaxHealth * 5)), (mHealthBar.Height) - 2),
new Rectangle(2, 2, 1, 1), Color.White);
theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8),
(int)(Position.Y - 17), ((Health * 5)), (mHealthBar.Height) - 2),
new Rectangle(3, 2, 1, 1), Color.Red);
}
это не такхорошее решение ... поэтому вместо этого я попытался создать абстрактный класс, который уменьшил бы объем кода и увеличил бы ясность в коде.
abstract class Drawer
{
static private Texture2D _empty_texture;
static public void DrawRect(SpriteBatch batch, Color color, Rectangle rect)
{
_empty_texture = new Texture2D(batch.GraphicsDevice, 1, 1);
_empty_texture.SetData(new[] { Color.White });
batch.Draw(_empty_texture, rect, color);
}
}
С новым классом Drawer я мог бы броситьудалите переменную "mHealthBar" и нарисуйте прямоугольники более красивым способом кода.Но когда я начал использовать новый способ рисования, в игре появились проблемы с частотой кадров, старый подход был гладким ... в чем причина проблем с частотой кадров?
Drawer.DrawRect(theSpriteBatch, Color.Black, new Rectangle((int)Position.X+5,
(int)(Position.Y - 20), (MaxHealth * 5)+7, 15));
Drawer.DrawRect(theSpriteBatch, Color.White, new Rectangle((int)(Position.X + 8),
(int)(Position.Y - 17), (MaxHealth * 5), 9));
Drawer.DrawRect(theSpriteBatch, Color.Red, new Rectangle((int)(Position.X + 8),
(int)(Position.Y - 17), (Health * 5), 9));