Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Небольшая игрушка на С++ и OpenGL  (Прочитано 24268 раз)
0 Пользователей и 1 Гость смотрят эту тему.
IgnisFatuus
Постоялец

ru
Offline Offline

« : 03-04-2013 12:37 » 

Доброго дня!
Есть пара вопросов по созданию игры на С++ и OpenGL.

Есть задача - написать некую 2d (или 3d) простенькую игрушку типа
арканойда/тетриса/пакмана.

Необходимо использовать только С++ и OpenGL БЕЗ каких-либо
сторонних библиотек типа glut и пр.

Игрушка пишется под Android с использованием NDK (С++) .

Я немного ковырялся в OpenGL но glut везде и всюду.. Хотелось бы
как-то отказаться от него - он ведь не поддерживается больше?
Да и полезно я думаю будет углубиться в структуру и философию
чистого OpenGL.

Так как до этого я просто рисовал геометрию и полноценного клиента не делал
то накидал вот такой план:
/*Для примера возьмем Пакмана*/
0. Разобраться в NDK и привязать к нему OpenGL.
1. Создать, вывести на экран и подвигать по экрану Пакмана.
1.1 Сделать внятную анимацию пакмана.
2. Создать и вывести на экран лаберинт.
3. Создать обработчик стэйтов на манер вот этого - http://habrahabr.ru/post/114933/
4. /*Далее по списку*/

Итак теперь просьбы и вопросы:
1)Правильно ли я подошел к решению проблемы?
2) Есть ли хорошие книги по OpenGL в "чистом" виде?
2.1 Например в книгах есть инициализация окна с помощью glut.
Может мне тогда переписывать данные функции под Android?
(в NDK наверняка есть какой-то оконный манагер).
2.2 Есть ли внятный туториал по перехвату клавиатуры в реальном времени?
3) Как отрисовывать не все окно, а только часть?
например - возьмем окно с кругом -

Код: (C++)

void myInit(void)
{
         glClearColor(1.0, 1.0, 1.0, 0.0);
         glColor3f(0.0f, 0.0f, 0.0f);
         glPointSize(4.0);
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
 
void myDisplay(void)
{
     glClear(GL_COLOR_BUFFER_BIT);
     glBegin( GL_LINE_LOOP );
           for( int i = 0; i < 50; i++ )
           {
            float a = 300+(float)i / 50.0f * 3.1415f * 2.0f;
             glVertex2f( 300+ cos( a ) * 10.0f, 300+ sin( a ) * 10.0f );
           }
         glEnd();
         glFlush();
       
}
void myChandePlace()
{
     
     
     
}
 
int main(int argc, char** argv)
{
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
         glutInitWindowSize(640, 480);
         glutInitWindowPosition(100, 150);
         glutCreateWindow("my first attempt");
         glutDisplayFunc(myDisplay);
         myInit();
         glutMainLoop();
         return 0;
}

выводится круг на белом фоне. Я хочу им подвигать с клавиатуры. Как это сделать?
Я хотел стирать этот круг и перерисовывать при каждом нажатии на стрелочки. Если окно пустое - в теории это
можно сделать. А есть нет?
Не перерисовывать же каждый раз всю сцену заново...

В коде есть функция "void myChandePlace() " - какой примерно должен быть код чтобы я мог реализовать управление с клавиатуры?

Заранее благодарю.

Добавлено через 4 минуты и 16 секунд:
Быть может можно использовать это -
glNewList(номер листа);
// здесь сама сцена (glBegin'ы, glEnd'ы и т. д.)
glEndList;
« Последнее редактирование: 03-04-2013 12:41 от IgnisFatuus » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 03-04-2013 12:50 » 

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

выводится круг на белом фоне. Я хочу им подвигать с клавиатуры. Как это сделать?
Я хотел стирать этот круг и перерисовывать при каждом нажатии на стрелочки. Если окно пустое - в теории это
можно сделать. А есть нет?
Не перерисовывать же каждый раз всю сцену заново...
А если нет, то запоминать, что было под выводимым спрайтом, и не просто затирать кружок, а затирать тем, что было под ним, до того, как его нарисовали. Т.е. последовательность такая:
1. перед выводом спрайта запоминаем, что было там, где его собираемся рисовать
2. рисуем спрайт.
3. при перемещении спрайта восстанавливаем где он был то, что было до того, как его нарисовали и переходим к шагу 1.
« Последнее редактирование: 03-04-2013 13:25 от darkelf » Записан
IgnisFatuus
Постоялец

ru
Offline Offline

« Ответ #2 : 03-04-2013 16:13 » 

Я далеко не гуру в графическом программировании. Надо пиксели запоминать? Или как ? Каким образом лучше запомнить старые данные?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 03-04-2013 16:21 » 

IgnisFatuus, прошу прощения, но боюсь я Вам не смогу подсказать - сам графикой не занимался.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-04-2013 16:39 » 

Насколько я понимаю, OpenGL не оперирует растром, а описывает сцены полигонами и текстурами. Т.е. надо средствами OpenGL описать очередной кадр и отрендерить его на экран.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
daemolisher
Новенький

ru
Offline Offline

« Ответ #5 : 04-04-2013 01:31 » 

Цитата
Не перерисовывать же каждый раз всю сцену заново...

Но ты же именно это и делаешь.

В приведенном коде есть MainLoop - это основной цикл, который бешено крутится и перерисовывает сцену каждый раз (точнее "перерисовывает" из-за glClear).

В целом, так и делают.
Только еще нужно измерять время на каждой итерации.
И паузы вставлять (необязательно).

Чтобы подвинуть круг-пакмана, смотрим сколько прошло времени и подвигаем его на соответствующее расстояние, а направление зависит от нажатых клавиш.

Цитата
Быть может можно использовать это - glNewList

Можно.
А есть ещё более эффективная вещь - VBO
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #6 : 04-04-2013 07:02 » new

IgnisFatuus,  возможно Вам поможет это обсуждение - https://www.allegro.cc/forums/thread/597340
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines