Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Реализация программы с помощью классов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Помогите Пожалуйста !!! http://www.cyberforum.ru/cpp-beginners/thread10683.html
Помогите пожалуйста разобраться с прогой, голова уже разрывается на 100 маленьких кусочков. Как можно объяснить эти строки: char* szString="Randy"; cout << "Массив" << szString << endl; for...
C++ Как использовать pascal модуль в TubroC++? Есть модуль, написанный на TurboPascal. Как использовать в приложении на си? Есть возможность сделать из него какую-нибудь библиоткеку, понятную для С? Среда - чистый DOS, не эмуляция. http://www.cyberforum.ru/cpp-beginners/thread10673.html
C++ Русские шрифты в консоли
всем привет. Я новичек, и у меня такой вопрос. Как написать сообщение с русскими буквами, чтоб нормально показывала? :rtfm:Например: cout<<"hello world"; выводить сообщение нормальна? с...
C++ Строки
Приветствую Вас, братья и сёстры. У меня возникла проблемка с простой задачкой из книжки госпожи Павловской. Вот она: написать программу, которая считывает текст из файла и выводит на экран только...
C++ Пожалуйста подскажите новичку http://www.cyberforum.ru/cpp-beginners/thread10652.html
Добрый день всем! Недавно начал самостоятельно изучать С++ по книге Р. Лафоре « Объектноориентрованое прогаммирование в С++». Книга очень интересная, написано очень доходчиво, но всё равно появляются...
C++ Перемещение в системе координат День добрый! я в программировании на языке С++, новечек. изучаю самостоятельно обложившись книгами и интернетом. в решении математических задач и в составлении базы данных, а затем в ее сортировке... подробнее

Показать сообщение отдельно
intelteh
19 / 19 / 1
Регистрация: 27.07.2008
Сообщений: 10

Реализация программы с помощью классов - C++

03.08.2008, 21:04. Просмотров 4281. Ответов 12
Метки (Все метки)

Здравствуйте, коллеги-программеры!
Обращаюсь к Вам с таким вопросом. У меня есть написанная мной неплохая демка, с использованием OpenGL, которая случайным образом генерирует звёзды (точки в 3D-пространстве) и движет их на зрителя. Демка на подобие того скринсейвера, который в Виндовс называется «сквозь вселенную». Программа работает, всё нормально. Но я хотел бы реализовать эту прогу с помощью классов, а заодно сделать так, чтобы при движении звёзды увеличивались в размере, ну т.е. сделать полную имитацию приближения звёзд. С классами до этого я работал только с ДОСовскими программами, а как реализовать классы под Виндовс ума не приложу.
Привожу код программы:

Код
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#include <stdlib.h>

//////////////////////////////////////

static HGLRC  hRC;              // Постоянный контекст рендеринга
static HDC  hDC;              // Приватный контекст устройства GDI
bool keys[256];
bool space;

HWND hWnd;

int i, Star=150;
float dZ=0.05;
float Xintarray[150], Yintarray[150], Zintarray[150];

 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
double RandFloat(signed int a)
{
 int b1=rand()%a;      //генерим 1-е целое
 int b2=1+rand()%a;       //генерим 2-е целое  

 float b3=(double)b1/b2;      //получаем дробную часть
 if(a>0) b3=b3+b1;           //складываем целую и дробные части
  else if(a<0) b3=(b3+b1)*(-1);

 return b3;
 }



GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
{
 if(Height==0) Height=1;
 glViewport(0, 0, Width, Height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective (45.0f,(GLfloat)Width/(GLfloat)Height, 0.1f, 100.0f);
 glMatrixMode(GL_MODELVIEW);
 }

void InitGL(GLsizei Width, GLsizei Height)
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glClearDepth(1.0);
 glDepthFunc(GL_LESS);
 glEnable(GL_DEPTH_TEST);
 glShadeModel(GL_SMOOTH);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45.0f, (GLfloat)Width/(GLfloat)Height, 0.1f, 100.0f);
 glMatrixMode(GL_MODELVIEW);
 }

 GLvoid DrawScene(GLvoid)
 {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glColor3f(0.5f, 0.4f, 1.0f);
  glPointSize(2);

   for (int i=0; i<150; i++)
   {
    glBegin(GL_POINTS);
     glVertex3f(Xintarray[i], Yintarray[i], Zintarray[i]+=dZ);
    glEnd();

    if (Zintarray[i]>-1)
          {
           Xintarray[i]=(RandFloat(16)-8);
           Yintarray[i]=(RandFloat(16)-8);
           Zintarray[i]=(rand()%10)-25;
           }
    }
}

/////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                LPSTR lpCmdLine,int nCmdShow)
{
        MSG             msg;  // Структура сообщения Windows
        WNDCLASS        wc;   // Структура класса Windows для установки типа окна

        wc.style                = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wc.lpfnWndProc          = (WNDPROC) WndProc;
        wc.cbClsExtra           = 0;
        wc.cbWndExtra           = 0;
        wc.hInstance            = hInstance;
        wc.hIcon                = NULL;
        wc.hCursor              = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground        = NULL;
        wc.lpszMenuName         = "Menu";
        wc.lpszClassName        = "OpenGL WinClass";

if(!RegisterClass(&wc))
        {
        MessageBox(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
        return FALSE;
        }

 hWnd = CreateWindow(
        "OpenGL WinClass",
        "Jeff Molofee's GL Code Tutorial ... NeHe '99", // Заголовок вверху окна

        WS_POPUP,
        0, 0,                   // Позиция окна на экране
        640, 480,               // Ширина и высота окна

        NULL,
        NULL,
        hInstance,
        NULL);

if(!hWnd)
        {
        MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
                return FALSE;
        }

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);

// заполняем массив координат

 for( i=0; i<Star; i++)
  {
    Xintarray[i]=(RandFloat(16)-8);
    Yintarray[i]=(RandFloat(16)-8);
    Zintarray[i]=(rand()%10)-25;

    if((Yintarray[i]==0)&& (Xintarray[i]==0))
      {
       Yintarray[i]=(RandFloat(16)-8);
       Xintarray[i]=(RandFloat(16)-8);
       }
   }


while (1)
        {
           // Обработка всех сообщений
            while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
            {
               if (GetMessage(&msg, NULL, 0, 0))
                {
                 TranslateMessage(&msg);
                 DispatchMessage(&msg);
                 }
              else   return TRUE;
              }

   DrawScene();

   SwapBuffers(hDC);                              // Переключить буфер экрана

   if(!keys[VK_SPACE]) space=false;

   if(keys[VK_SPACE]&& space==false)
   {
    space=true;

    for(i=0; i<Star; i++)
    {
     Xintarray[i]=(RandFloat(16)-8);
     Yintarray[i]=(RandFloat(16)-8);
     Zintarray[i]=(rand()%10)-25;

      if((Yintarray[i]==0)&& (Xintarray[i]==0))
        {
         Yintarray[i]=(RandFloat(16)-8);
         Xintarray[i]=(RandFloat(16)-8);
         }
     }
  }

   if (keys[VK_UP])
    {
      for(int k=0; k<150; k++) Zintarray[k]+=dZ;

      }
    if (keys[VK_DOWN])
     {
         for(int j=0; j<150; j++)  Zintarray[j]-=dZ;
      }

    if (keys[VK_ESCAPE])  SendMessage(hWnd,WM_CLOSE,0,0);  // Если ESC - выйти

   }
  }

 ////////////////////////////////////////////////////////
 LRESULT CALLBACK WndProc(      HWND  hWnd, UINT    message,  WPARAM  wParam,
                                LPARAM  lParam
                                )
{
        RECT    Screen;                 // используется позднее для размеров окна
        GLuint  PixelFormat;
        static  PIXELFORMATDESCRIPTOR pfd=
        {
        sizeof(PIXELFORMATDESCRIPTOR),  // Размер этой структуры
        1,                              // Номер версии (?)
        PFD_DRAW_TO_WINDOW |            // Формат для Окна
        PFD_SUPPORT_OPENGL |            // Формат для OpenGL
        PFD_DOUBLEBUFFER,               // Формат для двойного буфера
        PFD_TYPE_RGBA,                  // Требуется RGBA формат
        16,                             // Выбор 16 бит глубины цвета
        0, 0, 0, 0, 0, 0,                       // Игнорирование цветовых битов (?)
        0,                              // нет буфера прозрачности
        0,                              // Сдвиговый бит игнорируется (?)
        0,                              // Нет буфера аккумуляции
        0, 0, 0, 0,                             // Биты аккумуляции игнорируются (?)
        16,                             // 16 битный Z-буфер (буфер глубины)
        0,                              // Нет буфера траффарета
        0,                              // Нет вспомогательных буферов (?)
        PFD_MAIN_PLANE,                 // Главный слой рисования
        0,                              // Резерв (?)
        0, 0, 0                         // Маски слоя игнорируются (?)
     };

switch (message)        // Тип сообщения
        {
  case WM_CREATE:

                hDC = GetDC(hWnd);      // Получить контекст устройства для окна
                PixelFormat = ChoosePixelFormat(hDC, &pfd);
                        // Найти ближайшее совпадение для нашего формата пикселов
             if (!PixelFormat)
                {
                        MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
                        PostQuitMessage(0);
                        // Это сообщение говорит, что программа должна завершится
                break;  // Предтовращение повтора кода
                }

             if(!SetPixelFormat(hDC,PixelFormat,&pfd))
                {
                        MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
                        PostQuitMessage(0);
                        break;
                }

             hRC = wglCreateContext(hDC);

             if(!hRC)
                {
                MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
                PostQuitMessage(0);
                break;
                }
             if(!wglMakeCurrent(hDC, hRC))
                {
                MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
                PostQuitMessage(0);
                break;
                }

            GetClientRect(hWnd, &Screen);
                InitGL(Screen.right, Screen.bottom);
                break;

  case WM_DESTROY:
  case WM_CLOSE:
                ChangeDisplaySettings(NULL, 0);
                wglMakeCurrent(hDC,NULL);
                wglDeleteContext(hRC);
                ReleaseDC(hWnd,hDC);

                PostQuitMessage(0);
                break;

  case WM_KEYDOWN:
                keys[wParam] = TRUE;
                break;

  case WM_KEYUP:
                keys[wParam] = FALSE;
                break;

  case WM_SIZE:
                ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
                break;

        default:
        return (DefWindowProc(hWnd, message, wParam, lParam));
        }
        return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru