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

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

Войти
Регистрация
Восстановить пароль
 
scorps123
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 6
#1

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

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

Ребят, пишу курсовую на с++ + 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++ Случайные числа
Как определить координаты объекта? C++
C++ Случайные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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++
Случайные числа от 1 до 9 C++
C++ Координаты точек на границах объекта
Задать координаты объекта 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
Ответ Создать тему
Опции темы

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