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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.71
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
#1

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

03.08.2008, 21:04. Просмотров 4262. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2008, 21:04     Реализация программы с помощью классов
Посмотрите здесь:

Реализация классов - C++
Помогите, пожалуйста, с 2-мя заданиями! 1) class A { public: A(); ~A(); private: D m_data;

Реализация классов чисел - C++
есть задача по реализации 2 классов действительно и комплексного числа, при дебаги возникают непонятные мне ошибки хелп. # include...

Реализация собственных классов - C++
Разработать прогнрамму, демонстрирующую работу с объектами 2х типов: Triangle(треугольник) и Quadrate(квадрат ).Каждый объект должен иметь...

Реализация классов вектор и строка - C++
Для лабораторной работы нужно было написать свою реализацию классов вектор и строка. Выкладываю что получилось, может, кому пригодится. ...

Реализация списка + Шаблоны классов - C++
Всем добрый день, есть не большая проблема с реализацией списка с помощью шаблонов класса. Далеко не профи я :) Тоже самое смог сделать...

Реализация классов integer, double - C++
Есть задания реализовать класс integer,double,char производные от абстрактного класса Number. Определить между этими классами все...

ООП реализация сложных классов - C++
Вот задание как реализуется сложный класс“база-сектор” (дуга+радиус+радиус) , в которых класс “фигура” должен присутствовать в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
03.08.2008, 21:31     Реализация программы с помощью классов #2
Реализация классов одинакова, что под досом, что под виндой. Классы - это язык, а не система.
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
04.08.2008, 21:51  [ТС]     Реализация программы с помощью классов #3
Я пытался реализовать по-досовски, только компилятор выдаёт кучу ошибок, причём что меня удивило, пишет он следующее:

Multiple declaration of 'HGLRC', а так же
Earlier declaration of 'HGLRC'

Инициализировать объект типа STAR я пытался перед циклом обработки сообщений.

Вот описание класса:
Код
class STAR
{
 public:
  STAR(float X, float Y, float Z)
  {
   x=X; y=Y; z=Z;
   glColor3f(0.0, 0.0, 0.5);
   if (Z<-10) glPointSize(2);
    else glPointSize(0);

    glBegin(GL_POINTS);
     glVertex3f(x, y, z);
    glEnd();
   }

   void GoOut()
    {
     if(z>-1) z=(rand()%10)-25;
     z+=0.05;

     }
   void GoIn()
     {
      z-=0.05;
      }

  private:
  float x, y, z;
  }
Барра Белый Гепард
0 / 0 / 0
Регистрация: 04.08.2008
Сообщений: 8
05.08.2008, 00:04     Реализация программы с помощью классов #4
У тебя компилятор не узнаёт HGLRC как тип. Думай.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
05.08.2008, 01:33     Реализация программы с помощью классов #5
Вообще,странная какая-то реализация. В конструкторе класса
- отрисовка... в таком коде GoIn и GoOut не будут иметь эффекта...
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
06.08.2008, 22:14  [ТС]     Реализация программы с помощью классов #6
У тебя компилятор не узнаёт HGLRC как тип. Думай.
А почему же без класса компилятор узнаёт HGLRC ?
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 22:52     Реализация программы с помощью классов #7
А потому что этот класс уже объявлен. Ошибка из-за этого. Такая проблема еще возникает при кольцевом подключении .h файлов.
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
06.08.2008, 23:46  [ТС]     Реализация программы с помощью классов #8
Я переписал класс STAR, отрисовка графич. примитивов производится теперь в методах GoOut() и GoIn(), но легче от этого не стало. Компилятор по-прежнему не устраивает запись HGLRC hRC. Без класса прога работает без проблем.
Код
class STAR
{
 public:
  STAR(float X, float Y, float Z)
  {
   x=X; y=Y; z=Z;
     }

   void GoOut()
   {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glColor3f(0.0, 0.0, 0.5);
    if (z<-10) glPointSize(0);
    else glPointSize(2);

    glBegin(GL_POINTS);
     glVertex3f(x, y, z);
    glEnd();
     if(z>-1) z=(rand()%10)-25;
     z+=0.05;
     }

   void GoIn()
   {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glColor3f(0.0, 0.0, 0.5);
    if (z<-10) glPointSize(0);
    else glPointSize(2);

    glBegin(GL_POINTS);
     glVertex3f(x, y, z);
    glEnd();
      z-=0.05;
      }

  private:
  float x, y, z;
  }
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 23:49     Реализация программы с помощью классов #9
Тогда вопрос другого рода. Класс объявлен в отдельном заголовочном файле? После объявления класса, после последней фигурной скобки нужно точку с запятой еще...
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
06.08.2008, 23:53  [ТС]     Реализация программы с помощью классов #10
А потому что этот класс уже объявлен. Ошибка из-за этого. Такая проблема еще возникает при кольцевом подключении .h файлов.
Кольцевое подключение .h файла исключено, т.к. в файле StarsClass.h я никаких заголовков не подключаю, а сам файл StarsClass.h подключается самым последним т.е.
Код
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#include <stdlib.h>
#include "D:\Lib\Lib.h"
#include "StarsClass.h"
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
06.08.2008, 23:58     Реализация программы с помощью классов #11
Хм...а если в StarsClass.h никаких заголовков не подключаете, то как он видит
Код
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
например?
intelteh
18 / 18 / 1
Регистрация: 27.07.2008
Сообщений: 10
07.08.2008, 00:15  [ТС]     Реализация программы с помощью классов #12
Отлично! Tеперь программа работает, похоже ошибка была в том, что я не поставил точку с запятой после описания класса. В программе есть кое-какие глюки, но они уже другого плана, я думаю справлюсь своими силами, только уже завтра, а то я спать хочу. Большое спасибо всем откликнувшимся!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2008, 00:25     Реализация программы с помощью классов
Еще ссылки по теме:

Реализация алгоритма Хаффмана с использованием классов - C++
Всем привет. Пишу Алгоритм Хаффмана. Хочу сделать все красиво в классах,но как-то не додумываюсь. Пытался сделать чтение файла методом,но...

Реализация классов-контейнеров stack и list - C++
Помогите пожалуйста реализовать stack и list в виде кодов с файлами stack.h , stack.cpp и main.cpp и также с list. Буду очень благодарен.

Односвязный список (реализация без классов) - C++
Задача проста: создать список из слов, вводимых с клавиатуры, и вывести его на консоль. Всё вводит и выводит. Только откуда-то взялась &quot;Д&quot;...

Калькулятор дробей с помощью классов - C++
Добрый день, мне кажется я тут уже видел программку калькулятор дробей, где нужно создать class fraction для подсчета суммы, разности,...

Реализовать задачу с помощью классов. - C++
Есть задача: создать таблицу № | Фамилия | Имя | Адрес | Телефон 1. По заданной фамилией определить номер телефона. 2. По адресу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
07.08.2008, 00:25     Реализация программы с помощью классов #13
Ну, как и предполагал
Yandex
Объявления
07.08.2008, 00:25     Реализация программы с помощью классов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru