10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
1

opengl SDL

21.07.2010, 14:11. Показов 3091. Ответов 22
Метки нет (Все метки)

Подскажите как сделать чтоб треугольник двигался по нажаатию клавиши (стрелка вверх) в том напрявлении в котором направлена его вершина?
вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#if defined(__APPLE__) && defined(__MACH__)
#include <OpenGL/gl.h>  // Header File For The OpenGL32 Library
#include <OpenGL/glu.h> // Header File For The GLu32 Library
#else
#include <GL/gl.h>      // Header File For The OpenGL32 Library
#include <GL/glu.h>     // Header File For The GLu32 Library
#endif
#include "SDL.h"
 
/* rotation angle for the triangle. */
float rtri = 0.0f;
 
/* rotation angle for the quadrilateral. */
float rquad = 0.0f;
 
/* A general OpenGL initialization function.  Sets all of the initial parameters. */
void InitGL(int Width, int Height)              // We call this right after our OpenGL window is created.
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         // This Will Clear The Background Color To Black
  glClearDepth(1.0);                            // Enables Clearing Of The Depth Buffer
  glDepthFunc(GL_LESS);                         // The Type Of Depth Test To Do
  glEnable(GL_DEPTH_TEST);                      // Enables Depth Testing
  glShadeModel(GL_SMOOTH);                      // Enables Smooth Color Shading
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();                             // Reset The Projection Matrix
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);     // Calculate The Aspect Ratio Of The Window
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* The main drawing function. */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);           // Clear The Screen And The Depth Buffer
  glLoadIdentity();                             // Reset The View
 
  glTranslatef(-1.5f,0.0f,-6.0f);               // Move Left 1.5 Units And Into The Screen 6.0
        
  glRotatef(rtri,0.0f,1.0f,0.0f);               // Rotate The Triangle On The Y axis 
  // draw a triangle (in smooth coloring mode)
  glBegin(GL_POLYGON);                          // start drawing a polygon
  glColor3f(1.0f,0.0f,0.0f);                    // Set The Color To Red
  glVertex3f( 0.0f, 1.0f, 0.0f);                // Top
  glColor3f(0.0f,1.0f,0.0f);                    // Set The Color To Green
  glVertex3f( 1.0f,-1.0f, 0.0f);                // Bottom Right
  glColor3f(0.0f,0.0f,1.0f);                    // Set The Color To Blue
  glVertex3f(-1.0f,-1.0f, 0.0f);                // Bottom Left  
  glEnd();                                      // we're done with the polygon (smooth color interpolation)
 
                        
 
  rtri+=15.0f;                                  // Increase The Rotation Variable For The Triangle
  r                                     // Decrease The Rotation Variable For The Quad 
 
  // swap buffers to display, since we're double buffered.
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Initialize SDL for video output */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* Create a 640x480 OpenGL screen */
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Set the title bar in environments that support it */
  SDL_WM_SetCaption("FrosT", NULL);
 
  /* Loop, drawing and checking events */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* This could go in a separate function */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
          if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          }
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2010, 14:11
Ответы с готовыми решениями:

OpenGL - инициализация SDL
Возникла проблема при подключении SDL я делал как описано в уроках пошагово но вот возникает...

FTGL + SDL + OpenGL
Прелюдия. Пишу в Code::Blocks, компилятор MinGW. Раньше использовал GLUT, но решил попробовать...

SDL openGL Вращение фигуры
Народ помогите. Нужно сделать так чтоб фигура вращалась при нажатии клавиш (стрелок) Вот код ...

Несколько вопросов (2D игра с SDL и OpenGL)...
Здравствуйте. Делаю2D игру появилась проблема. Да и советы не помешаю (т.к. это моё первое...

22
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 06:39 2
Во-первый нужно хранить вектор, который соответствует направлению, в котором смотрит треуголник:
C++
1
float fwd[] = {0.0f, 1.0f, 0.0f};
Во-втроых нужно хранить позицию треуголника:
C++
1
float pos[] = {0.0f, 0.0f, 0.0f};
По нажатию 'вперед' нужно прибавлять к позиции вектор, сонаправленный с fwd:
C++
1
2
3
4
5
float step = 0.1f;
for (int i = 0; i < 3; i++) 
{
    pos[i]+= fwd[i] * step;
}
Для 'назад' заменить pos[i]+= fwd[i] * step на pos[i]-= fwd[i] * step

По нажатию 'влево' нужно поворачивать fwd:
C++
1
2
3
4
5
const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
float phi = 3.0f; //шаг поворота
rtri += phi;
fwd[0] = cos(rtri * radindeg);
fwd[1] = sin(rtri * radindeg);
Для 'вправо' rtri += phi заменить на rtri -= phi

В процедуре рендера заменить
C++
1
 glRotatef(rtri,0.0f,1.0f,0.0f);               // Rotate The Triangle On The Y axis
на
C++
1
2
glRotatef(rtri,0.0f,0.0f,1.0f);
glTranslatef(pos[0], pos[1], pos[2]);
Значения step и phi еще придется подобрать более удачные
1
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 11:56  [ТС] 3
ага....спасибо попробую разобратсо

Добавлено через 1 час 39 минут
Вобщем я сделал всё так как ты написал но теперь у меня неотображается треугольник.
Глянь плиз я всё правильно сделал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
float pos[] = {0.0f, 0.0f, 0.0f};
  glRotatef(rtri,0.0f,0.0f,1.0f);
  glTranslatef(pos[0], pos[1], pos[2]);
  // Рисование триугольника
  glBegin(GL_POLYGON);              // начало рисования полигона
  glVertex3f( 0.0f, 1.0f, 0.0f);        // верх
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } float pos[] = {0.0f, 0.0f, 0.0f};
           float fwd[] = {0.0f, 1.0f, 0.0f}; 
           float step = 0.1f;
           for (int i = 0; i < 3; i++)
           if (event.key.keysym.sym==SDLK_UP){
    pos[i]+= fwd[i] * step;
        } 
           for (int i = 0; i < 3; i++)
               if (event.key.keysym.sym==SDLK_DOWN){
                   pos[i]-= fwd[i] * step;
               }const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
                float phi = 3.0f; //шаг поворота
                if (event.key.keysym.sym==SDLK_LEFT){
                          rtri += phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
                if (event.key.keysym.sym==SDLK_LEFT){
                     rtri -= phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
 
 
 
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:09 4
1 - pos и fwd должны быть глобальными
2 - не надо дважды обрабатывать SDLK_LEFT

А треугольник не отображается, потому что цвет для него не установлен (glColor3f не стоило убирать)
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:18  [ТС] 5
Цитата Сообщение от Hypafrag Посмотреть сообщение
1 - pos и fwd должны быть глобальными
2 - не надо дважды обрабатывать SDLK_LEFT

А треугольник не отображается, потому что цвет для него не установлен (glColor3f не стоило убирать)
Сделал всё как вы сказали.
Но всёравно не показывает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
float pos[] = {0.0f, 0.0f, 0.0f};
float fwd[] = {0.0f, 1.0f, 0.0f}; 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
 
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
 
  glRotatef(rtri,0.0f,0.0f,1.0f);
  glTranslatef(pos[0], pos[1], pos[2]);
  // Рисование триугольника
  glBegin(GL_POLYGON);      // начало рисования полигона
   glColor3f(1.0f,0.0f,0.0f);
  glVertex3f( 0.0f, 1.0f, 0.0f);// верх
  glColor3f(0.0f,1.0f,0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glColor3f(0.0f,0.0f,1.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          }
           
           float step = 0.1f;
           for (int i = 0; i < 3; i++)
           if (event.key.keysym.sym==SDLK_UP){
    pos[i]+= fwd[i] * step;
        } 
           for (int i = 0; i < 3; i++)
               if (event.key.keysym.sym==SDLK_DOWN){
                   pos[i]-= fwd[i] * step;
               }const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
                float phi = 3.0f; //шаг поворота
                if (event.key.keysym.sym==SDLK_LEFT){
                          rtri += phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
                if (event.key.keysym.sym==SDLK_RIGHT){
                     rtri -= phi;
                          fwd[0] = cos(rtri * radindeg);
                          fwd[1] = sin(rtri * radindeg);
                }
 
 
 
        }
      }
    }
  }
  SDL_Quit();
  return 1;
}
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:32 6
Обработка клавиш совсем неправильно сделана, должна выглядеть примерно вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    /* функции обработки клавиш */
    { SDL_Event event;
      const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
      float step = 0.1f;
      float phi = 3.0f; //шаг поворота
 
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } if (event.key.keysym.sym==SDLK_UP) {
               for (int i = 0; i < 3; i++)
                    pos[i]+= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_DOWN){
               for (int i = 0; i < 3; i++)
                    pos[i]-= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_LEFT){
               rtri += phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          } if (event.key.keysym.sym==SDLK_RIGHT){
               rtri -= phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          }
        }
      }
    }
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:39  [ТС] 7
спасибо.
А вот что с самим треугольником делать?
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:41 8
А с таким управлением он не появляется?
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:50  [ТС] 9
Такс
я изменил вот так glTranslatef(-1.5f,0.0f,-6.0f); в место того чтоб было pos[0]... в нутри
треугольник появился но двигается только клавишами право влево причём по дуге и чтоб его поворачивать нужно много раз клавишу нажимать...можно както сделать чтоб он с зажатой крутился?.
а должен поворачиватся на месте.
вперёд назад чегото неработают
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:55 10
А если поменять порядок translate и rotate, какой эффект?
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 12:57  [ТС] 11
о....поворачивается нормально.
но вот кнопки вверх вниз недают результата
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 12:59 12
Дык, верни translatef(pos[0], pos[1], pos[2]);
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:02  [ТС] 13
Вернул....но треугольник теперь пропал
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:06 14
C++
1
gluLookAt(0.0f, 0.0f, -1.0, 0.0f, 0.0f, 0.0f. 0.0f, 1.0f, 0.0f);
после gluPerspective возможно поможет
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:14  [ТС] 15
Вставил выдоло кучу ошибок


: error C2059: синтаксическая ошибка: константа
1>d:\documents and settings\userxp\мои документы\visual studio 2008\projects\sdl4\sdl4\sdl4.cpp(30) : error C2228: выражение слева от ".glMatrixMode" должно представлять класс, структуру или объединение

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <windows.h>
#include <glut.h>
#include "glut.h"   
#include "SDL.h"
#include "math.h"
 
/* вращение англе триугольника */
float rtri = 0.0f;
float pos[] = {0.0f, 0.0f, 0.0f};
float fwd[] = {0.0f, 1.0f, 0.0f}; 
 
 
 
/* главные инициальзирующие функции */
void InitGL(int Width, int Height)          // создание окна
{
  glViewport(0, 0, Width, Height);
 
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);     // очистка фона окна и изменение цвета на чёрный
  glClearDepth(1.0);                // отчистка Depht буфера
  glDepthFunc(GL_LESS);             // задаётся функция depht
  glEnable(GL_DEPTH_TEST);          // Enables Depth Testing
  glShadeModel(GL_SMOOTH);          // задаётся шайд мод
 
  glMatrixMode(GL_PROJECTION);  //Режим матрицы проекции
  glLoadIdentity();             // сброс открыть матрицу проекции
 
  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // вычисление коефициентов сжатия окна
  gluLookAt(0.0f, 0.0f, -1.0, 0.0f, 0.0f, 0.0f. 0.0f, 1.0f, 0.0f);
  glMatrixMode(GL_MODELVIEW);
}
 
/* РИсование */
void DrawGLScene()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       // отчистка буфера
  glLoadIdentity();             // сброс открыть
 
glTranslatef(pos[0], pos[1], pos[2]);
  glRotatef(rtri,0.0f,0.0f,1.0f);
  
  // Рисование триугольника
  glBegin(GL_POLYGON);      // начало рисования полигона
   glColor3f(1.0f,0.0f,0.0f);
  glVertex3f( 0.0f, 1.0f, 0.0f);// верх
  glColor3f(0.0f,1.0f,0.0f);
  glVertex3f( 1.0f,-1.0f, 0.0f);        // низ право
  glColor3f(0.0f,0.0f,1.0f);
  glVertex3f(-1.0f,-1.0f, 0.0f);        // низ лево  
  glEnd();                  // конец рисования
 
  
                // задаётся вращение для триугольника
   
 
  // перестановка буфера для показа
  SDL_GL_SwapBuffers();
}
 
