Написал небольшую программку. На экране выводится изображение местности размером 7х7 квадратов (32х32 пикселя каждый), состояшее из двух типов: трава (можно ходить) и деревья (нельзя ходить). Затем рисуется герой поверх карты. Кликая на ближайшие клетки к герою, если трава герой перемещается, если деревья то остается на месте. Кнопками на кпк (вверх, вниз, влево, вправо) можно передвигать карту. Для ускорения вывода графики на экран сначало все рисуется на созданом Image, а потом этот образ переносится на экран.
Все работает.... Но вот в чем загвоздка. Если запускать на КПК или в эмуляторе, то после 2-3 минут блуждания героем по карте память кпк забивается до предела. Выводится ошибка о недостачи памяти и программа закрывается. После закрытия программы память остается заполненной. Лечится только софт ресетом. Если закрыть программу до вывода ошибки, память также не очищается.
В литературе по С# написано, что он сам соберает за собой весь мусор. Тут все наоборот. Почему так происходит?
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
namespace p3
{
public partial class Form1 : Form
{
static Image iWork = new Bitmap(240, 320);
static Graphics g = Graphics.FromImage(iWork);
Graphics gView;
// Масив с картой: 0-трава (ходить можно), 1-деревья (ходить нельзя)
// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
int[,] map = {{0,0,0,1,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0},
{0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
{0,1,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1},
{1,1,0,0,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1},
{0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0},
{1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1},
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1},
{0,0,0,1,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0},
{0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
{0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1},
{1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1},
{0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0},
{1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1},
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
// координаты верхнего левого угла отображаемой карты
int vx, vy = 0;
// координаты Героя
int hx, hy = 0;
// прямоугольник для вывода карты
Rectangle scrR = new Rectangle(0, 0, 224, 224);
Rectangle rect = new Rectangle(220, 1, 19, 19);
Pen p = new Pen(Color.Black);
Point pp;
Color lowerColor = Color.FromArgb(255, 0, 255);
Color upperColor = Color.FromArgb(255, 0, 255);
ImageAttributes imAtt = new ImageAttributes();
Rectangle hRect = new Rectangle(0, 0, 32, 32);
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
pp.X = e.X; pp.Y = e.Y;
rect.X = 220; rect.Y = 1; rect.Width = 19; rect.Height = 19;
if (rect.Contains(pp))
this.Close();
//Application.Exit();
// Герой идет вправо
rect.X = ((hx - vx) * 32) + 32; rect.Y = (hy - vy) * 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy, hx + 1] != 1))
hx++;
// Герой идет влево
rect.X = ((hx - vx) * 32) - 32; rect.Y = (hy - vy) * 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy, hx - 1] != 1))
hx--;
// Герой идет вниз
rect.X = (hx - vx) * 32; rect.Y = ((hy - vy) * 32) + 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy + 1, hx] != 1))
hy++;
// Герой идет вверх
rect.X = (hx - vx) * 32; rect.Y = ((hy - vy) * 32) - 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy - 1, hx] != 1))
hy--;
DrawBG();
DrawBotton();
DrawHero();
Flip();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
gView = CreateGraphics();
DrawBG();
DrawBotton();
DrawHero();
Flip();
}
// Нарисовать героя
private void DrawHero()
{
if ((hx >= vx) && (hx < vx + 7) && (hy >= vy) && (hy < vy + 7))
{
imAtt.SetColorKey(lowerColor, upperColor);
hRect.X = (hx - vx) * 32; hRect.Y = (hy - vy) * 32; hRect.Width = 32; hRect.Height = 32;
g.DrawImage(imageList1.Images[2], hRect, 0, 0, 32, 32, GraphicsUnit.Pixel, imAtt);
}
}
// Нарисовать поверхность земли
private void DrawBG()
{
g.Clear(Color.White);
for (int x = 0; x < 7; x++)
for (int y = 0; y < 7; y++)
if (map[y + vy, x + vx] == 1)
g.DrawImage(imageList1.Images[1], x * 32, y * 32);
else if (map[y + vy, x + vx] == 0)
g.DrawImage(imageList1.Images[0], x * 32, y * 32);
}
private void DrawBotton()
{
p.Width = 2;
rect.X = 223; rect.Y = 1; rect.Width = 16; rect.Height = 16;
g.DrawRectangle(p, rect);
g.DrawLine(p, 225, 3, 236, 14);
g.DrawLine(p, 236, 3, 225, 14);
}
public void Flip()
{
gView.DrawImage(iWork, 0, 0);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == System.Windows.Forms.Keys.Up))
{
// Rocker Up
// Up
if (vy > 0)
vy--;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Down))
{
// Rocker Down
// Down
if (vy < 13)
vy++;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Left))
{
// Left
if (vx > 0)
vx--;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Right))
{
// Right
if (vx < 13)
vx++;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
{
// Enter
}
DrawBG();
DrawBotton();
DrawHero();
Flip();
}
}
}