0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
1

Случайные числа (координаты) для объекта OpenGL

16.05.2013, 14:30. Показов 1969. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят, пишу курсовую на с++ + ogl. У меня в игре (при каждом ее запуске) должен появляться объект в разных местах поля. Использую такой код генератора рандомных чисел:
C++
1
2
srand(time(NULL));
   const int m = rand()%(19+1);
m присваиваю как координату объекта.
Столкнулся с такой проблемой: если размещать этот код в функции on_paint (отвечающую за перерисовку), то числа генерируются постоянно и объект движется по полю. А если размещать вне on_paint - постоянно генерируется одно и тоже число и объект с каждым запуском стоит на месте. Очень надеюсь на вашу помощь, скоро защита.

UPD: библиотеки эти
C++
1
2
#include <stdlib.h>
#include <time.h>
подключены.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2013, 14:30
Ответы с готовыми решениями:

OpenGL. Как узнать конечные координаты объекта?
Добрый день. Подскажите как нарисовать линию от нулевой точке в пространстве до центра объекта,...

Как рассчитывать координаты для 3D объекта?
подскажите пожалуйста как рассчитывать координаты для 3d объекта в OpenGl.В примерах что я находил...

Перевести 3d координаты объекта в 2d координаты экрана на VB.vet
Подскажите пожалуйста может у кого есть код на vb.net, мне нужно перевести 3d координаты объекта в...

Случайные координаты на заданном расстоянии от точки
Есть некое 3х мерное пространство, обусловленное координатами X Y Z. Есть координатная точка:...

6
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 18:02 2
Цитата Сообщение от scorps123 Посмотреть сообщение
А если размещать вне on_paint
Кусок кода с этим в студию.
1
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 18:25  [ТС] 3
функция генератора чисел:
C++
1
2
3
4
5
void RandomNumbers()
{
 srand(time(NULL));
   const int carrotX = rand()%(19+1);
}
функция on_paint:
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
void on_paint()
{
    char sz[128];  
    if (a==17 && b == 17 || a==19 && b==19 || a==18 && b==18 || a==20 && b==20)
        {//system("pause");
            sprintf(sz, "You Win!! Time remained: %d sec       Esc - Exit", second);
    
    }
    else
   sprintf(sz, "Time: %d sec \n        Esc - Exit", second);
 
    if(second == 0) 
        sprintf(sz, "You Lost! Please try again       Esc - Exit");     
 
 
    glViewport(0, -15, width, height); 
 
  
  GLfloat light_ambient[] = { 0.0f, 0.0f, 1.0f, 0.5f }; 
  GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
  GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  GLfloat light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f };
 
  // освещение
  glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);  
 
  glClearColor(0.25, 0.25, 0.25, 0.25);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
    glPushMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,1, 0,1, -1, 1);   
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glColor3f(1, 1, 1); 
    drawString(GLUT_BITMAP_HELVETICA_18, sz, 0.1, 1.0);
    glPopMatrix();
 
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(60, (GLfloat)width/height, 1, 100);
                                                    
  
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(-a,-b, distZ);  
  glRotatef(angleX, 0.0f, 1.0f, 0.0f); 
  glRotatef(angleY, 1.0f, 0.0f, 0.0f);  
  glEnable(GL_DEPTH_TEST);  
  glEnable(GL_LIGHTING);   
  glEnable(GL_LIGHT0);     
 
  // нижняя часть снеговика
  glMaterialfv(GL_FRONT,GL_AMBIENT,mat1_amb);
   glMaterialfv(GL_FRONT,GL_DIFFUSE,mat1_dif);
   glMaterialfv(GL_FRONT,GL_SPECULAR,mat1_spec);
   glMaterialf(GL_FRONT,GL_SHININESS,mat1_shininess);
   glPushMatrix();
   glTranslatef( a, b, e );
   glutSolidSphere (1.0, 50, 50);
   glPopMatrix();
 
   // врехняя часть
   glMaterialfv(GL_FRONT,GL_AMBIENT,mat1_amb);
   glMaterialfv(GL_FRONT,GL_DIFFUSE,mat1_dif);
   glMaterialfv(GL_FRONT,GL_SPECULAR,mat1_spec);
   glMaterialf(GL_FRONT,GL_SHININESS,mat1_shininess);
   glPushMatrix();
   glTranslatef( g, h, j );
   glutSolidSphere (0.7, 30, 30);
   glPopMatrix();
 
   //отображаем шапку
    glPushMatrix();     
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat4_amb);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat4_dif);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat4_spec);
    glMaterialf(GL_FRONT,GL_SHININESS,mat4_shininess);
            glTranslated(i, o, p);
            glRotated(0, 0, 1, 0);
            glRotated(0, 1, 0, 0);
            glutSolidCone(0.5, 2, 8, 8);
            glPopMatrix();
 
   //отображаем морковку
            
    glPushMatrix(); 
    glMaterialfv(GL_FRONT,GL_AMBIENT,mat2_amb);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,mat2_dif);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat2_spec);
    glMaterialf(GL_FRONT,GL_SHININESS,mat2_shininess);      
            glTranslated(carrotX, carrotX, 0);
            glRotated(0, 0, 1, 0);
            glRotated(0, 1, 0, 0);
            glutSolidCone(0.3, 4, 12, 12);
            glPopMatrix();            
                    
 
   //рисуем полигон
   glBegin(GL_POLYGON);    
   glMaterialfv(GL_FRONT,GL_AMBIENT,mat3_amb);
   glMaterialfv(GL_FRONT,GL_DIFFUSE,mat3_dif);
   glMaterialfv(GL_FRONT,GL_SPECULAR,mat3_spec);
   glMaterialf(GL_FRONT,GL_SHININESS,mat3_shininess);
    glVertex3f(0,0,0);  
    glVertex3f(20,0,0); 
    glVertex3f(20,20,0);    
    glVertex3f(0,20,0); 
   glEnd;
 
   //рисуем стенки полигона
   glBegin(GL_POLYGON);    
   glMaterialfv(GL_FRONT,GL_AMBIENT,mat4_amb);
   glMaterialfv(GL_FRONT,GL_DIFFUSE,mat4_dif);
   glMaterialfv(GL_FRONT,GL_SPECULAR,mat4_spec);
   glMaterialf(GL_FRONT,GL_SHININESS,mat4_shininess);
    glVertex3f(0,10,10);    
    glVertex3f(0,10,10);    
    glVertex3f(0,0,0);  
    glVertex3f(0,10,10);    
   glEnd;
 
   
   glPushMatrix();
   glBegin(GL_LINES);
     glVertex3f(0, 0, 0);  
     glVertex3f(0, 5, 0);  
   glEnd();
   glPopMatrix();
 
   
   glPushMatrix();
   glBegin(GL_LINES);
     glVertex3f(0, 0, 0);  
     glVertex3f(6,0, 0);  
   glEnd();
   glPopMatrix();   
  
  
  glDisable(GL_LIGHT0);
  glDisable(GL_LIGHTING);
  glDisable(GL_DEPTH_TEST);
  glFlush();
  glutSwapBuffers();
}
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 18:38 4
Цитата Сообщение от scorps123 Посмотреть сообщение
srand(time(NULL));
Вынесите инициализацию семени на старт программы.
1
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 18:56  [ТС] 5
Цитата Сообщение от stima Посмотреть сообщение
Вынесите инициализацию семени на старт программы.
если вставить в main, то все равно объект движется постоянно и число генерируется.
А если в хедер - то вылазит ошибка this declaration has no storage class or type.

Может быть я неправильно понял фразу: "На старт программы"?

Приведу на всякий случай весь код:
https://dl.dropboxusercontent.... Source.cpp
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 19:15 6
Цитата Сообщение от scorps123 Посмотреть сообщение
Может быть я неправильно понял фразу: "На старт программы"?
Правильно.

Движется он потому что
C++
1
int carrotX = rand()%(19+1);
у вас инициализируеться каждый раз при перерисовке новым числом. Обьявите ее глобально и инициализируйте один раз, в мейне рядом с srand.
1
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 19:30  [ТС] 7
сделал так:
C++
1
2
3
4
5
6
7
8
9
10
#include <algorithm>
 
#ifndef M_PI
#define M_PI  3.1415
#endif
 
GLuint  base;
int second = 10;
int tick = 0;
[B]int carrotX;[/B]
.......
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, char* argv[])
{   
 
  glutInit(&argc, argv);                                     
  glutInitWindowSize(800, 600);                              
  glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
  glutCreateWindow("Game");    
  
 [B] srand(time(NULL));
  carrotX = rand()%19+1;[/B]
  glutDisplayFunc(on_paint);  
  glutReshapeFunc(on_size);                   
  glutKeyboardFunc(on_keyboard);             
  glutMotionFunc(on_motion);                   
  glutMouseFunc(on_mouse);                   
  glutTimerFunc(33, on_timer, 0);            
  glutMainLoop();                           
  return(0);
}
но, к сожалению, не помогло. Движется, как и раньше

Добавлено через 5 минут
а, не! Все заработало! Огромное спасибо!
0
16.05.2013, 19:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2013, 19:30
Помогаю со студенческими работами здесь

Перемещение по экрану на разные случайные координаты двух букв
Задаются 2 буквы с экрана.После идет перемещение по экрану (на разные случайные координаты)...

Организовать случайные числа для массива, если каждое вещественное число должно удовлетворять промежутку
Как организовать случайные числа для массива, если каждое вещественное число должно удовлетворять...

Нужно, чтобы функция создания вершины присваивала ей случайные координаты
Здравствуйте, я пишу программу, которая генерирует графы и мне нужно, чтобы функция создания...

Каждую секунду квадрат должен смещаться от ЦЕНТРА холста на случайные координаты
Начал изучать HTML5 и JS. Создал базовый пример. И.. застопорился. Пытаюсь записать алгоритм такой...


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

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

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