Forth http://fforum.winglion.ru/ |
|
[BF] TETRIS http://fforum.winglion.ru/viewtopic.php?f=16&t=787 |
Страница 1 из 2 |
Автор: | forth@km.ru [ Вс июн 03, 2007 19:42 ] |
Заголовок сообщения: | [BF] TETRIS |
первое реальное приложение для ФортОС (BF), игрушка, графика монохромная для портабельности на разное железо, управление с клавы или джойстика, тоже отображенного на клаву я уже публиковал на форуме исходник для старой версии движка, нужно только сделать рефакторинг, что-то выкинуть, попытаться упростить код для понимания |
Автор: | Hishnik [ Вс июн 03, 2007 20:13 ] |
Заголовок сообщения: | |
/me вчувствуется в термин "рефакторинг тетриса" |
Автор: | вопрос [ Вс июн 03, 2007 20:35 ] |
Заголовок сообщения: | |
Ну чего там, всё нуно рефакторизовать, даже тетрис, автор имеет право после такой работы. |
Автор: | Hishnik [ Вс июн 03, 2007 20:41 ] |
Заголовок сообщения: | |
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования? |
Автор: | in4 [ Пн июн 04, 2007 00:12 ] |
Заголовок сообщения: | |
Хищник писал(а): Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?
Да, в качестве следующей лабораторной работы... |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:00 ] |
Заголовок сообщения: | |
ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка вполне себе рефакторинг |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:02 ] |
Заголовок сообщения: | |
Код: 10 CONSTANT _w _w const w \ ширина стакана
20 CONSTANT _h _h const h \ высота стакана |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:03 ] |
Заголовок сообщения: | |
для повышения читабельности кода применил макросы Код: : w[h[ \ макрос начала цикла по стакану h 0 # ( h 0 ) do w 0 # ( w 0 ) do ; Код: : ]]
\ макрос конца цикла по 2м координатам loop loop ; |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:08 ] |
Заголовок сообщения: | |
Код: _w _h ~* CONSTANT ~poolsz \ \ размер буфера стакана ~poolsz const poolsz \ / Код: ~poolsz buffer pool \ буфер стакана Код: : pool[] ( x y -- offset=y*w+x ) \ пересчет кооржинат в стакане в смещение от начала буфера ( y ) w * ( x ) + ; Код: { pool@ ( x y -- value ) \ чтение состояния элемента ( x y ) pool[] \ координаты --> смещение от начала буфера ( offset ) pool + \ смещение --> адрес памяти ( addr ) c@ \ элемент стакана кодируется байтом } Код: { pool! ( value x y -- )
\ запись элемента стакана ( x y ) pool[] \ смещение ( offset ) pool + \ адрес ( value addr ) c! \ запись элемента } |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:12 ] |
Заголовок сообщения: | |
блин, поползло все форматирование в нотепаде сделанное 8-\ |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:18 ] |
Заголовок сообщения: | |
Код: 0 var (c) : c (c) @ ; \ размер элемента стакана в пикселах Код: : CALCULATE_c ( -- ) \ определение размера элемента в пикселах \ по размерам экрана и размерам стакана \ слово вызывается после старта графического драйвера gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue ) (c) ! ; Если размеры экрана (граф.окна) могут меняться в процессе работы программы, нужно переписать слово c так, чтобы оно проверяло что размеры экрана изменились, и выводило требуемый размер ячейки в зависимости от новых размеров экрана: Код: { c ( -- sz )
\ вариант с отслеживанием динамически меняющегося размера графического окна \ без кеширования -- движок шустрый, операции деления дешевы, вычисляем с каждый \ раз заново, не сравнивая предыдущие и текущие значения Xsz Ysz gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue ) } |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:22 ] |
Заголовок сообщения: | |
вспомогательные переменные и макросы, используются при отрисовке клеток стакана Код: 0 var cell/x \ \ экранные координаты угла элемента 0 var cell/y \ / Код: : x1 cell/x @ ; : x2 x1 c + ; : y1 cell/y @ ; : y2 y1 c + ; Код: : x[y[
\ макрос заголовка цикла по 2м координатам y2 y1 do x2 x1 do ; |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:24 ] |
Заголовок сообщения: | |
Код: { pool/draw ( x y -- ) \ отрисовка x;y элемента стакана over ( x ) c * cell/x ! \ экранная координата X элемента dup ( y ) c * cell/y ! \ экранная координата Y элемента ( x y ) pool@ if \ чтение состояния элемента стакана x[y[ i j gr/set ]] else x[y[ i j gr/clr ]] endif } Код: { REDRAW ( -- )
\ перерисовка экрана w[h[ i j pool/draw ]] \ цикл отрисовки стакана } |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:26 ] |
Заголовок сообщения: | |
вот этот ^^^ кусок -- иллюстрация как пользоваться выше определенными макросами тут главное не переусердствовать, а то получится как тот пример шахмат на Си, написанный целиком на макросах |
Автор: | forth@km.ru [ Чт июн 14, 2007 23:28 ] |
Заголовок сообщения: | |
Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна. Код: { POOLRANDFILL ( -- )
\ слово нужно для демонстрации работы REDRAW \ выполняется перед перерисовкой экрана, заполняет стакан случайным образом w[h[ 1 # rnd ( value ) i j pool! ]] } |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |