Анимация в Паскале, Дык, помогите. |
Анимация в Паскале, Дык, помогите. |
LHx |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Репутация: 0 |
Я хочу сделать в игрухе постоянно (часто) обновляемый экран. Для этого меняю страницы. Изображение мелькает, раздваивается, а местами вообще исчезает. Как быть? (мне бы с игрухой до осени управиться, а то в башке засела - не вышибешь. Как заноза. ПОМОГИТЕ.)
-------------------- Если отладка - процесс удаления ошибок из программы, то программирование должно быть процессом их внесения.
|
NetAnton |
Сообщение
#2
|
Пионер Группа: Пользователи Сообщений: 112 Пол: Мужской Репутация: 0 |
для анимации используют спрайты. подробнее о них поищи в Сети, а то я не особый спец в этом. возможно, кое где придется писать асмовые вставки и оптимизировать код.
-------------------- Я люблю этот форум!
|
GLuk |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: 0 |
Выложи код, поглядим...
|
trminator |
Сообщение
#4
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Экран моргает. 60 раз в секунду (стандартно для граф. режимов ДОС, AFAIK) изображения на экране нет. Нужно менять страницы как раз в этот момент.
Код procedure WaitVerticalRetrace; begin while(port[$3da] and 8) = 0 do; end; Приблизительный метод использования: Код чего-то рисуем на невидимой странице; WaitVerticalRetrace; Делаем активную страницу видимой Поищи на osp.ru/pcworld статью "Основы спрайтовой анимации", если желаешь узнать про спрайты. Была в разделе "Компьютер дома" давненько, найти сейчас довольно сложно. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Altair |
Сообщение
#5
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Можно использовать переключение видеостраниц.
Тогда вывод на экран будет мгновенным, и мелькание СОВСЕМ не будет заметно. Алгоритм такой: Код i:=1; 1: setActivePage(i); {рисуем что надо...} setvisualPage(1); If i=1 then i:=0 else i:=1; goto1; Только использовать GOTO не нужно Это я так просто. (не подумайте, что я его использую, да ни когда! ;) ) Только не все режимы поддерживают видеостраницы -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
GLuk |
Сообщение
#6
|
Профи Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: 0 |
Цитата(Oleg_Z @ 4.07.04 10:16) Можно использовать переключение видеостраниц. Тогда вывод на экран будет мгновенным, и мелькание СОВСЕМ не будет заметно. Алгоритм такой: Код i:=1; 1: setActivePage(i); {рисуем что надо...} setvisualPage(1); If i=1 then i:=0 else i:=1; goto1; Только использовать GOTO не нужно Это я так просто. (не подумайте, что я его использую, да ни когда! ;) ) Только не все режимы поддерживают видеостраницы Судя по сабжу он и так юзает переключение страниц, см. пост №1 |
Altair |
Сообщение
#7
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Ага, все ясно, точно, он использует переключение видеостраниц, только использует драйвер, не поддерживающий видеостраницы, только так можно объяснить дерганье!
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
LHx |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Репутация: 0 |
Мне больше нравится путь самурая oleg_7 . Какой драйвер поддерживает такую смену страниц? :p2:
-------------------- Если отладка - процесс удаления ошибок из программы, то программирование должно быть процессом их внесения.
|
Altair |
Сообщение
#9
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Прошу не путать, я не самурай, а извращенец!
И еще я не Oleg 7 а Oleg_Z (Олег Зет! ) :P :P :D Многостраничный вывод возможен только на EGA (256Кб), (S)VGA и Hercules. Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
LHx |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Репутация: 0 |
А vga-никак нельзя?? Ну вы в натуре извращенец, мистер Ааз.
-------------------- Если отладка - процесс удаления ошибок из программы, то программирование должно быть процессом их внесения.
|
BlackShadow |
Сообщение
#11
|
Гость |
Ну почему нельзя?
Oleg_Z, ты же не думаешь, что максимальное кол-во видео страниц 8 - в текстовом 40x25??? Можно быть проще и, если чего-то не дают, то взять самому. Память у тебя оперативная установлена? Вот ей и воспользуйся. Если навернуть пару 32-битных команд, то копирование произвольного куска оперативки в видеобуфер производится в пару строчек и на приемлемой скорости, а, если не полениться и дождяться обратного хода луча (описано выше), то и не заметно будет... |
LHx |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Репутация: 0 |
Вообще-то, я уже попробовал ega - заработало. :D Тем не менее, из вышеперечисленного нифига не понял и прошу объяснений.
-------------------- Если отладка - процесс удаления ошибок из программы, то программирование должно быть процессом их внесения.
|
BlackShadow |
Сообщение
#13
|
Гость |
Объясняю.
Есть несколько очаровательнвх режимов, которые хранят изображение в видео буфере легко и просто - под пиксель по n бит. Есть режимы с "извратом" - там память "слоиться" и приносит кучу гемороя. Под "удобные" режимы можно организовать много-много видеостраниц следующим образом: 1). Выделяешь достаточный кусок памяти и говоришь (себе), что он теперь видеостраница. 2). Рисуешь чего-то прямо в нём, а не на экране. 3). Ждёшь обратного хода луча. 4). Процедуркой типа MOV ECX,BUF_SIZE SHL 2 или же под 16 бит: MOV CX,BUF_SIZE SHL 1 , но тут надо проверить, чтобы размер буфера был менее 128K. Вот таким вот макаром и подставляешь свою "страничку" на место оригинальной. Плюс: ты всегда работаешь с одними и теми же адресами. Минус: аппаратное перекидывание страниц всё-таки пошустрее (хотя это и не заметно). Резюме: при грамотном подходе у любого режима есть "BackBuffer". З. Ы. : спасибо Oleg_Z за то, что подсказал, как оформить концовку поста |
LHx |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Репутация: 0 |
Я бы с большой радостью все понял, но я исключительно бегинер и в ассемблере не шарю.
-------------------- Если отладка - процесс удаления ошибок из программы, то программирование должно быть процессом их внесения.
|
Altair |
Сообщение
#15
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
LHx, сосредоточся на цели - ускорить вывод на экран. (постоянно меняющийся экран).
Какое тебе нужно видео (разрешение и цветность) ? Все от этого зависит, если ты пойдешь на некоторый компромисс между графикой в игре и простотой программирования, то нужно использовать именно страницы! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
SKVOZNJAK |
Сообщение
#16
|
Профи Группа: Пользователи Сообщений: 930 Пол: Мужской Репутация: 11 |
Или же выбрать компилятор помощнее и наплевать на всякие там страницы, а просто вовремя вставлять паузы
|
trminator |
Сообщение
#17
|
Четыре квадратика Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: 4 |
Вот цикл статей на osp.ru/pcworld
http://www.osp.ru/search?text=%2B%F1%EF%F0...ED%EE%E2&sub=9p Фактически там хорошо расписано, как сделать свой двумерный "движок". Листинги программ прилагаются. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
warner |
Сообщение
#18
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: 0 |
Цитата(trminator @ 3.07.04 11:30) Код procedure WaitVerticalRetrace; begin while(port[$3da] and 8) = 0 do; end; Приблизительный метод использования: Код чего-то рисуем на невидимой странице; WaitVerticalRetrace; Делаем активную страницу видимой А есть во FreePascal что-то похожее?? потому что слово port не знает. |
arhimag |
Сообщение
#19
|
Знаток Группа: Пользователи Сообщений: 424 Пол: Мужской Репутация: 2 |
А помогите пожалуйста улучшить это ( мигает, а это не приятно!)
Код program DRAW_BLAD; uses crt, graph; const left = #75; right = #77; up = #72; down = #80; var x, y, Driver, mode: integer; c: char; ekran:word; procedure drawhead(x,y: integer); var i:integer; begin setfillStyle (solidfill, yellow); Pieslice(x,y,0,360,4); setcolor(blue); line(x-7, y-1, x+6, y-4); line(x-7, y-2, x+6, y-4); setcolor(black); line(x-4, y-3, x+3, y-4); setcolor(lightblue); for i:= 1 to 3 do line(x-4, y-3-i, x+3, y-5-i); setcolor(lightblue); setfillstyle(solidfill, lightblue); pieslice(x+1,y-1,0, 360, 1); end; procedure drawbody(x,y: integer); var i: integer; begin x:=x; y:=y+7; setfillstyle (solidfill, lightblue); bar( x-2, y, x+3, y+15 ); setcolor(red); line(x-4, y-3, x+3, y); line(x-4, y-2, x+3, y); line(x-4, y-1, x+3, y); setcolor(white); line(x-4, y-4, x+2, y-1); setfillstyle ( 1 , lightblue); pieslice( x-1, y+2, 0, 360, 2); for i:= 0 to 4 do begin if (i=0) or (i=4) then setcolor(white) else setcolor(lightblue); line(x-1, y+i, x+4, y+14+i); end; setcolor(yellow); setfillstyle( 1, yellow); pieslice( x+4, y+16, 0, 360, 2); end; procedure drawlegs(x,y:integer); begin x:=x; y:=y+7+15; setcolor(red); setfillstyle(1,red); bar(x-2, y, x+3, y+2); setcolor(blue); setfillstyle(1, lightblue); bar(x-2,y+2,x+3, y+12); setcolor(yellow); setfillstyle( 1, yellow); bar(x-1,y+12,x+1, y+14); setcolor(black); setfillstyle(1, black); bar(x-1,y+14,x+2, y+17); bar(x-2,y+15,x+5, y+18); pieslice( x+5, y+16, 0 , 360, 2); end; procedure drawblad (x,y:integer); begin drawhead(x,y); drawbody(x,y); drawlegs(x,y); end; Begin ekran:=0; x:=100; y:=200; driver:=9; Mode:=1; initgraph( driver, mode , ''); setactivepage(ekran); setvisualpage(ekran); setfillstyle(1, green); bar(0,0, getmaxx, getmaxy); drawblad(x,y); repeat ekran:= ekran+1; ekran:= ekran mod 2; c:=readkey; setactivepage(ekran); case c of #0: case readkey of left : begin dec(x); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; right: begin inc(x); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; up : begin dec(y); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; down : begin inc(y); clrscr; setfillstyle(1,green); bar(0,0,getmaxx, getmaxy); drawblad(x,y); end; end; end; setvisualpage(ekran); until x=200; readln; end. -------------------- Чего хочет женщина – того хочет Бог
|
volvo |
Сообщение
#20
|
Гость |
Ну, на данном этапе видеостраницы тебе только мешают... Переделай основной блок вот так, и мигание сильно уменьшится:
Begin |
Текстовая версия | 11.10.2024 13:39 |