forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на Blitz3D (http://forum.boolean.name/forumdisplay.php?f=14)
-   -   "Пятнашки": з а ДУМ к а (http://forum.boolean.name/showthread.php?t=45)

Жека 05.09.2005 11:16

Еще несколько слов о количестве ФПС.
То, что я текст заменил картинками, кому надо было - прочитали.

Но оказалось, что дело было НЕ только в этом :blink:
ФПС падал на прорисовке СЕТКИ игрового поля.
Вот как я это делал:

Код:

Function fnDrawGrid(clr=110)
Color (clr,clr,clr)

;vertical lines
For i = offsetX To (offsetX+GridInterval*sizeField) Step GridInterval
        Line i,offsetY,i,offsetY+GridInterval*sizeField
Next

;horizontal lines
For i = offsetY To (offsetY+GridInterval*sizeField) Step GridInterval
        Line offsetX,i,offsetX+GridInterval*sizeField,i
Next

End Function

При таком выводе сетки получаю 38-42 ФПС.

А когда заменил эту функцию на вывод картинки, на которой нарисована сетка таким же как выше способом, то ФПС стал 68-75.
Вот так вот :dontknow:


ПС: у меня "пустая" прога вида

Код:

Repeat
Cls
;Тут считаем ФПС
Text 10,10,fps
Flip
Forever

выдает 75!!! ФПС, хоть в 2д, хоть в 3д режиме.
В игре тоже 75, выходит есть какая-то синхронизация с частотой обновления экрана монитора (у меня 75 Гц), которая не позволяет выдавать больше :??

Кто-нить знает, почему так происходит (ограничение)?

SubZer0 05.09.2005 15:21

Цитата:

Originally posted by Жека@Sep 5 2005, 09:16 AM
выдает 75!!! ФПС, хоть в 2д, хоть в 3д режиме.
В игре тоже 75, выходит есть какая-то синхронизация с частотой обновления экрана монитора (у меня 75 Гц), которая не позволяет выдавать больше :??

Кто-нить знает, почему так происходит (ограничение)?

да, на самом деле у команды Flip есть необязательный параметр [vwait] который определяет ждать-ли системе обратного хода луча...

дело в том, что если вдруг допустим ты отключишь ожидание луча и ФПС поднимется одпустим до 80 или 90 ты увидишь моргание на экране (на ЖК не сильно заметно будет) почему это происходит:

луч (прорисовывающий изображение на экране) идет сначала от левого верхнего угла экрана до правого верхнего по одной строке (строчная развертка), после того, как он прошел строку он возвращается на ее начало но теперь сдвигается на одну строку вниз (как типа возврат каретки) (кадровая развертка) и так до конца (низа) экрана... когда луч достигает низ экрана он возвращается обратно (время возврата примерно такое-же как и время прорисовки). А так оно потому, что сетке экрана надо дать остыть до черного цвета. Эти два действия происходят у тебя 75 раз в секунду, дак вот, видеокарта следит за лучем и старается прорисовать экран в тот момент когда сетка остужена (идет обратный ход луча) и экран в это время не прорисовывается, теперь когда луч пойдет заново прорисовывать экран, то будет уже нарисована новая картинка...

Рассмотрим теперь вариант "косого" обновления экрана, луч допустим до середины дорисовал одну часть изображения и тут поступил flip и говорит нужно рисовать другую... здесь зависит от видеокарты:

1. она вообще откажется передавать новое изображение на экран до начала обратного хода луча и оставльная половина экрана будет черной. (что вызовет мигание).

2. все нормально проработается и будет выводиться следующая картинка, теперь смортим: получается на половине экрана одна картинка а на другой половине другая мы конечно этого не заметим, это все будет сильно быстро мы заметим маленькое и весьма раздражающее дергание экрана.

такие весчи (flip 0) стоит делать если у тебя ФПС будет примерно 150 или больше. :)

Жека 05.09.2005 15:42

Спасибо! Теперь ВСЕ ясно. Можно было не так подробно, за что еще раз спасибо.

SubZer0 05.09.2005 15:46

Цитата:

Originally posted by Жека@Sep 5 2005, 01:42 PM
Можно было не так подробно, за что еще раз спасибо.
Позволю себе повториться: этот пост будет тут долго лежать и мож кому еще почитать захочется, чтоб всем все понятно былО ;)

Жека 05.09.2005 16:08

Собственно, с чего все начиналось? С того, что я начал искать художника (или дизайнера, как кому нравится) и музыканта. Пусть это и выглядит смешно (набирать команду для создания "пятнашек"), но почему бы и нет?
Я И СЕЙЧАС НЕ ОТКАЖУСЬ ОТ ПОМОЩИ, и в титры включу обязательно.

Получилось сзаду-наперед, но все же перекопирайтю некоторые посты со "старого" форума. Дабы внушить уверенность в потенциальных напарников.


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х768), в том числе и оконные.
*/

Народ, кто до какого размера поля доходил?
Это я к тому пишу, чтобы вы не удивлялись, почему таблица рекордов ТАК СДВИНУТА ВНИЗ. Дело в том, что положение этой таблицы я выбирал исходя из того, чтобы можно было НОРМАЛЬНО отображать рекорды ВПЛОТЬ до поля 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! :>

SubZer0 05.09.2005 16:27

приаттач сюда что уже готово, чтоб можно было отсюда скачать :)

alcosholik 06.09.2005 00:26

Не забудь исходники ;) :@

Жека 06.09.2005 10:10

Надо сначала цифры на игровом поле сделать тоже КАРТИНКАМИ, но это быстро, значит скоро выложу.

Насчет исходников: я планирую написать тутор типа "Как это было: Пятнашки", в котором опишу процесс создания (может в журнал попадет даже), но сначала доделаю! Сразу по ходу писать не хочется...

Еще нужно сделать "сбор по образцу" (щас только по порядку) + сетевая игра хотя бы на 2х человек (на перегонки, кто быстрее). Сеть - по учебе задали прогу написать, работающую с сетью - думаю вполне сойдет.

alcoSHoLiK, нафига тебе исходник сдался?
(это может комерческий проект будет! ;) )

Жека 07.09.2005 19:10

Цитата:

Надо сначала цифры на игровом поле сделать тоже КАРТИНКАМИ
Сделал!

Также вынес параметр VWait функции Flip() в файл system.txt. Советую попробовать разные параметры вписать (0 и 1).


ПС: На таком компе игра выдает 50 ФПС, а если убрать синхро с монитором, то 80.

AMD Sempron 2600+ (1.88 ГГц)
Radeon 9550 128Mb
RAM 512Mb

Почему так мало?

Чего еще добавить? - Качаем новую демку.

Размер 490 кб.

Упс! ???
А как файл приаттачивать сюда?

SubZer0 07.09.2005 19:13

Проверил.... можно выливать файлы до 5 метров, только где прописывать разрешения для выливаемых файлов так и не нашел, но уже точно знаю, екзешники не идут. :)

Жека 08.09.2005 20:39

Вложений: 2
Вот демка последняя

490 кб

Жека 08.09.2005 20:41

пробовал RAR - сказал нельзя такой тип файлов заливать, но при этом ЗАЛИЛ его!...

Fant 11.09.2005 12:48

я посмотрел канеШна демку!!!!

мне понравилось)
я первый уровень прошел!!!

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

Жека 12.09.2005 07:54

Спасибо за отзыв!

А вообще, ВСЕ игры на своеобразный круг....

Fant 12.09.2005 10:27

А работа над пятнашками продолжается???
Буду ли еще улучшения? (или только дорадатывается то, что уже есть)


Часовой пояс GMT +4, время: 05:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot