Пятница, 29 Марта 2024, 10:33

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Помогите с отображением объекта (OpenGL для чайника)
Помогите с отображением объекта
radogost123Дата: Суббота, 04 Февраля 2012, 01:04 | Сообщение # 1
уже был
Сейчас нет на сайте
Помогите разобраться. Шарик никак не хочет отображаться.
Может это фон закрашивает его, но куб отображается а со слоями нигде ничего не трогал. Иногда кажется, что при запуске программы он мигает, а потом исчезает.
Code

#include <glut.h>
#include <GL/GL.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <stdlib.h>

// ширина и высота окна    
GLint width=800, height=600;
GLint x1,x2,y2; // координаты шарика и отбивалки

//рисуем шарик

    void DrawBall()
{

       
       
         
    glPushMatrix ();
       //glTranslatef (1, 1, 1);
       glColor3f(1,0,0);
    glutSolidSphere (1.0, 15, 15);
        glPopMatrix ();

             
         
    }

// рисуем отбивалку

    void DrawCubik ()
{    
int Cwidth=50, Cheight=20;
       int left, bottom, top, right;    
    // положение
    left = x1;
    right=x1+Cwidth;
    top= height/3-Cheight;
    bottom= top-Cheight;

        
    // рисуем прямоугольник
       
      glBegin (GL_QUADS);    
    glColor3f(1,0,0);
       

    // вершины
          
      glVertex2f(left,bottom);
         glVertex2f(left,top);
         glVertex2f(right,top);
         glVertex2f(right,bottom);
       
glEnd();    

}

    void Reshape(GLint w, GLint h)
{
       width = w;
       height = h;
       glViewport(0, 0, w, h);
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
       glOrtho(0, w, 0, h, -1.0, 1.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
}

    void movecubik ()
    {}
    void Paint ()
{
        

       
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );//  чистка буферов
       
    glClearColor(0.4f,0.8f,1,0); // заливка
       
    DrawBall ();
           DrawCubik();
    glFinish();// чё то там о невозможности завершить програму без выполнения всего что выше
       
       
    glutSwapBuffers(); // для движение переставляем кадры
    }
int main (int argv, char **argc)
{
    glutInit(&argv,argc); //инициализация окна
    glutInitDisplayMode (GLUT_RGBA | GLUT_SINGLE |GLUT_DEPTH ); //  двойной буффер параметр глубина
    glutInitWindowSize ( width,  height); // размеры окна
       glutInitWindowPosition (0,0); // начальное положение окна
       glutCreateWindow ("byaka"); // название окна
    // функции    
    glutDisplayFunc (Paint); // функция рисования обьектов
//    glutKeyboardFunc (Keyboard); // работа клавиатуры
    glutIdleFunc (Paint); // функция постоянного обращения
    glutReshapeFunc(Reshape);
       
       
    glEnable(GL_STENCIL_TEST);
    glEnable(GL_DEPTH_TEST);    
       glEnable(GL_COLOR_MATERIAL);    

    glutMainLoop(); //зацикливание
return 0;
}


Сообщение отредактировал radogost123 - Суббота, 04 Февраля 2012, 01:06
creekДата: Суббота, 04 Февраля 2012, 13:26 | Сообщение # 2
был не раз
Сейчас нет на сайте
Во 1: Не вижу где задаются: "x1,x2,y2"
Во 2: Попробуй рисовать просто кубик, потом просто шар. Дабы исключить возможность перекрывания.
ApatiДата: Суббота, 04 Февраля 2012, 14:14 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
По-моему шар рисуется слишком маленьким.
Попробуй заменить glutSolidSphere (1.0, 15, 15); на glutSolidSphere (100.0, 15, 15);
и glOrtho(0, w, 0, h, -1.0, 1.0); на glOrtho(0, w, 0, h, -100.0, 100.0);
radogost123Дата: Вторник, 07 Февраля 2012, 21:42 | Сообщение # 4
уже был
Сейчас нет на сайте
Спасибо. И вправду шарик где то не там рисовался. glOrtho(0, w, 0, h, -100.0, 100.0);
Правда мне казалось что изначально он в начале координат рисует его.

Добавлено (07.02.2012, 21:42)
---------------------------------------------
Вобщем получился такой арканойд. Но возникла проблема. Иногда мячик попадат в промежуток между кубиками. Их можно былобы нарисовать вплотную но тогда цвет сливается. Вообщем подскажите как лучше это исправить.
П.С. могу выложить с нормальными коментами но декодор при этом часть кода исправляет.

Code
#include <glut.h>
#include <GL/GL.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include <iostream.h>
#include <math.h>

   // glut32.lib opengl32.lib glu32.lib

int width=800, height=600; // øèðèíà è âûñîòà îêíà  
bool BallG,BallR,BallL,CubikActiv; // äâèæåíèå øàðà
// int  // íà÷àëüíûå êîîðäèíàòû øàðà
int step=15; //ñêîðîñòü îòáèâàëêè øàðà
int Cwidth=80, Cheight=20, Cleft=370,Ctop=120;// ðàçìåðû îòáèâàëêè
float left=50, bottom=500,right,top,i,j; // êóáèêè
  float a1,a2, stepBall, x2=380, y2=380;
   bool mas[6][15]={{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true, true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,t rue,true,true,true,true,true}, {true,true,true,true,true,true,true,true,true,true,true,true,true,true,true},{true,true,true,true,true,true,true,true,true,true,true,true,tr ue,true,true}};
    
   void PaintKubiki ()  // ðèñóåì cubiki
  {  
    
  for (int i=1;i<6;i++) // 3 ñòîëáöà êóáèêîâ
        for (int j=1;j<14;j++) // 15 êóáèêîâ â ëèíèè
     {  
              left=50*j;
      right=left+49.5;
     bottom=600-50*i;  
     top=bottom+49.5;
                  
    
  // ðèñóåì ïðÿìîóãîëüíèê
  glPushMatrix ();
glBegin (GL_QUADS);  

     
   if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j])&&(!BallG))// åñëè øàð íàòûêàåòñÿ íà êóáèê ëåòèò âíèç è êóáèê èñ÷åçàåò
   {
    BallG=true;
  mas[i][j]=false;  
     
   }
   if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j])&&(BallG)) // øàð íàëåòàåò ñâåðõó
   { BallG=false;
   mas[i][j]=false;
  }
  if ((y2<=top)&&(y2>=bottom)&&(x2>=left)&&(x2<=right)&&(mas[i][j]=false))// åñëè øàð íàòûêàåòñÿ íà èñ÷åçíóâøèé êóáèê ëåòèò äàëüøå  
     { BallG=false;

  }

   if (mas[i][j])  
   {
glColor3f(0.3f,0.4f,0.1f); // èçíà÷àëüíûé öâåò
   }
   else  
  {
   glColor3f(0,0,0); // çàêðàøèâàåì öâåòîì ôîíà
   
  }
   
  // âåðøèíû
      
    glVertex2f(left,bottom);
       glVertex2f(left,top);
       glVertex2f(right,top);
       glVertex2f(right,bottom);
   
glEnd();  
glPopMatrix ();  
    }
   }
void Keyboard (int key, int x, int y) // ôóíêöèÿ äëÿ ñïåöèàëüíûõ êíîïîê
{
  switch(key)                  
  {case GLUT_KEY_LEFT:
  if (Cleft>0)  
  Cleft-=step;                //íàëåâî
  break;
  case GLUT_KEY_RIGHT:
   if (Cleft<720)
   Cleft+=step;              // íàïðàâî
  break;
   
  }
glutPostRedisplay();            // ïåðåðèñîâêà èçîáðàæåíèÿ (êîñâåííûé âûçîâ display();)
}
   
  void DrawCubik ()  // ðèñóåì îòáèâàëêó
  {  
     int Cbottom,  Cright;  
  // ïîëîæåíèå
        Cright=Cleft+Cwidth;
   Cbottom= Ctop-Cheight;

    
  // ðèñóåì ïðÿìîóãîëüíèê
  glPushMatrix ();
    glBegin (GL_QUADS);  
  glColor3f(1,1,0);
   

  // âåðøèíû
      
    glVertex2f(Cleft,Cbottom);
       glVertex2f(Cleft,Ctop);
       glVertex2f(Cright,Ctop);
       glVertex2f(Cright,Cbottom);
   
glEnd();  
glPopMatrix ();
}
   
