Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2010, 12:31   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию opengl треугольник

Народ подскажите как селать так чтоб при нажатии клавиши пробл из треугольника вылетала точка.Так сказать выстрел.
Код:
#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)
{
  Angle = N*3/10;
  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;
float Angle; 
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();
 
 
}
revaldo666 вне форума Ответить с цитированием
Старый 25.08.2010, 16:56   #2
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

народ ну подскажите плиз очен надо...
revaldo666 вне форума Ответить с цитированием
Старый 01.09.2010, 01:34   #3
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

определи вектор, который будет иметь начало скажем в центре треугольника, а конец в одном из углов, откуда будет выстрел например (Vector shot). Заводишь флаг bool для фиксации выстрела. Вместе с треугольником выводишь glut'овый шарик в позиции shot, если флаг TRUE. В display умножаешь вектор на 2 скажем, или складывай shot с единичным вектором от shot (shot/shot.lenght).
Код:
Vector vShot;
void display(void)
{
....
if(GetAsyncKeyState(VK_LEFT))  angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! 
if(GetAsyncKeyState(VK_SPACE) && !bShot) bShot=TRUE;
....
if(bShot)
{
      vShot.x+=vShotBasis.x;
      vShot.y+=vShotBasis.y;
} 
...
Vector tv4 = Rotate(vShot,angle);
...
glBegin(GL_TRIANGLES);
....
glEnd();

glTranslated(tv.x, tv.y, 0);
glutSolidSphere(0.2, 16, 16); // размеры подогнать
...
}
Всё примерно... главное идея 3 года уже gl в руки не брал

Последний раз редактировалось blob; 01.09.2010 в 09:41.
blob вне форума Ответить с цитированием
Старый 01.09.2010, 09:41   #4
blob
Пользователь
 
Регистрация: 24.08.2010
Сообщений: 34
По умолчанию

Забыл добавить. Там ещё нужно проверять, когда рост вектора прекращать. Видно там должен быть анализ выхода из viewport или попадания в астероид
blob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
win32 opengl треугольник revaldo666 Общие вопросы C/C++ 12 21.07.2010 18:30
C++(треугольник) Runner Помощь студентам 2 13.05.2010 10:32
Треугольник в VBA FullmetalAlchemist Microsoft Office Excel 3 27.04.2010 13:44
Рисуем треугольник Познающий Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 19.11.2009 22:24
Треугольник serega11 Помощь студентам 2 22.05.2008 09:01