Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Фон&движение

Автор: suriv 16.05.2005 23:38

короче:
я сделал "фон" я хочу сделать движение на "переднем плане" т.е чтоб фон не стирался.
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 16.05.2005 23:41

Что двигать будешь? Фигуру какую-нибудь?

Автор: suriv 16.05.2005 23:42

текст

Автор: volvo 16.05.2005 23:47

Запоминай маленький участок экрана на том месте, куда будешь выводить текст (через GetImage), потом - PutImage для того чтобы удалить текст, и выводи его в другом месте...

Автор: suriv 16.05.2005 23:48

а чё там про видеостраницы ?

Автор: volvo 16.05.2005 23:52

А не рановато? Ты бы пока с одной разобрался... Не торопись...

Автор: suriv 16.05.2005 23:56

=)
ок
[offtopic]
блин пол-года фигней маялся....
так бы щас паскаль уже хорошо знал[/offtopic]

Автор: suriv 17.05.2005 0:00

Procedure Getlmage(X1,Y1,X2,Y2: Integer; var Buf)
Buf - переменная или участок кучи, куда будет помещена копия видеопамяти с фрагментом изображения.

blink.gif

Автор: suriv 17.05.2005 0:11


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 17.05.2005 0:20

blink.gif

f:word;
...
getimage(0,0,400,400,f);

Ты хочешь картинку 400х400 "запихать" в 2 байта? blink.gif

Автор: suriv 17.05.2005 0:22

эээ... я не совсем понял 4 параметр...
а если longint ?


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

Код

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

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

Автор: volvo 17.05.2005 0:28


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 17.05.2005 0:28

Код

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 17.05.2005 0:38


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 17.05.2005 0:41

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

Автор: suriv 17.05.2005 0:48


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.

нифига...

Автор: Дож 17.05.2005 0:50

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

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

Возможные решения: разбить экран на четыре части и для них завести переменные Buf1,Buf2,Buf3,Buf4...

Автор: volvo 17.05.2005 0:51

suriv, а ты убедился, что Buf у тебя не равен Nil? И вообще, что ты запрашиваешь меньше 64К памяти?

Автор: Дож 17.05.2005 0:53

Ах, точно! Если картинка занимает места больше возможного, то ImageSize возвращает ноль!

Автор: suriv 17.05.2005 1:07

спасибо...