void BallmoveDown() // äâèæåíèå øàðèêà ââåðõ/âíèç
{
   if (BallG)   
    y2-=3;
   else  
   y2+=3;
  if (y2>600)  
BallG=true;
  if (y2<40)
     
   BallG=false;

   
}
void BallmoveRightLeft() // îòáèâàíèå øàðèêà
{  

   
   if (x2>760) // ïðàâûé êðàé ýêðàíà
   {  
    BallL=true;
   BallR=false;
   stepBall=1;
   }
   if (x2<40) // ëåâûé êðàé ýêðàíà
   {   
  BallR=true;
  BallL=false;
   }   
    
   a1=x2-Cleft;
   a2=a1/40;
    
   if ((a2<1)&&(a2>0)&&(y2<=Ctop))
   { stepBall=1-a2;
       BallL=true;
    BallG=false;
       BallR=false;
   }
    

   if ((a2>=1)&&(a2<2)&&(y2<=Ctop))
   {   stepBall=1-a2;
       BallL=false;
    BallG=false;
    BallR=true;

   }
    
   if (BallR)
    x2+=4*fabs(stepBall); // øàðèê ëåòèò âïðàâî
   if (BallL)
    x2-=4*stepBall; // øàðèê ëåòèò âëåâî
   
  }
   /*
    if  ((x2-Cleft>0)&&(x2-Cleft<30)&&(y2<=Ctop)) // åñëè ïîïàäàåò íà ëåâóþ ÷àñòü áèòû ëåòèò âëåâî
    
   {
    BallL=true;
    BallG=false;
    BallR=false;
   }
    if ((x2-Cleft<80)&&(x2-Cleft>50)&&(y2<=Ctop)) // åñëè ïîïàäàåò íà ïðàâóþ ÷àñòü áèòû ëåòèò âïðàâî
   {
    
    BallR=true;
    BallG=false;
    BallL=false;
   }
  if ((x2-Cleft>=30)&&(x2-Cleft<=50)&&(y2<=Ctop)) // åñëè ïîöåíòðó ëåòèò ââåðõ
  {
  BallR=false;
  BallL=false;
  BallG=false;
  } */

void DrawBall() // ðèñóåì øàðèê
{

    glPushMatrix ();
    
   glTranslatef (x2, y2, 0);
     glColor3f(1,1,1);
  glutSolidSphere (10.0, 100, 100);
      glPopMatrix ();
        
      
  }

  void Reshape(GLint w, GLint h)
{
     width = w;
     height = h;
     glViewport(0, 0, w, h);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(0, w, 0, h, -100, 100);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
}
  void Paint ()
{
    

   
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );// ÷èñòêà áóôåðîâ
   
  glClearColor(0,0,0,0); // çàëèâêà ôîíà
   // âûçûâàåì ô-èè ðèñîâàíèÿ
  DrawCubik();
  DrawBall ();
  BallmoveDown();
   BallmoveRightLeft();
     PaintKubiki ();
   glFinish();// ÷¸ òî òàì î íåâîçìîæíîñòè çàâåðøèòü ïðîãðàìó áåç âûïîëíåíèÿ âñåãî ÷òî âûøå
     glutSwapBuffers(); // äëÿ äâèæåíèå ïåðåñòàâëÿåì êàäðû
  }
int main (int argv, char **argc)
{
  glutInit(&argv,argc); //èíèöèàëèçàöèÿ îêíà
  glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE |GLUT_DEPTH ); //  äâîéíîé áóôôåð ïàðàìåòð ãëóáèíà
  glutInitWindowSize ( width,  height); // ðàçìåðû îêíà
     glutInitWindowPosition (0,0); // íà÷àëüíîå ïîëîæåíèå îêíà
     glutCreateWindow ("byaaka"); // íàçâàíèå îêíà
  // ôóíêöèè  
  glutDisplayFunc (Paint); // ôóíêöèÿ ðèñîâàíèÿ îáüåêòîâ
  glutSpecialFunc (Keyboard); // ðàáîòà êëàâèàòóðû
  glutReshapeFunc(Reshape);  
  glutIdleFunc (Paint); // ôóíêöèÿ ïîñòîÿííîãî îáðàùåíèÿ
   
   
   
  glEnable(GL_STENCIL_TEST);
  glEnable(GL_DEPTH_TEST); // àêòèâèðóåì ïàðàìåòîð ãëóáèíû
     glEnable(GL_COLOR_MATERIAL); // àêòèâèðóåì âîçìîæíîñòü çàêðàøèâàòü îáüåêòû  

  glutMainLoop(); //çàöèêëèâàíèå
return 0;
}


Сообщение отредактировал radogost123 - Понедельник, 06 Февраля 2012, 03:22
Форум игроделов » Программирование » C/C++ » Помогите с отображением объекта (OpenGL для чайника)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг