Другие языки программирования и технологии

PascalABC.NET Графика и анимация простейший уровень, не хочет выполняться процедура, (помогите новичку)

В общем смыл программы надо нарисовать пейзаж по небу летящий НЛО и затем в домике должен загореться свет, в общем программа выполняется , но свет в домике после полета НЛО не горит, а сама процедура выполняется, если отключить процедуру полета НЛО то свет загорается нормально. Вот 2 программы первая это вся в сборе. а вторая это часть которая показывает что свет горит. ПОЛНАЯ USESABCObjects, GraphABC; var c:color; i: integer; y,z: Integer; e: EllipseABC; PROCEDURE okno; Begin SetWindowSize(900,600); {Размер окна} CenterWindow; {Окнов центре} c:=rgb(32,255,0); {цвет -зеленый} ClearWindow(c); {Заливка окна} END; PROCEDURE lanshaft; LABEL m1; Begin c:=rgb(51,76,191); {Цвет - синий} SetBrushColor(c); {Кисть} FillRectangle(0,0,900,300); {заполненый прямоугольник - cinii} c:=rgb(253,233,16); {Цвет - желтый} SetBrushColor(c); {Кисть} Circle(800,100,50); {Луна} i:=1; {zvezda-n} m1: PutPixel(Random(900),Random(300),c); i:=i+1; {readln;} {увеличение i на 1} if i<=50+Random(3000) then goto m1; {zverdi-k} c:=rgb(137,56,13); {Цвет - деревья} SetBrushColor(c); {Кисть} FillRect(130,480,150,550); {Ствол 1} FillRect(750,480,770,550); {Ствол 2} FillRect(440,330,460,400); {Ствол 3} c:=rgb(11,218,81); {Цвет - ствол деревья} SetBrushColor(c); {Кисть} Fillellipse(100,400,180,500); {крона 1} Fillellipse(720,400,800,500); {крона 2} Fillellipse(410,250,490,350); {крона 3} c:=rgb(187,187,187); {Цвет - дома} SetBrushColor(c); {Кисть} FillRect(200,480,280,550); {Дом 1} FillRect(500,450,580,520); {Дом 2} c:=rgb(0,0,0); {Цвет - окно} SetBrushColor(c); {Кисть} FillRect(225,500,255,530); {Окно1} FillRect(525,470,555,500); {Окно2} c:=rgb(255,0,0); {Цвет - крыша} moveto(190,480); Lineto(240,400); Lineto(290,480); Lineto(190,480); FloodFill(250,470,c); moveto(490,450); Lineto(540,370); Lineto(590,450); Lineto(490,450); FloodFill(550,440,c); END; PROCEDURE F; Begin c:=rgb(225,204,0); {Цвет - окно} DrawRectangle(225,500,255,530); FillRect(225,500,255,530); {Окно1} End; PROCEDURE Flying_Saucer; BEGIN y:=100; i:=30; z:=15; repeat LockDrawing; c:=rgb(255,255,255); {Цвет - крыша} SetBrushColor(c); i:=i+1; y:=y+1; e:= new EllipseABC(i,z,70,25,c); Sleep(1); e.Destroy; until y=900; END; Begin okno; lanshaft;Flying_Saucer;F; End. И кусок USESABCObjects, GraphABC; var c:color; Begin SetWindowSize(900,600); {Размер окна} CenterWindow; {Окнов центре} c:=rgb(225,204,0); {Цвет - окно} SetBrushColor(c); {Кисть} FillRect(225,500,255,530); {Окно1} End.
Поправил твой код как мог:
uses
ABCObjects, GraphABC, Timers;

var
c: color;
i: integer;
z: Integer;
e: EllipseABC;
T : Timer;
Di : Byte;
Visible : Boolean;

procedure SvetOkna(r, g, b : Byte);
begin
c := rgb(r, g, b); {Цвет - окно}
SetBrushColor(c); {Кисть}
FillRect(225, 500, 255, 530); {Окно1}
FillRect(525, 470, 555, 500); {Окно2}
end;

procedure InitWindow;
begin
SetWindowSize(900, 600); {Размер окна}
CenterWindow; {Окнов центре}
c := rgb(32, 255, 0); {цвет -зеленый}
ClearWindow(c); {Заливка окна}

c := rgb(51, 76, 191); {Цвет - синий}
SetBrushColor(c); {Кисть}
FillRectangle(0, 0, 900, 300); {заполненый прямоугольник - cinii}
c := rgb(253, 233, 16); {Цвет - желтый}
SetBrushColor(c); {Кисть}
Circle(800, 100, 50); {Луна}
i := 1; {zvezda-n}
repeat
PutPixel(Random(900), Random(300), c);
i := i + 1;
until i > 50 + Random(3000); {zverdi-k}
c := rgb(137, 56, 13); {Цвет - деревья}
SetBrushColor(c); {Кисть}
FillRect(130, 480, 150, 550); {Ствол 1}
FillRect(750, 480, 770, 550); {Ствол 2}
FillRect(440, 330, 460, 400); {Ствол 3}
c := rgb(11, 218, 81); {Цвет - ствол деревья}
SetBrushColor(c); {Кисть}
Fillellipse(100, 400, 180, 500); {крона 1}
Fillellipse(720, 400, 800, 500); {крона 2}
Fillellipse(410, 250, 490, 350); {крона 3}
c := rgb(187, 187, 187); {Цвет - дома}
SetBrushColor(c); {Кисть}
FillRect(200, 480, 280, 550); {Дом 1}
FillRect(500, 450, 580, 520); {Дом 2}
// c := rgb(0, 0, 0); {Цвет - окно}
// SetBrushColor(c); {Кисть}
// FillRect(225, 500, 255, 530); {Окно1}
// FillRect(525, 470, 555, 500); {Окно2}
c := rgb(255, 0, 0); {Цвет - крыша}
moveto(190, 480);
Lineto(240, 400);
Lineto(290, 480);
Lineto(190, 480);
FloodFill(250, 470, c);
moveto(490, 450);
Lineto(540, 370);
Lineto(590, 450);
Lineto(490, 450);
FloodFill(550, 440, c);
SvetOkna(0, 0, 0);
end;

procedure Flying_Saucer;
begin
if Visible then
e.Destroy;
Visible := True;

z := 15;
c := rgb(255, 255, 255); {Цвет - крыша}
SetBrushColor(c);
i := i + Di;
e := new EllipseABC(i, z, 70, 25, c);
if i > Window.Width then
begin
e.Destroy;
SvetOkna(255, 255, 0);
T.Stop;
end
end;

begin
InitWindow;

i := -30;
Di := 5;
Visible := False;
T := New Timer(30, Flying_Saucer);
T.Start;
end.
Вадим Колосков
Вадим Колосков
95 550
Лучший ответ
Потому, что в Flying_Saucer Вы сделали вначале LockDrawing а UnlockDrawing не сделали. В результате после выхода из Flying_Saucer все попытки рисования обречены =)

Поставьте в Flying_Saucer после until y=900 и перед end; UnlockDrawing;