Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Иллюзия движения


Автор: Metalex 15.2.2009, 20:16
Просьба к volvo877 или к любому уверенно знающему паскаль человеку: обьясните пожалуйта действие и назначение команд GetImage, PutImage и им подобных. Столкнулся с такой проблемой: захотел освоить (а не познакомится) с иллюзией движения на паскаль, но не могу нигде найти нормального обьяснения. Обьясните, пожалуйста, вы, а если я что не пойму, то переспрошу. И несколько примеров можно. Но на одних примерах не научишся, нужна и теория. Спасибо.

Автор: Virtuals 16.2.2009, 06:36
Metalex, дык а что сложного то?
GetImage -копирует область изображения в переменную
PutImage - копирует из переменной в область экрана по функции
(
   BitBlt Operators
  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
 Use these operators for images you place on
 the screen with PutImage.

   Constant  │ Value │ Meaning :
  ═══════════╪═══════╪══════════
   NormalPut │   0   │ MOV
   CopyPu    │   0   │ MOV
   XORPut    │   1   │ XOR
   OrPu      │   2   │ OR
   AndPut    │   3   │ AND
   NotPut    │   4   │ NOT
)

для эмуляции движения нужно (если с применением GetImage, PutImage):
1.рисуем обьект напр муху
2.копируем с помощью GetImage прямоугольник с мухой в переменную А.
3.копируем такого-же размера участок, куда собираемся переместится в переменную Б.
4.вставляем изображение мухи с помощью PutImage
_пауза
5.вставляем оригинальное изображение взамен мухи с помощью PutImage
6.переходим на п3.

вот те пример для обучения, правда боюсь сложноват поначалу будет, но если разберешся то познаеш много нового //возможны ошибки, т.к. ваялось во времена очень давно, но все компилится и работает. (TP6..TP7)
(обьекты, графический режим 256цветов, BGI скомпилится в exe=не нужно с собой таскать, обьект рисования графика с прокруткой.)

Автор: Metalex 16.2.2009, 12:19
Вот, во всех учебниках написано чето типа этого, мож я такой, но мне не все понятно. Попробую, конечно, разобраться, посмотрим.

Автор: Virtuals 16.2.2009, 13:20
Metalex, что непонятно? пиши конкретней!
1. сам принцип симуляции движения?
2. как сохранить изображение?
3. как вывести сохраненное изображение на экран?

Автор: Metalex 16.2.2009, 22:08
Оу, кстати никто не знает, как прописать путь к граф. файлам на Free Pascal?

Автор: volvo877 16.2.2009, 23:40
К каким граф. файлам? Ты о чем?

Автор: Metalex 17.2.2009, 15:52
Ну вот как на  Borland Pascal
Код
initgraph (draver, mode, '[I]C:\BP\BGI[/I]');

(к примеру так)
путь к граф. файлам указывается, так во Free Pascal какой путь указывать? У меня просто обычный паскаль отказывается работать.

Автор: volvo877 17.2.2009, 19:16
Цитата(Metalex @  17.2.2009,  14:52 Найти цитируемый пост)
во Free Pascal какой путь указывать?
Никакой не указывай, передавай пустую строку. В режиме совместимости с TP это прекрасно работает.

Автор: Metalex 17.2.2009, 22:23
то есть как: вообще не писать 
Цитата(Metalex @  17.2.2009,  15:52 Найти цитируемый пост)
initgraph

? или так:
Цитата(Metalex @  17.2.2009,  15:52 Найти цитируемый пост)
initgraph (draver, mode);

??

Автор: volvo877 17.2.2009, 22:48
Код
InitGraph(driver, mode, '');
 Я ж говорю: пустую строку

Автор: Metalex 17.2.2009, 22:51
Понял smile 
Обьясните еще, пожалуйста, как работают процедуры LineRel и MoveRel. Допустим зададим с помощью MoveTo какую-либо точку и как с помощью этих процедур рисовать дальше?

Добавлено через 9 минут и 23 секунды
С GetImage и PutImage вроде разобрался smile 
В очереди стоят GetColor, GetMem. Огромная просьба: обьяните что с ними и как, а также если не сложно напишите к каждой (и к GetImage и PutImage) типа такого:
PutPixel (x,y, цвет), то есть чтоб я уверенно знал, что и где ставить.

Автор: Virtuals 18.2.2009, 07:36
Цитата(Metalex @  17.2.2009,  22:23 Найти цитируемый пост)
то есть как: вообще не писать Цитата(Metalex @  17.2.2009,  15:52 )initgraph? или так:Цитата(Metalex @  17.2.2009,  15:52 )initgraph (draver, mode);??

а мой пример смотрел?
там есть библиотека GR256_3u, а пользовать ее
Код

var g      :GR256_3;

begin
 ModeG256:=2; \\разрешение в 256 цветном режиме
 G.Init;
...
работаем в графическом режиме
...
и выходим
 G.Done;
end.


 smile и никаких BGI не нужно

Автор: volvo877 18.2.2009, 09:24
Цитата(Virtuals @  18.2.2009,  06:36 Найти цитируемый пост)
а мой пример смотрел?
Ну, я смотрел твой пример... К сожалению, только исходник, поскольку откомпилировать его FreePascal-ем мне не удалось (массив Port, однако, отсутствует, а Extender ставить не очень-то и хотелось), так что... Никуда не денешься от BGI...

Автор: Virtuals 18.2.2009, 14:08
volvo877, так удали эти процедуры из библиотеки, они для палитры, и в примере не использовались ;)

Код

Procedure SetRGBFull(RGB:RGBRecord);
 Procedure GetRGBFull(var RGB);


Код

{################}
 Procedure SetRGBFull(RGB:RGBRecord);
  var w1:Byte;
  begin
   for w1:=0 to $FF do begin
                        port[$3C8]:=w1;
                        port[$3C9]:=RGB[w1].R;
                        port[$3C9]:=RGB[w1].G;
                        port[$3C9]:=RGB[w1].B;
                    end;
  END;
 Procedure GetRGBFull(var RGB);

  var w1:Byte;
      RGB0:RGBRecord absolute RGB;
  begin
   for w1:=0 to $FF do begin
                        port[$3C7]:=w1;
                        RGB0[w1].r:=port[$3C9];
                        RGB0[w1].G:=port[$3C9];
                        RGB0[w1].b:=port[$3C9];
                    end;
  End;
{################}



вырезать нафиг

Автор: Metalex 18.2.2009, 16:47
Ой, ой, ой, что то вы написали такое - недоступное моему пониманию smile 
Все таки, может кто попытается дать ответ на мои вопросы..
Буду признателен.

Добавлено через 9 минут
В общем я мало понял из того, что вы написали..
Просто укажите, что нужно изменить к примеру в этой программе:
Код
Program Primer12; {programa dvigenia sharika so sledom po sinysoide}
 uses crt,Graph;
 CONST Pause=5000;
 Var p1, p2:pointer;                 {p1-ykazatel na obraz "sleda",}
     grm,grd,x,y,x1,y1:integer;      {p2-ykazatel na obraz sharika}
     size,c: word;
Begin
 grd:=0; InitGraph (grm,grd,''); {Inicializaciya graphicheskogo
         regima s avtomaticheskim opredeleniem podxodyashego drivera}
 c:=GetColor; {c - tset izobrageniya}
 x1:=0; y1:=90;               {x1,y1-nachalnuye koordinatu sharika}
 PutPixel (0,y1+5,c);         {Izobragenie "sleda"}
 size:=ImageSize (0,0,10,10); {size-kolichestvo baytov dlya izobrageniya}
 GetMem (p1, size);           {kvadrata 11*11}
 GetImage (0,y1,10,y1+10,p1^);{p1 ykazuvaet na oblast pamyati s izobr.sleda}
 SetFillStyle (11,c);         {tip i tsvet zakraski}
 Circle (x1+5, y1+5, 5);
 FloodFill (x1+5,y1+5,c);     {zakraska okrygnosti}
 GetMem (p2, size);
 GetImage (x1,y1,x1+10,y1+10,p2^); {p2 ykazuvaet na oblast pamyati s izobr.sharika}
 while not Keypressed do
 begin
   for x:=1 to GetMaxX do
    begin
      y:=trunc(40*sin(0.1*x)+90);  {x,y-graficheskie koordinatu
                                    novogo pologeniya sharika}
      PutImage (x1,y1,p1^,0); {na meste sharika izobragaetsya sled}
      PutImage (x,y,p2^,0);   {sharik izobragaetsya na novom meste}
      Delay (Pause);
      x1:=x; y1:=y;           {zapominayatsya novue koordinatu sharika}
    end;
 end;
 readln;
 CloseGraph;
end.

чтоб она работала на фри паскале?
Если просто запустить так выдает про какойто оптимум, а если вместо пути поставить пустую строку, возникает вторая ошибка - пишет нельзя открыть конфигфайл..

Автор: volvo877 18.2.2009, 17:15
Посмотри в Аттач... Что я делаю не так?

Только Pause надо уменьшить, а то будешь часами ждать перемещения...

Цитата(Metalex @  18.2.2009,  15:47 Найти цитируемый пост)
Если просто запустить так выдает про какойто оптимум
А "просто так" - это как? У тебя УЖЕ передана пустая строка...
Цитата(Metalex @  18.2.2009,  15:47 Найти цитируемый пост)
пишет нельзя открыть конфигфайл
Точное сообщение об ошибке - в студию.

Автор: Metalex 18.2.2009, 21:09
Цитата(volvo877 @  18.2.2009,  17:15 Найти цитируемый пост)
Точное сообщение об ошибке - в студию.

По заказам телезрителей:
http://ipicture.ru/Gallery/Viewfull/13541544.html
той красной строки не было, писало то же.

Автор: volvo877 18.2.2009, 22:07
Options -> Compiler, в поле "Additional compiler args" убрать этот самый -Opentium3, и нажать Ok ... Это уберет ошибку. Пробуй smile

Автор: Metalex 18.2.2009, 22:32
volvo877, есть!
Помоги с тем, что я раньше написал, если не сложно..

Автор: volvo877 20.2.2009, 12:36
Цитата(Metalex @  17.2.2009,  21:51 Найти цитируемый пост)
Понял smile Обьясните еще, пожалуйста, как работают процедуры LineRel и MoveRel. Допустим зададим с помощью MoveTo какую-либо точку и как с помощью этих процедур рисовать дальше?
MoveRel и LineRel работают с относительными (Relative) смещениями... То есть, поставил ты точку, потом через MoveRel смещаешься относительно нее на какое-то расстояние, и LineRel-ом чертишь тоже относительно текущей позиции граф. курсора линию... Вот, скажем:
Код
MoveTo(100, 100);
LineRel(20, 30); { Начертит линию от (100, 100) до (120, 130) }
LineRel(-50, 60); { Теперь начертит от (120, 130) до (70, 190) }
MoveRel(100, 100); { И переместит указатель в точку (170, 290) }


Цитата(Metalex @  17.2.2009,  21:51 Найти цитируемый пост)
В очереди стоят GetColor, GetMem. Огромная просьба: обьяните что с ними и как
А что с ними? GetColor вернет текущий цвет пера, т.е., тот цвет, который был установлен последним вызовом SetColor, и которым будут рисоваться граф. примитивы... Просто запоминаешь его:
Код
var color: word;
...
color := GetColor; { Запомнил тот цвет который текущий сейчас }
{ Здесь можешь установить свой цвет, отрисовать им, что нужно }
SetColor(color); { А потом вернуть, как было }
Очень удобно использовать в процедуре, если тебе надо отрисовать что-то своим цветом, но ведь не надо менять текущий цвет пера для всей программы? Вот и запомни/сделай/восстанови...

Ну, а с GetImage/PutImage ты говоришь и сам разобрался...

Автор: Metalex 22.2.2009, 23:13
1. 
Цитата(volvo877 @  20.2.2009,  12:36 Найти цитируемый пост)
Ну, а с GetImage/PutImage ты говоришь и сам разобрался...

я написал вроде smile 

2. volvo877, ты обидил GetMem.  smile 

3. Как использовать GetColor понятно, но не совсем понятно зачем она вообще..

4. Выходит, что разницы между LineRel и LineTo нет?

5. И не могу найти все параметры стиля заполнения команды SetFillStyle, точнее я знаю, что их 11 и знаю, что, например, 0-это заполнение цветом фона, а вот остальные 10.. 

Автор: Soah 22.2.2009, 23:34
Цитата(Metalex @  22.2.2009,  23:13 Найти цитируемый пост)
5. И не могу найти все параметры стиля заполнения команды SetFillStyle, точнее я знаю, что их 11 и знаю, что, например, 0-это заполнение цветом фона, а вот остальные 10.. 

http://www.ozon.ru/context/detail/id/126770/
Цитата

0   EmptyFill       ->  Заливается цветом фона
1   SolidFill       ->  Заливается цветом col
2   LineFill        ->  Штриховка горизонтальными линиями
3   LtSlashFill     ->  Тонкая штриховка под 45 градусов
4   SlashFill       ->  Толстая штриховка под 45 градусов
5   BkSlashFill     ->  Толстая штриховка под 135 градусов
6   LtBkSlashFill   ->  Тонкая штриховка под 135 градусов
7   HatchFill       ->  Двойная штриховка, 0 и 90 градусов
8   XHatchFill      ->  Двойная штриховка, 45 и 135 градусов
9   InterleaveFill  ->  Короткие чередующиеся штрихи
10  WideDotFill     ->  Редкий точечный растр
11  CloseDotFill    ->  Густой точечный растр
12  UserFill        ->  По шаблону пользователя


Добавлено через 7 минут и 54 секунды
Цитата(Metalex @  17.2.2009,  15:52 Найти цитируемый пост)
путь к граф. файлам указывается, так во Free Pascal какой путь указывать?

надо указать путь к файлу EGAVGA, он находится в папке BGI рядом с BIN

Автор: volvo877 23.2.2009, 02:27
Цитата(Soah @  22.2.2009,  22:34 Найти цитируемый пост)
надо указать путь к файлу EGAVGA, он находится в папке BGI рядом с BIN 
Тебе тоже надо персонально сказать, что для FPC не надо указывать этот параметр явно, компилятор и без твоей указки справится? Кстати, наверное на оф. сайте какой-то кривой FPC выложен? Там папки BIN вообще НЕТ!!! К тому же никто не обязан работать только с EgaVga...

Soah, а ты FreePascal вообще в глаза видел? Или читать разучился?


Цитата(Metalex @  22.2.2009,  22:13 Найти цитируемый пост)
Как использовать GetColor понятно, но не совсем понятно зачем она вообще..
Я ж написал, зачем... Есть у тебя процедура, тебе надо при выходе из нее сохранить прежний активный цвет, который и был до входа в эту процедуру. А внутри процедуры рисовать надо другим. Твои действия (без GetColor)?

Цитата(Metalex @  22.2.2009,  22:13 Найти цитируемый пост)
Выходит, что разницы между LineRel и LineTo нет?

Разницу между абсолютным и относительным смещением понимаешь? LineRel(10, 10) проведет линию от последней точки (X, Y) в точку (X+10, Y+10), а LineTo(10, 10) - в точку (10, 10)... 

Цитата(Metalex @  22.2.2009,  22:13 Найти цитируемый пост)
ты обидил GetMem.
GetMem не относится к графике напрямую, только косвенно... Просто выделяет необходимое количество памяти в куче. Какие именно у тебя с этой процедурой проблемы?

Автор: Metalex 23.2.2009, 08:56
Цитата(volvo877 @  23.2.2009,  02:27 Найти цитируемый пост)
Какие именно у тебя с этой процедурой проблемы?

Пока никаких, интересуюсь, что это вообще за штука. ImageSize тоже наверн с этой оперы?

Добавлено через 1 минуту и 44 секунды
Вот имеется примерчик:
Код
Program ModelAtoma;
uses crt, graph;
Const
Ra=100; {Radius atoma}
Rc=10; {Radius yadra}
Re=4; {Radius elektrona}
k=0.5; {Koeficient sjatiya orbit elektronov}
Dr=30; {Parametr izmeneniya koordinat elektronov}
Stepl=0.2; {Shag izmeneniya pologeniya elektrona}
Step=100; {Vremya zadergki-skorost' dvigeniya elektronov}
Var
cx,cy,y,y1,y2,y3,x,x1,x2,x3:integer;
I,I1,I2,I3:real; driver, mode:integer;
Begin
Clrscr;
driver:=detect;
initgraph (driver, mode,'D:\BP\BGI');
SetTextStyle (0,0,2);
OutTextXY (200,30,'Model atoma');
cx:=GetMaxX div 2; {Opredelit' tsentr ekrana-polojeniye yadra}
cy:=GetMaxY div 2;
PieSlice (cx, cy, 0, 360, Rc); {narisovat' yadro atoma}
SetColor (Red);
SetLineStyle (0, 0, 3);
Line (cx-7, cy, cx+7, cy);
Line (cx, cy-5, cx, cy+5);
SetLineStyle (0,0,1);
SetFillStyle(1,1);
I:=Pi/4; {zadat' nachl'noe polojeniye 4 elektronov}
I1:=-Pi/4;
I2:=-Pi/2;
I3:=Pi/2;
SetTextStyle(0,0,1);
SetColor (yellow);
OutTextXY(180, 420,'Dlya otmenu najmute ljbyy klavishy');
While not KeyPressed do {povtoryat', poka ne najata ljbaya klavisha}
Begin
{opredelit' koordinatu elektronov}
x:=Round (Ra*cos(I))+cx;
y:=Round (k+Ra*sin(I))+cy;
x1:=Round ((Ra+Dr)*cos(I1))+cx;
y1:=Round (k*(Ra+Dr)*sin(I1))+cy;
x2:=Round ((Ra-Dr)*cos(I2))+cx;
y2:=Round (k*(Ra-Dr)*sin(I2))+cy;
x3:=Round ((Ra-Dr)*cos(I3)*2.3)+cx;
y3:=Round (k*(Ra-Dr)*sin(I3)*2.3)+cy;
{ystanovit' sinij tsev i narisovat' elektronu}
SetColor (1);
Circle (x,y,Re); PutPixel (x,y,2);
Circle (x1,y1,Re); PutPixel (x1,y1,2);
Circle (x2,y2,Re); PutPixel (x2,y2,2);
Circle (x3,y3,Re); PutPixel (x3,y3,2);
Delay (Step);
{narisovat' elektronu tsvetom fona}
SetColor (0);
Circle (x,y,Re); PutPixel (x,y,2);
Circle (x1,y1,Re); PutPixel (x1,y1,2);
Circle (x2,y2,Re); PutPixel (x2,y2,2);
Circle (x3,y3,Re); PutPixel (x3,y3,2);
{zadat' izmeneniye polojeniya elektronov}
I:=I+Stepl; I1:=I1-Stepl;
I2:=I2+Stepl; I3:=I3+Stepl;
end; {konets tsykla}
readln;
CloseGraph;
end.

Помогите в ней разобраться.. Здесь же по ходу используется немного другой принцип рисования?

Автор: volvo877 23.2.2009, 09:59
Цитата(Metalex @  23.2.2009,  07:56 Найти цитируемый пост)
Здесь же по ходу используется немного другой принцип рисования? 
Самый обычный: изображение отрисовывается, потом "замирает" на какое-то время, чтоб ты успел рассмотреть его, потом рисуется то же изображение цветом фона (то есть, стирается), меняются координаты, и все заново, опять рисуем/ждем/стираем...

Автор: Metalex 23.2.2009, 15:50
А что за штука Round?

Автор: Virtuals 24.2.2009, 06:25
Metalex, 
может скачаеш какой нить нормальный паскаль или хэлповник к freePas докачаеш?

Автор: Metalex 24.2.2009, 08:48
Virtuals, ну и где этот хелп докачать, дай ссылку.

Автор: volvo877 24.2.2009, 10:17
Metalex, у тебя есть выбор, либо взять файл TURBO.TPH от обычного Турбо-Паскаля, и подключить его в FPC через Help -> Files -> New (ага, он прекрасно читает TPH-файлы), но тогда ты получишь справку только по тому, что есть в TP.

Или идешь сюда: http://www.freepascal.org/down/docs/docs-russia.html, качаешь доки в формате HTML, распаковываешь, заходишь в IDE -> Help -> Files -> New, и добавляешь файлы rtl\index.htm и ref\ref.html... (при добавлении надо будет дождаться, пока достроится индекс)

Или качаешь оттуда же PDF-файлы, и используешь их в качестве хелпа...

Автор: Metalex 24.2.2009, 16:29
volvo877, поставил, буду разбираться. спс.
Вот прикольно, Round оказалось обычным округлением..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)