{--------------------------------------------------------------------------}
procedure RedrawField; { перерисовка уровня }
var i, j : Integer;
code : Integer;
bitmap : TBitmap;
begin
bitmap := TBitmap.Create; { объект для временного хранения рисунка }
Positioned := 0; { считаем, что размещено 0 камней }
for j := 1 to 12 do
for i := 1 to 20 do
begin
code := Field[i, j]; { код текущего элемента }
{ пара "пустое пространство" / "место" означает "место" }
if (Field[i, j] = SPACE) and Places[i, j] then
code := PLACE
{ а пара "камень" / "место" - "камень на месте" }
else if (Field[i, j] = BOULDER) and Places[i, j] then
begin
code := PLACEDBOULDER;
Positioned := Positioned + 1; { при этом увеличиваем }
end; { счетчик размещенных камней }
Form1.ImageList.GetBitmap(code, bitmap); { достаем картинку }
{ и рисуем ее на соответствующем месте виртуального экрана }
Form1.BackBuffer.Canvas.Draw((i - 1)*32, (j - 1)*32, bitmap);
end;
bitmap.Free;
{ копируем содержимое виртуального экрана на основной }
Form1.Screen.Canvas.CopyRect(Rect(0, 0, 640, 384), Form1.BackBuffer.Canvas, Rect(0, 0, 640, 384));
end;
private void Form1_Paint(object sender, PaintEventArgs e)
{
System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 300));
myBrush.Dispose();
formGraphics.Dispose();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
// заполняет фон формы белым цветом
e.Graphics.FillRectangle(Brushes.White, ClientRectangle);
// рисует картинку с нулевым индексом по координате (1, 1)
imageList1.Draw(e.Graphics, 1, 1, 0);
}
else if ((Field[CurX + dx, CurY + dy] == BOULDER) & (Field[CurX + 2 * dx][CurY + 2 * dy] == SPACE))
// заполняет фон формы белым цветом
e.Graphics.FillRectangle(Brushes.White, ClientRectangle);
// рисует картинку с нулевым индексом по координате (1, 1)
imageList1.Draw(e.Graphics, 1, 1, 0);
else if ((Field[CurX + dx, CurY + dy] == BOULDER) & (Field[CurX + 2 * dx][CurY + 2 * dy] == SPACE))
public void RedrawField(Graphics graphics, Rectangle clientRect, ImageList imageList)
{
graphics.FillRectangle(Brushes.White, clientRect);
imageList.Draw(graphics, 1, 1, 0);
}
private readonly object e;
private void Form1_Paint(string filename)
{
RedrawField();
}
RedrawField();
if (Positioned == N_of_places) {
MessageBox.Show('Уровень пройден!', 'Sokoban', MessageBoxButtons.OK);
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int dx, dy; // смещения Сокобана(куда идем)
int SprIdx; // текущий номер его спрайта
if (Busy)
{
Application.Exit();
}
Busy = true;
if (e.KeyCode == Keys.Left)
{
dx =-1; dy= 0; SprIdx = SL;
}
else if (e.KeyCode == Keys.Right)
{
dx= 1; dy= 0; SprIdx= SR;
}
else if (e.KeyCode == Keys.Up)
{
dx = 0; dy = -1; SprIdx= SU;
}
else if (e.KeyCode == Keys.Down)
{
dx= 0; dy= 1; SprIdx= SD;
}
else
{
dx = 0; dy = 0; SprIdx = Field[CurX, CurY];
}
if (Field[CurX + dx, CurY + dy] == SPACE) {
Field[CurX + dx, CurY + dy] = SprIdx;
Field[CurX, CurY] = SPACE;
CurX = CurX + dx;
CurY = CurY + dy;
}
else if ((Field[CurX + dx, CurY + dy] == BOULDER) && (Field[CurX + 2 * dx,CurY + 2 * dy]) == SPACE)
{
Field[CurX + dx, CurY + dy] = SprIdx;
Field[CurX + 2 * dx, CurY + 2 * dy] = BOULDER;
Field[CurX, CurY] = SPACE;
CurX = CurX + dx;
CurY = CurY + dy;
}
this.Invalidate();
if (Positioned == N_of_places) {
MessageBox.Show("Уровень пройден!", "Сокобан", MessageBoxButtons.OK);
}
Busy = false;
}
public void RedrawField(Graphics graphics, Rectangle clientRect, ImageList imageList)
{
int i, j;
int code;
Bitmap bitmap;
bitmap = new Bitmap(600, 600);
Positioned = 0;
for (j = 1; j <= 12; j++)
{
for (i = 1; i <= 20; i++)
{
code = Field[i, j]; // код текущего элемента
// пара "пустое пространство" / "место" означает "место"
if (Field[i, j] == SPACE & Places[i, j])
{
code = PLACE;
}
//а пара "камень" / "место" - "камень на месте"
else if (Field[i, j] == BOULDER & Places[i, j])
{
code = PLACEDBOULDER;
Positioned = Positioned + 1;
}
}
}
// рисует картинку с нулевым индексом по координате (1, 1)
imageList1.Draw(graphics, 1, 1, 0);
}