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

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

Восстановить пароль Регистрация
 
scorps123
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 14:30     Случайные числа (координаты) для объекта OpenGL #1
Ребят, пишу курсовую на с++ + 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>
подключены.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2013, 14:30     Случайные числа (координаты) для объекта OpenGL
Посмотрите здесь:

Случайные числа C++
Случайные числа C++
C++ случайные числа
Случайные числа C++
Как определить координаты объекта? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 18:02     Случайные числа (координаты) для объекта OpenGL #2
Цитата Сообщение от scorps123 Посмотреть сообщение
А если размещать вне on_paint
Кусок кода с этим в студию.
scorps123
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 18:25  [ТС]     Случайные числа (координаты) для объекта OpenGL #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();
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 18:38     Случайные числа (координаты) для объекта OpenGL #4
Цитата Сообщение от scorps123 Посмотреть сообщение
srand(time(NULL));
Вынесите инициализацию семени на старт программы.
scorps123
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 18:56  [ТС]     Случайные числа (координаты) для объекта OpenGL #5
Цитата Сообщение от stima Посмотреть сообщение
Вынесите инициализацию семени на старт программы.
если вставить в main, то все равно объект движется постоянно и число генерируется.
А если в хедер - то вылазит ошибка this declaration has no storage class or type.

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

Приведу на всякий случай весь код:
https://dl.dropboxusercontent.com/u/90254390/Source.cpp
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 19:15     Случайные числа (координаты) для объекта OpenGL #6
Цитата Сообщение от scorps123 Посмотреть сообщение
Может быть я неправильно понял фразу: "На старт программы"?
Правильно.

Движется он потому что
C++
1
int carrotX = rand()%(19+1);
у вас инициализируеться каждый раз при перерисовке новым числом. Обьявите ее глобально и инициализируйте один раз, в мейне рядом с srand.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 19:30     Случайные числа (координаты) для объекта OpenGL
Еще ссылки по теме:

C++ Координаты точек на границах объекта
C++ Случайные числа

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

Или воспользуйтесь поиском по форуму:
scorps123
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
16.05.2013, 19:30  [ТС]     Случайные числа (координаты) для объекта OpenGL #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 минут
а, не! Все заработало! Огромное спасибо!
Yandex
Объявления
16.05.2013, 19:30     Случайные числа (координаты) для объекта OpenGL
Ответ Создать тему
Опции темы

Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru