![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
vcxz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
хочу создать компьютерную игру
простую например, змейка или что еще попроще без программирования уж точно не обойтись поэтому решил изучить хотя бы основы языка Си но ещё не начал: перед тем как что-либо учить хотелось бы увидеть весь, так сказать, фронт работы, то есть, что еще, кроме ЯП, придётся изучить? немного погуглив выяснил следующее: большинство программ-приложений работают так: - ввод неких данных - вычисления с полученными данными - вывод результатов вычислений похоже, что в целом этот алгоритм верен для программ, которые работают в каком-то смысле пошагово. это не очень хорошо, так как игры чаще бывают реал-таймовыми Как же тогда работают реал-тайм программы (игры)??? сколько ни думал, могу предположить следующее: способ тот же, только всё пихается в цикл: цикл() { - ввод неких данных //клава, мышь - вычисления с полученными данными //логика игры - вывод результатов вычислений //визуализация, звук } подумал ещё немного и что-то мне мои умозаключения не понравились поэтому решил, что изобретать велосипед не надо, а лучше спросить (собственно вопросы я уже напечатал) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
твой второй велосипед верен не только для игр, но и для обычных программ. Так как очень мало удачных программ завершают свою работы сразу после вывода информации. Обычно, они это делают по требованию пользователя.
Чтобы написать программу, сначала нужно написать (ну или хотя бы представить) алгоритм ее работы. Делается это сверху вниз - от общего к частному. Для этого даже специальный язык придуман - UML. Короче, откладываешь свою игру, идешь в "Часто задаваемые вопросы" (тема прикреплена), там есть "С чего начать учиться"... А через пол годика, в качестве практики, уже сможешь написать свою "змейку". |
|||
|
||||
vcxz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
посмотрел прилепленные темы - нашел там ссылку на курс по OpenGL возникли следующие разногласия с моим велосипедом: если использовать GLUT так как в примере с красным квадратом на черном фоне, то, как я понял, цикл будет внутри glutMainLoop(); точно не разобрался - похоже есть такое понятие как "событие" например нажатие на клавиш как же так? а куда мне писать саму логику игры? вернёмся к змейке - сама змейка движется постоянно, даже если пользователь ничего не нажимал на клаве то есть может и не быть ввода данных, который есть в моём велосипеде значит и не будет события, которое обработает glutMainLoop(); или этот пример с квадратом не подходит для игр? |
|||
|
||||
vcxz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
сам себе отвечу первый пример с квадратом, о котором идёт речь - действительно предназначен для статичного изображения там далее по тексту подробнее объясняется GLUT - я просто невнимательно посмотрел ![]() glutIdleFunc() - похоже оно |
|||
|
||||
RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: 3 Всего: 5 |
в этом случае ввод данных совершает сама программа используя таймер. -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
glutMainLoop() реализует цикл приложения. в цикле вызывается функция, установленная вызовом glutDisplayFunc(). в случае возникновения событий от мыши и клавиатуры вызываются соответствующие функции-обработчики, установленные вызовами glutKeyboardFunc(), glutMouseFunc() и др. В glutDisplayFunc() надо передать функцию, которая занимается отрисовкой кадра. Например, логика может быть такой (упрощенно):
Это сообщение отредактировал(а) baldina - 31.1.2011, 16:08 |
|||
|
||||
vcxz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
несколько лет назад пытался учить MS VB
так вот там на форму приложения можно было ставить 'таймер' на практике это оказалось ПЛОХИМ решением - большой код не успевал выполняться за отведённое время тика таймера может быть это был мой косяк, но таймеры использовать больше не хочется Предполагаю вместо таймера нужно сделать просто бесконечный цикл: - а внутри цикла считать Δt - то есть шаг времени - период за который выполнилась предыдущая итерация цикла - и координаты змейки сдвигать по формуле учитывающей Δt не знаю - можно ли так сделать? |
|||
|
||||
Modul |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
и получится таймер ![]() З.Ы. Данные у программы есть всегда, если их нет - они равны нулю. --------------------
I'll be back ! |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
из пистолета можно застрелиться. можно зарезаться пилочкой для ногтей. отравиться шоколадом. все дело в правильном и неправильном (неумелом, неумеренном) использовании. в данном случае таймер нужен для того, что бы приложение работало с одинаковой скоростью независимо от производительности ПК. Число срабатываний onDraw() зависит от частоты вызова из glutMainLoop(), которая зависит от текущей производительности комп-а. Добавлено через 5 минут и 31 секунду такая программа будет даром проедать процессорное время. конечно, можно Δt и соответствующие перемещения вычислять внутри onDraw, однако лучше разделить логику приложения: реакция на событие отдельно от отрисовки. событие "пора передвинуть змейку" - тоже событие, ничем не хуже нажатия на клавиатуру. Добавлено через 7 минут и 55 секунд кстати, забыл. нужно в onTimer() вставить вызов glutPostRedisplay(); - команду перерисовки окна ща поправлю |
|||
|
||||
vcxz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 26.1.2011 Репутация: нет Всего: нет |
угу - если код логики обработается быстрее кода визуализации вот если бы паузы можно было вставлять в код - тогда можно было бы это устранить кстати, есть большое подозрение, что glutMainLoop может выполниться раньше чем видеокарта отрисует картинку. Где бы это дело уточнить? и снова о времени Δt порылся в гугле и сделал вот это (не смеяться - язык Си изучаю три дня)
что-то оно подозрительно работает выводит кучу нулей (это так и должно быть), и изредка 15 или 16 (а вот это уже странно, так как я ожидал единицу) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
vcxz, зря ты вот так, без подготовки сразу пытаешься взять быка за рога. Поверь мне, если ты не будешь последователен в изучении программирования, то в голове у тебя образуется каша. Прежде чем строить дом, надо сначала научиться строить и проектировать дома, а потом уже проектировать и строить. А когда учатся проектировать одновременно учась строить при постройке дома, то он очень смешным получается...
Добавлено через 2 минуты и 22 секунды
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |