Собственно, с чего все начиналось? С того, что я начал искать художника (или дизайнера, как кому нравится) и музыканта. Пусть это и выглядит смешно (набирать команду для создания "пятнашек"), но почему бы и нет?
Я И СЕЙЧАС НЕ ОТКАЖУСЬ ОТ ПОМОЩИ, и в титры включу обязательно.
Получилось сзаду-наперед, но все же перекопирайтю некоторые посты со "старого" форума. Дабы внушить уверенность в потенциальных напарников.
25 August 2005 года
Работа кипит.
нота: Выкладывать код пока не стану
Сделано:
ФУНКЦИИ:
1. fnDraw2D() - отвечает за вывод всего на экран.
2. fnDrawGrid(clr=110) - рисует сетку заданным цветом: от черного до белого через серые тона (там Color (clr,clr,clr) стоит).
3. fnDrawCells() - рисует игровое поле: клетки с надписями-цифрами.
4. fnChoiceCell() - проверяет, на какую цифру нажали.
5. fnInitCells() - заполняет игровое поле цифрами слева-направо в порядке возрастания.
6. fnMoveCell(numX,numY,flagCheck=1) - двигает клетку с "координатами" (numX,numY) на пустое место, если это возможно.
Флаг flagCheck определяет надо ли делать проверку на "законченность композиции".
После упорядочивания цифр делает поле на 1 клетку шире по Х и по У.
7. fnCheckComplete() - проверяет все ли цифры упорядочены: если да, то говорит правду, нет - лжёт.
нота: Хочу на неё же повесить определение упорядоченности в процентном соотношении, т.е. на сколько процентов поле упорядочено.
8. fnRandomMix(kolvo=1000) - перемешивает цифры. Параметр kolvo считаю по формуле, учитывающей размер игрового поля.
9. fnClearField() - "удаляет" игровое поле (пока не востребована).
10. fnTimeProshlo$(millis) - получает миллисекунды и возвращает время в виде строки формата "{мин} : {сек} . {сотые от сек}"
11. fnCreateStar(kolvo=1,maxKolvo=300) - создаёт звезду (выводится белой точкой).
kolvo - сколько звёзд создавать
maxKolvo - ограничитель, позволяющий поддерживать постоянное конечное число звёзд на экране.
12. fnUpdateStars(enable=1) - рисует звёзды и удаляет те из них, которые улетели за экран.
enable - флаг, если 1, то функция выполняется, если НЕ 1, то не выполняется. Может пригодиться для отрисовки звёзд 1 раз из N (ФПС увеличится прилично. А скорость полёта можно увеличить, чтобы не было "замедления времени").
нота: Звёзды летят из центра экрана к его краям - выглядит будто бы мы играем на лобовом стекле летящего космического корябля.
13. fnStartGame(size=2) - настройка необходимых для игры параметров. Содержит функции fnInitCells() и
fnRandomMix(50*sizeField*sizeField). (sizeField = size)
size - это размер игрового поля.
Также тут происходит обнуление прошедшего времени и количества ходов.
Программа довольно универсальна - в том плане, что:
1. Можно сделать поле ЛЮБОГО размера, только поиграть получится НЕ в любое (оно за экран вылезет, о переполнении переменных молчу).
ПРИЧЁМ: код при этом править НЕ нужно!
2. Не привязана к конкретному разрешению экрана, а это ОЧЕНЬ важно, если настройки видео делать!
27 August 2005 года
Изменена работа функции fnCheckComplete() - теперь она возвращает степень упорядоченности чисел в процентном соотношении.
28 August 2005 года
Новое:
ФУНКЦИИ:
1. fnMainMenu() - отвечает за внешний вид (графику) и обработку ГлавногоМеню игры. В него игрок попадает после запуска игры и из самой игры.
2. fnMainMenu() - отвечает за внешний вид (графику) и обработку ИгровогоМеню игры. Оно рисуется ВСЕГДА наряду с остальными игровыми элементами в режиме Игры.
3. fnDeleteDecimal$(number#,kolvodecim=1) -
http://www.boolean.name/post.php?cat...7&pid=6&page=1
4. fnDrawScore(kolvo=4,x,y,shagX=0,shagY=0) - выводит на экран лучшие результаты.
5. fnReadScore(size=4) - читает лучшие результаты из файла.
6. fnWriteScore(name$,time$,hody) - записывает результат игры в файл при условии, что этот результат ЛУЧШЕ какого-либо результата из таблицы рекордов.
7. fnSortScore(scoreKolvo) - сортирует рекорды.
8. fnDrawVerticalText(p_text$,p_x,p_y,p_dx=0,p_dy=0) - рисует вертикальный текст. Я с её помощью вывожу имя игрока в игре.
9. fnInputName() - альтернатива функции Input(), но она НЕ ОСТАНАВЛИВАЕТ НА СЕБЕ выполнение программы
Правда за ЭТО пришлось заплатить глобальной переменной, но ОНО того стоит, по-моему
С её помощью прога спрашивает имя игрока.
Плюс всякие изменения по мелочи в ранее созданных функциях.
Совсем запамятовал: теперь можно "управлять" скоростью движения звёзд!
На числовой клаве:
"+" - увеличить скорость движения звёзд
"-" - уменьшить скорость движения звёзд
Теперь можно настроить её по своему вкусу...
Скорость движения звёзд не зависит от производительности железяки, на которой запущена игра.
ПС: менюшки ПРИВЯЗАНЫ к разрешению экрана 1024х768
Но это временно
29 August 2005 года
Свершилось ДОЛГОЖДАННОЕ событие: ПЕРВЫЙ релиз программы
30 August 2005 года
Я завел файл истории history.txt, в него пишу изменения начиная с первого релиза.
Вот его сегодняшнее состояние:
Исправлено:
1. Если при вводе имени игрок нажимал клавишу F, то флаг показа ККС (FPS) менялся на противоположный.
2. Невозможно было ввести имя русскими буквами.
Оказалось, что функция Trim(), которая должна удалять пробелы вначале и в конце слова, русские символы считает пробелами.
Написал свою функцию fnTrim$().
Добавлено:
1. Показ ЧИСЛА, которое должно стоять на месте клетки, на которую наведён указатель мыши. Чтобы увидеть это число, необходимо навести указатель мыши на нужную клетку и нажать клавишу Ctrl. При этом другие числа исчезнут.
Такая возможность особенно полезна при игре на большом поле.
Оптимизация:
-делалась с учётом текущих изменений программы
-ККС - это количество кадров в секунду
1. Для определения числа, которое должно стоять на месте клетки, на которую наведён указатель мыши, использовался отдельный цикл, пробегающий по всем клеткам поля.
Убрал отдельный цикл: сделал проверку в цикле, рисующем клетки.
К своему разочарованию прироста ККС не получил. Причина: рассматривалось игровое поле 15х15 клеток, то есть цикл проверки делал бы максимум 225 операций, но это достаточно мало для современных компьютеров.
2. Можно было сделать таблицу значений синуса (массив), и использовать её вместо самой функции.
Но значение угла дробное, и к тому же зависит от текущего значения ККС, поэтому и пишу "можно было" (реализация невозможна).
Расширение экрана 1024х768, много режимов делать не стал...
31 August 2005 года
Исправлено:
ОЧЕНЬ СИЛЬНО облегчил себе жизнь введением 2х глобальнах переменных для хранения состояния нажатости кнопок мыши.
В начале главного цикла (и только в начале):
Mouse1Hit = MouseHit (1)
Mouse2Hit = MouseHit (2)
Все условия типа if (MouseHit(1)) заменил на if (Mouse1Hit=1).
Проблема была в том, что щелчок мыши проверяется несколько раз за 1 проход цикла, НО после 1-йпроверки буфер мыши обнуляется, и получается, что надо либо жать несколько раз, либо при нажатии на "пустом месте" и наведении на меню меню срабатывало.
в первой демке ТАКОГО не было, но я времени прилично потратил на устранение
Добавлено:
1. Звёзды теперь летят с ускорением.
2. Сделал статичные звёзды картинкой.
3. В Главном меню добавил пункт "Новый игрок". Теперь после выхода из игры в Главное меню для того, чтобы заново сыграть или загрузить игру НЕ НУЖНО заново вводить имя - будет использовано ранее введённое имя. Если при вводе новогоимени игрок нажал Esc, чтобы отменить ввод имени, текущем именем будет то, которое было ДО ввода.
4. Добавил сохранение / загрузку. Можно включить режим автосохранения (по умолчанию), при этом после составления всех чисел игра будет сохранена, причём размер поля будет записан на 1 больше чем то, цифры на котором игрок только что составил.
Клавиша A - вкл. / выкл. автосохранение.
/*
В следующей версии кроме всего прочего будет поддержка разных граф. режимов (640х480, 800х600, 1024х76
, в том числе и оконные.
*/
Народ, кто до какого размера поля доходил?
Это я к тому пишу, чтобы вы не удивлялись, почему таблица рекордов ТАК СДВИНУТА ВНИЗ. Дело в том, что положение этой таблицы я выбирал исходя из того, чтобы можно было НОРМАЛЬНО отображать рекорды ВПЛОТЬ до поля 25х25 клеток.
После поля 7х7 прямоугольники с надписями размера поля сдвигаются вниз, и в ИТОГЕ получаем 4 СТРОКИ рекордов, последняя закончится на 25х25.
Если дойдёте до 26х26 или дальше (на экран столько не влезет пока), ВСЕ отобразится правильно, НО надписи "залезут" на баблицу рекордов...
Насчёт звёзд: ускорение заметно?
Просьба особое внимание уделить СОХРАНЕНИЮ / ЗАГРУЗКЕ. Что-то может работать неправильно...
04 September 2005 года
Заменил ТЕКСТ на аналогичные КАРТИНКИ везде, где смог.
Вывожу Text'ом только имя игрока, время, ходы, процент собранности, числа на игровом поле, и подсказки, которые выводятся при наведении на пункт меню.
Картинки делал вот так:
imgTitle = fnTextToImg("z a DOOM k a",200,30)
А сама функция такая:
Function fnTextToImg(p_text$,p_w,p_h,p_rcR=0,p_rcG=0,p_rcB=200,p_tcR=200,p_tcG=200,p_tcB=0,p_font=0,p_midhandle=0)
img = CreateImage (p_w,p_h)
SetBuffer (ImageBuffer (img))
Color (p_rcR,p_rcG,p_rcB)
Rect (0,0,p_w,p_h)
If (p_font<>0) SetFont (p_font)
Color (p_tcR,p_tcG,p_tcB)
Text p_w*0.5,p_h*0.5,p_text$,1,1
If (p_midhandle<>0) MidHandle (img)
SetBuffer (BackBuffer ())
Return img
End Function
Примитив, конечно, но не в том суть! Зато внешние ресурсы грузить не надо
В демке версии 1.1 в ИГРЕ у меня было 38 кадров (очень странное число, почти во всех проектах оно проглядывается), а ТЕПЕРЬ стало 75!
В меню как было, так и осталось, причем рекорды я вывожу ОДНОЙ картинкой.
Если выводится 6 рекордов, то ФПС в районе 70-ти, а если 13, то 37! :>