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

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

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

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

16.05.2013, 14:30. Просмотров 451. Ответов 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>
подключены.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2013, 14:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Случайные числа (координаты) для объекта OpenGL (C++):

Случайные координаты на заданном расстоянии от точки - C++
Есть некое 3х мерное пространство, обусловленное координатами X Y Z. Есть координатная точка: X1 = 8 Y1 = -13 Z1 = 120 ...

Нужно чтобы случайные числа вставали в конец массива,а не удаляли числа - C++
#include &lt;iostream&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; // кол-во элементов массива ...

Задать координаты объекта - C++
Нужно задать координаты объекта (х;у) так чтобы он появляется на дуге окружности. Даны радиус окружности R, координаты его центра cX и...

Как определить координаты объекта? - C++
Здравствуйте, ситуация такая: есть ряд нарисованных блоков, их должен уничтожить шарик (игра арканоид), отскакивая от стен. Вопрос в том,...

Координаты точек на границах объекта - C++
Доброго времени суток. Помогите балбесу. Задача состоит в получении плоскости точек объекта. На белом экране с веб-камеры делается снимок...

Случайные числа - C++
Подскажите функцию(или класс а вней функцию) для генерирования случайных чисел аналог Random.Next() C#

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
16.05.2013, 18:02 #2
Цитата Сообщение от scorps123 Посмотреть сообщение
А если размещать вне on_paint
Кусок кода с этим в студию.
1
scorps123
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
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
16.05.2013, 18:38 #4
Цитата Сообщение от scorps123 Посмотреть сообщение
srand(time(NULL));
Вынесите инициализацию семени на старт программы.
1
scorps123
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.com/u/90254390/Source.cpp
0
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
16.05.2013, 19:15 #6
Цитата Сообщение от scorps123 Посмотреть сообщение
Может быть я неправильно понял фразу: "На старт программы"?
Правильно.

Движется он потому что
C++
1
int carrotX = rand()%(19+1);
у вас инициализируеться каждый раз при перерисовке новым числом. Обьявите ее глобально и инициализируйте один раз, в мейне рядом с srand.
1
scorps123
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 19:30
Привет! Вот еще темы с ответами:

случайные числа - C++
подскажите как сформировать двумерный массив случайных чисел в заданном диапозоне которые не повторяются

Случайные числа - C++
Доброго времени суток! Возможно ли сделать так, чтобы выпадали в случайном порядке числа 0, 2, 6, 8?

Случайные числа - C++
Привет, мне надо наполнить массив случайными числами но толька чтоб они не повторялись, подскажыте как ето сделать.

Случайные числа от -10 до 10 - C++
сижу я значит и не могу вывести случайные числа от -10 до 10! Получается только от -50 до 50, for(int j= 0; j&lt;8; j++) ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.05.2013, 19:30
Ответ Создать тему
Опции темы

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