int main(int argc, char **argv) 
{  
  int done;
 
  /* Инициализация СДЛ видео выхода */
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
    exit(1);
  }
 
  /* создаёт окно с размерами 640х480*/
  if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL ) {
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError());
    SDL_Quit();
    exit(2);
  }
 
  /* Титл окна */
  SDL_WM_SetCaption("Frost", NULL);
 
  /* загрузка рисовальных ивентов и ивнтов чтения */
  InitGL(640, 480);
  done = 0;
  while ( ! done ) {
    DrawGLScene();
 
    /* функции обработки клавиш */
    { SDL_Event event;
      const float radindeg = 3.14f / 180.0f; // количество радиан в градусе
      float step = 0.3f;
      float phi = 3.0f; //шаг поворота
 
      while ( SDL_PollEvent(&event) ) {
        if ( event.type == SDL_QUIT ) {
          done = 1;
        }
        if ( event.type == SDL_KEYDOWN ) {
           if ( event.key.keysym.sym == SDLK_ESCAPE ) {
            done = 1;
          } if (event.key.keysym.sym==SDLK_UP) {
               for (int i = 0; i < 3; i++)
                    pos[i]+= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_DOWN){
               for (int i = 0; i < 3; i++)
                    pos[i]-= fwd[i] * step;
          } if (event.key.keysym.sym==SDLK_LEFT){
               rtri += phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          } if (event.key.keysym.sym==SDLK_RIGHT){
               rtri -= phi;
               fwd[0] = cos(rtri * radindeg);
               fwd[1] = sin(rtri * radindeg);
          }
          }
        }
      }
    }
  SDL_Quit();
  return 1;
}
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:15 16
Точка там вместо запятой, аккуратней копипастить код надо
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:22  [ТС] 17
ага...помогло треугольник появился...двигается...
подскажи как сделать чтоб он двигался при зажатой кнопке...чтоб не клацать постоянно?
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:25 18
Точно не скажу, с SDL дела никогда не имел, но предполагаю, что вместо события SDL_KEYDOWN нужно ловить событие SDL_KEYPRESSED
0
10 / 10 / 3
Регистрация: 18.07.2010
Сообщений: 180
22.07.2010, 13:34  [ТС] 19
впрочем это уже нетакуж важно...покавыряюсь...
а вот последний вопросик...треугольник двигается при нажатии вверх низ не по направлению своей главной вершине...а както непонятно...в разброс чтоли...можно это както исправить?

Добавлено через 1 минуту
это происходить когда его поворачиваю...

Добавлено через 5 минут
вот пример на вин32...
я чёт ковырялся...мозгов нехватило переделать))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
 if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7;
 
 if(GetAsyncKeyState(VK_UP)) { 
     Vector tmp; tmp.x = 0.01; tmp.y = 0.01;
     tmp = Rotate(tmp, angle);
     
     pos.x += tmp.x; pos.y += tmp.y;
     if(pos.x > 5.1) pos.x = -5.1;
     if(pos.x < - 5.1) pos.x = 5.1;
 
     if(pos.y > 5.1) pos.y = -5.1;
     if(pos.y < - 5.1) pos.y = 5.1;
 
 }  // Кнопки вверх и вниз меняют позицию фигуру! 
 if(GetAsyncKeyState(VK_DOWN)) {
     Vector tmp; tmp.x = -0.006; tmp.y = -0.006;
     tmp = Rotate(tmp, angle);
     pos.x += tmp.x; pos.y += tmp.y;
 
     pos.x += tmp.x; pos.y += tmp.y;
     if(pos.x > 5.1) pos.x = -5.1;
     if(pos.x < - 5.1) pos.x = 5.1;
 
     if(pos.y > 5.1) pos.y = -5.1;
     if(pos.y < - 5.1) pos.y = 5.1;
 
 }
0
26 / 25 / 3
Регистрация: 19.03.2010
Сообщений: 57
22.07.2010, 13:37 20
Исправить можно все...

Я перепутал cos и sin местами при повороте, возможно в этом вся проблема
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2010, 13:37

Не компилируется SDL + OpenGL на Windows в mingw
Здравствуйте. Пишу проект на sdl+opengl. В линуксе всё компилируется нормально, однако, когда я...

SDL: OpenGL: установка границ объема отсечения glOrtho(.);
Открыл окно SDL, создал контекст OpenGL. Соответственно, что бы что-либо рисовать, нужно...

Не отображается текстура SDL + OpenGL
Вот код SDL_Window *window = NULL; SDL_Surface *surf = NULL; SDL_GLContext glContext;...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru