Помощь - Поиск - Пользователи - Календарь
Полная версия: Фон&движение
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
suriv
короче:
я сделал "фон" я хочу сделать движение на "переднем плане" т.е чтоб фон не стирался.
cleardevice пробовал слишком медленно...
вот код:

uses crt,graph;
var
gd,gm,i,j,l:integer;
o:byte;
s:string;
begin
randomize;
gd:=detect;
initgraph(gd,gm,'');
setcolor(green);
for j:=1 to getmaxy do
begin
j:=j+10;
for i:=1 to getmaxx do
begin
o:=random(256);
i:=i+10;
outtextxy(i,j,chr(o));
end;
end;
readln;
end.


вот на нем мне надо сделать движение но чтоб фон остался.
volvo
Что двигать будешь? Фигуру какую-нибудь?
suriv
текст
volvo
Запоминай маленький участок экрана на том месте, куда будешь выводить текст (через GetImage), потом - PutImage для того чтобы удалить текст, и выводи его в другом месте...
suriv
а чё там про видеостраницы ?
volvo
А не рановато? Ты бы пока с одной разобрался... Не торопись...
suriv
=)
ок
[offtopic]
блин пол-года фигней маялся....
так бы щас паскаль уже хорошо знал[/offtopic]
suriv
Procedure Getlmage(X1,Y1,X2,Y2: Integer; var Buf)
Buf - переменная или участок кучи, куда будет помещена копия видеопамяти с фрагментом изображения.

blink.gif
suriv

uses crt,graph;
var
gd,gm,i,j,l:integer;
o:byte;
f:word;
s:string;
begin
randomize;
gd:=detect;
initgraph(gd,gm,'');
setcolor(green);
for j:=1 to getmaxy do
begin
j:=j+10;
for i:=1 to getmaxx do
begin
o:=random(256);
i:=i+10;
outtextxy(i,j,chr(o));
end;
end;
f:=imagesize(0,0,400,400);
getimage(0,0,400,400,f);
delay(200);
putimage(300,300,f,0);

readln;
end.


что я не так сделал ? ведь по идее должно выйти на экран
volvo
blink.gif
f:word;
...
getimage(0,0,400,400,f);

Ты хочешь картинку 400х400 "запихать" в 2 байта? blink.gif
suriv
эээ... я не совсем понял 4 параметр...
а если longint ?


попробовал так....
f:longint;
Код

 f:=imagesize(0,0,10,10);
 getimage(0,0,10,10,f);
 delay(200);
 putimage(300,300,f,0);

ну а если я работаю с большими картинками ? какой выход ?
volvo

var
f:word;
buf: pointer;
...

f:=imagesize(0,0,400,400);
getmem(buf, f);
getimage(0,0,400,400,buf^);
cleardevice; { для проверки }
putimage(100, 0, buf^, CopyPut);
Shura
Код

Var
size: Word;
p: Pointer;
Begin
.....
size:=ImageSize(0,0,10,10);
Getmem(p,size);
GetImage(0,0,10,10,p^);
 delay(200);
PutImage(300,300,p^,0);
FreeMem(p,size)
.....
End.
suriv

uses crt,graph;
var
gd,gm,i,j,l:integer;
o:byte;
f:word;
buf:pointer;
s:string;
begin
randomize;
gd:=detect;
initgraph(gd,gm,'');
setcolor(green);
for j:=1 to getmaxy do
begin
j:=j+10;
for i:=1 to getmaxx do
begin
o:=random(256);
i:=i+10;
outtextxy(i,j,chr(o));
end;
end;
f:=imagesize(0,0,400,400);
getmem(buf,f);
getimage(0,0,400,400,buf^);
cleardevice;
putimage(100,0,buf^,0);
freemem(buf,f);
readln;
end.


вылетает....
Shura
Может потому что графический режим не закрываешь? (CloseGraph)
suriv

f:=imagesize(0,0,400,400);
getmem(buf,f);
getimage(0,0,400,400,buf^);
cleardevice;
putimage(100,0,buf^,0);
freemem(buf,f);
closegraph;
readln;
end.

нифига...
Дож
Неа, скорее всего причина такогва:

GetImage сохраняет картинку в виде массива... Для картинки 400x400 нужно
160000 байт для режима с 256 цветами. У нас режим 4 bits, для картинки
нужно 160000x0.5=80000 байт, что превышает возможное кол-во зарезервировать память для Pointer( а оно равно ~65500 байт). И прога виснет в операторе GetMem...

Возможные решения: разбить экран на четыре части и для них завести переменные Buf1,Buf2,Buf3,Buf4...
volvo
suriv, а ты убедился, что Buf у тебя не равен Nil? И вообще, что ты запрашиваешь меньше 64К памяти?
Дож
Ах, точно! Если картинка занимает места больше возможного, то ImageSize возвращает ноль!
suriv
спасибо...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.