Я пытаюсь разработать JRPG / dungeon crawler в качестве летнего проекта, и я убираю свой код. В бою существуют «шкалы здоровья», и одна шкала здоровья состоит из 3 прямоугольников, которые необходимо нарисовать для каждого персонажа (всего 2-8 символов в зависимости от контекста означают до 24 прямоугольников шкалы здоровья одновременно).
Мой старый способ рисования полоски здоровья основывался на одной текстуре, где я взял один пиксель и нарисовал поверх прямоугольной области. В основном я использовал текстуру «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));