Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С++ opengl Создание и движение обьектов 
:(
    Опции темы
revaldo666
Дата 28.7.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.7.2010

Репутация: нет
Всего: нет



Народ подскажите как сделать чтоб астероиды не прыгали по окну а плавно двигались  линейно в рендомном направлении.
И может кто знает как сделать так чтоб при контакте треугольника с астероидом цвет треугольника менялся на красный
Код

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <glut.h>
 
#define PI 3.1415926535898
 
#pragma comment (lib, "glut32.lib")
 
struct Vector {float x, y;};  
Vector v1, v2, v3,v4; 
Vector pos;
float angle;
struct Vec3D {float X, Y, Z;};
class Asteroid
{
public:
void Init(int N)
{
  int i = N / 4;
  int j = N % 4;
  A.X = -0.5+i/2;
  A.Y = -0.5+j/2;
  A.Z = 0;
  B.X = i/2;
  B.Y = -0.5+j/2;
  B.Z = 0;
  C.X = -0.5+i/2;
  C.Y = j/2;
  C.Z = 0;
  D.X = i/2;
  D.Y = j/2;
  D.Z = 0;
  dx = 0;
  dy = 0;
  dz = 0;
} 
 
Vec3D A, B, C, D;
float dx, dy, dz;

public:
void Draw();
};
 
int N = 10; 
Asteroid AstArr[10];   //Массив астероидов
 
 
 
//------------------------------------------------------------------------------------
void resize(int width,int height)
{
   glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
   gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
   glMatrixMode( GL_MODELVIEW );
 
}
 
//------------------------------------------------------------------------------------
 
Vector Rotate(Vector v,float a) // функция вращения вектора на угол а.
{
 
Vector r;
 
 
a = a * (PI/180.0);
r.x = (v.x*cos(a)) + (v.y*sin(a));
r.y = (v.x*-sin(a)) + (v.y*cos(a));
 
 
 
 
return r;
 
}
 
//------------------------------------------------------------------------------------
 
void init() // Задаем установки прогы
{
v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры
v2.x =-0.08; v2.y = 0.08;
v4.x = 0.08; v4.y =-0.08;
 
}
void Asteroid::Draw()
{
        glBegin(GL_QUADS);
        glColor3ub(255,255,255);
            glVertex3f(A.X, A.Y, A.Z);   // Слева вверху
            glVertex3f(B.X, B.Y, B.Z);   // Справа вверху
            glVertex3f(C.X, C.Y, C.Z);   // Справа внизу
            glVertex3f(D.X, D.Y, D.Z);   // Слева внизу
        
        glEnd(); 
}
//------------------------------------------------------------------------------------
 
 
void display(void)
{
 
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
glLoadIdentity();
 
for (int i = 0; i < N; i++)
 {
  glLoadIdentity();
  glTranslatef(AstArr[i].dx, AstArr[i].dy, AstArr[i].dz);
  AstArr[i].Draw();
 }
 
glLoadIdentity(); 
 
 if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
 if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7;
 
 if(GetAsyncKeyState(VK_UP)) { 
         Vector tmp; tmp.x = 0.004; tmp.y = 0.004;
         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.003; tmp.y = -0.003;
         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;
 
 }
 
 
 Vector tv1 = Rotate(v1,angle); // создаем временой вектор  для создания глобальних кординат
 Vector tv2 = Rotate(v2,angle);
 Vector tv3 = Rotate(v4,angle);
 
 
 glBegin(GL_TRIANGLES);
 
     glColor3ub(255,255,0);
    glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию
         
    glVertex2d(tv2.x + pos.x, tv2.y + pos.y);
    glVertex2d(tv3.x + pos.x, tv3.y + pos.y);
        glEnd();
        
 
 
glutSwapBuffers();
glutPostRedisplay();
 
 
}
 
void Timer(int value)
{
for (int i = 0; i < N; i++)
 {
   float Angle = rand() * PI/180;
  AstArr[i].dx = AstArr[i].dx + cos(Angle)-sin(Angle);
  AstArr[i].dy = AstArr[i].dy + sin(Angle)+cos(Angle);
  if (AstArr[i].dx > 5) 
           AstArr[i].dx =4.7;
  if (AstArr[i].dx < -5) 
           AstArr[i].dx =-4.7;
  if (AstArr[i].dy > 5) 
           AstArr[i].dy =4.7;
  if (AstArr[i].dy < -5) 
           AstArr[i].dy =-4.7;
}
  glutPostRedisplay();  // Redraw windows
  glutTimerFunc(300, Timer, 0);
}
 
//------------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
 
 
for (int i = 0; i < N; i++)
 {
 AstArr[i].Init(i);
 AstArr[i].Draw();
 }
 
 
 
  init();
    glutInit(&argc, argv);             
    glutInitWindowSize(800, 700);        
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutCreateWindow("FrOsT");
    glutReshapeFunc(resize);
        glutTimerFunc(300, Timer, 0);
    glutDisplayFunc(display);
    glutMainLoop();
 
        return 0;
}

Буду очень благодарен

Это сообщение отредактировал(а) revaldo666 - 29.7.2010, 11:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.