Я занимаюсь разработкой проекта симулятора зоопарка.Он содержит три типа объектов: карту, среду обитания животных и самих животных.Карта слишком велика, чтобы уместиться на экране, игрок должен переместить экран, чтобы увидеть другие ее части.Я использую таймер для рисования.На своем галочке он вызывает Invalidate()
для формы, на которой рисуется.В методе ZooForm_Paint
я сначала рисую каждую вещь на карте в mapBuffer
Bitmap.Поскольку mapBuffer
слишком велик, чтобы поместиться на экране, я рисую (на экране) часть игрока mapBuffer
, где игрок.
К сожалению, кажется, что все на карте нарисовано (хотя может и несмотреть) на mapBuffer
тормозит игру.Могу ли я нарисовать свою среду обитания и животных без необходимости сначала рисовать всю карту?Как?
Мой код:
public void DrawGame(Graphics g, ref Point locationOnMap)
{
this.drawBufferMap();
this.drawMapLocation(g, ref locationOnMap);
}
private void drawBufferMap()
{
Bitmap buffer = new Bitmap(this.map.Size.Width, this.map.Size.Height);
using (Graphics graphics = Graphics.FromImage(buffer))
{
graphics.DrawImageUnscaled(this.map.Picture, new Point()); // draw entire map
foreach (var item in this.zoo.Environments) // draw all env.
{
graphics.DrawImageUnscaled(item.Picture, item.Bounds.Location);
}
foreach (var item in this.zoo.ILocatables) // draw all ILocatables
{
graphics.DrawImageUnscaled(item.Picture, item.Location);
}
}
if (this.mapBuffer != null)
{
this.mapBuffer.Dispose();
}
this.mapBuffer = buffer;
}
private void drawMapLocation(Graphics g, ref Point location)
{
g.DrawImage(this.mapBuffer, new Rectangle(0, 0, viewSize.Width, viewSize.Height),
new Rectangle(location.X, location.Y, viewSize.Width, viewSize.Height), GraphicsUnit.Pixel);
}