IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Помощь начинающему, Нужна помощь в освоении Pascal'я
сообщение
Сообщение #21


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 134
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  0  +


Если в текстовом режиме, то через модуль Crt. Курсор по экрану перемещается процедурой GotoXY, затем на экран выводятся символы самым обычным Write. Графика в текстовом режиме рисуется символами псевдографики, их коды можно посмотреть в таблице 866. Чтобы получить символ с каким–то номером, можно воспользоваться функцией Chr, либо написать их номер после решётки. Переключать цвет можно при помощи TextColor и TextBackground. Перед началом игры имеет смысл переключить режим при помощи TextMode(C80 + Font8x8), чтобы знакоместо стало более квадратным, и можно было уместить больше информации на экране.

Не проверял, но что–то близко к этому должно нарисовать коробочку:

uses
Crt;

begin
GotoXY(2, 2);
Write(Chr(218) + Chr (196) + Chr (196) + Chr(191));
GotoXY(2, 3);
Write(Chr(179) + ' ' + Chr(179));
GotoXY(2, 4);
Write(Chr(179) + ' ' + Chr(179));
GotoXY(2, 5);
Write(Chr(192) + Chr (196) + Chr (196) + Chr(217));
end.


Чтобы сделать интерактив, обычно нужно сделать главный цикл. Например, объявить логическую переменную, присвоить ей True, затем сделать цикл while, проверяя в начале цикла, истинна ли эта переменная.

В этом цикле также должна быть задержка, чтобы время в игре шло более менее стабильно. Допустим, это будет Delay(100);

Также в цикле должны проверяться нажатия клавиш. Проверку нажатия клавиш можно сделать через if KeyPressed или while KeyPressed, и если есть нажатые клавиши, то считать их можно при помощи ReadKey. Первым делом надо сделать выход из игры по нажатию Esc. Если ReadKey = Chr(27), то присваиваем логической переменной из того, что выше, False, и программа вывалится из цикла.

Также в цикле должен быть вывод на экран. В графическом режиме EGA это было несколько муторно, надо было постоянно переключать страницы, стирать на неактивных страницах спрайты в их старом положении и рисовать в новом. В текстовом режиме всё должно работать быстро, как пуля, и можно просто делать полную перерисовку. Хотя я бы рекомендовал сначала отрисовать всё в буфере в памяти, а потом выводить на экран, иначе спрайты могут мерцать.

Буфер — это в простейшем случае массив массивов символов. И для тайлов может потребоваться массив массивов. В общем случае тайлы в символы отображаются движком, и у тайла какие–то свойства могут быть типа как у стены раздамаженность. Так что под клетку карты можно объявить запись, и из их этих записей сделать массив массивов в глобальной переменной. А при отрисовке сначала рисовать в буфере кусочек карты, а потом на этом кусочке рисовать спрайты. Начинать, впрочем, можно с массива массива символов, как у буфера.

Под спрайты можно завести запись, и из этих записей сделать одномерный массив в глобальной переменной. Массив делается с запасом, но использоваться будет только его часть, и нужна ещё одна глобальная переменная «количество спрайтов», чтобы игра могла знать, сколько реально первых элементов массива активны.

На стадии отрисовки в буфер спрайты рисуются после тайлов. Но кроме того, чтобы их отрисовать, нужно ещё обработать их игровую логику.

И на этом вроде бы всё.

У меня, таким образом, набрались такие стадии:
  1. Отрисовка в буфер тайлов
  2. Отрисовка в буфер спрайтов
  3. Отрисовка из буфера на экран
  4. Пауза
  5. Обработка игровой механики спрайтов
  6. Обработка нажатых клавиш

Их можно менять местами, но в общем случае главные циклы в играх выглядят как–то так.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Знаток
****

Группа: Пользователи
Сообщений: 466
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Сделаю небольшое отступление.
В своём посте я привёл ссылку на книгу "Песни о Паскале" не просто так. А ещё и с явной мыслью не знакомить ТС с таким названием, как TurboPascal. На данный момент этот компилятор закончил жизненный цикл вместе с операционкой DOS. Совсем.
Удали его и потом помой руки с мылом.
Установи Free Pascal. На том же сайте есть документация, ознакомься со всеми pdf. Справка по составу стандартных модулей в rtl.pdf.
Вместо штатного CRT используй WinCRT из пакета http://math.ubbcluj.ro/~sberinde/wingraph/main.html. Да и WinGraph оттуда же.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской

Репутация: -  0  +


Цитата(Федосеев Павел @ 9.02.2016 0:45) *

А он как то отличается от Турбо Паскаля? Или набор команд другой?


--------------------
Пора убить в себе человека...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Знаток
****

Группа: Пользователи
Сообщений: 466
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Если не лезть в свойства системы и не пытаться работать на низком уровне (создать свои CRT или Graph, работать со шрифтами консоли, используя прямые обращения к ОС) - то никакой разницы нет. Особенно, если в начале программы поставить {$mode TP}. Но если забыть и не поставить, то в 90% случаев будет работать.
Porting Turbo Pascal to Free Pascal

А! Есть разница. FPC родной для Windows, а Turbo работает в виртуальной машине, эмулирующей DOS.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 134
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  0  +


Насчёт жизненного цикла я бы не горячился. Кофейные автоматы и торговые терминалы супермаркетов смеются над вашими представлениями о жизненном цикле. Ну хоть в бюджетных организациях от FoxPro отошли почти везде.

Добиться на Turbo Pascal того, что нужно, тем не менее, вполне возможно.

У меня стоит в подписи английская пословица, хорошего перевода которой я не нашёл, но она примерно значит «Если хочешь добраться до вершины, нужно начинать с низов». В этом смысле некоторая польза от Turbo есть. Там очень мало синтаксического сахара, нет неявных указателей, многие угловатости реального CPU чувствуются через язык, но всё же не настолько много, как в C, где даже со строками толком не поработать поначалу.

Free Pascal и GNAT — это современные 32/64хбитные компиляторы. Для программиста наиболее заметно, что на них можно выделать большие куски памяти (Turbo Pascal может максимум выделить 65536 байт одним куском, но, правда, таких кусков может быть несколько), вплоть до Гигабайтов, хотя если много выделять, работать это хорошо не будет.

Turbo Pascal и его непосредственный преемник поднялись за счёт того, что были хорошо заточены под одну OS. И модуль Crt эту заточенность воплощает. В DOS можно было выбрать только одну кодировку, в РФ это 866ая, в одной кодировке только 256 символов. Кроме того, в DOS было 16 цветов фона и цвета символа.

Насколько мне известно, все реализации Crt тащат за собой все эти ограничения. И если для Turbo Pascal это простительно, то для современных языков программирования — нет.

Пользоваться современным компилятором — это ещё значит и учитывать особенности OS. Так, например, в консоли Windows обычно 16 цветов, но зато 65536 возможных символов, в том числе там больше символов псевдографики. А в консоли POSIX обычно 8 цветов, но зато у символов могут быть эффекты подчёркивания и/или жирности. И диапазон Unicode там полный, 17*65536, в 17 раз больше. А ещё там есть какой–то свой способ рисовать псевдографику, отличающийся от вывода юникодных символов, ведь Midnight Commander мог рисовать свои рамки хоть в КОИ–8, хоть в 1251 кодировке, хотя в этих кодировках не было псевдографики. Но если работать в Юникоде, то, возможно, нет разницы.

Кроме того, есть вариации терминалов с True Color диапазоном, то есть, миллионы цветов, но, впрочем, True Color консоль я видел и для Windows. Это сделано каким–то хаком.

По–разному в разных OS сделано изменение размеров консоли. В Windows программа имеет довольно большую власть над своим окном, может произвольно менять размеры. В Windows программа может прочитать любую область своей консоли. В POSIX программа ничего не может поделать с размерами своего окна. Но ей хотя бы сигналом уведомление приходит об изменении размеров, а в Windows, судя по тому, как это сделано в far /w, только опрашивая размеры окна по таймеру, можно узнать об изменениях. И содержимое окна в POSIX читать нельзя. Такие библиотеки, как ncurses, при запуске программы инициализируют текстовый буфер в памяти, держат его копию, и когда программа изменила текстовый буфер, сравнивают старый текстовый буфер с новым, находят отличия и выводят эти отличия на экран при помощи Escape–последовательностей. И программа может читать только из этого буфера в памяти, по–настоящему доступа к консоли нет.

Кстати, в одной текстовой игре «Dwarf fortress» поддержка этих отличий кончилась тем, что игра по умолчанию работает не в настоящем текстовом режиме, а в SDL'ном окне, в котором типа текстовый режим. Но её по–прежнему можно запускать и в текстовых окнах.

Пользоваться современным компилятором — значит, быть готовым работать с отличиями OS.

Но уж если выбирать современное, то лучше Ada, чем этот исторический аппендицит Free Pascal. У вас нет миллиона строчек кода на Паскале, ради которого вам был бы важен компилятор с идентичной Паскалю семантикой со всеми его ограничениями. Если вы хотите чему–то научиться, вам хоть как придётся много писать самому.

И не заморачиваться сильно по поводу поддержки разных OS. Вот что имеет смысл — так это изолировать процедуры и функции, работающие с OS, в отдельные пакеты, которые для других OS можно потом переписать отдельно. Но я не думаю, что новичок сходу это корректно сделает, так что мой вариант — делать на Ada с использованием консольных WinAPI.

Либо оставаться в уютном мирке DOSBox.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской

Репутация: -  0  +


Я все понял, но мне бы прям материал, с которым можно начать работу. Лекций я в книжках начитался, просто дайте удочку и я пойду рыбачить smile.gif


--------------------
Пора убить в себе человека...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 134
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  0  +


По консольным WinAPI справка на русском, например, здесь: http://vsokovikov.narod.ru/New_MSDN_API/Co...riteconsole.htm По модулю Crt была на сайте.

Как примерно организовать главный цикл, я написал.

На каком этапе затруднения?


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 19.02.2018 11:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"