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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 19:51   #1
kothit
 
Регистрация: 14.04.2013
Сообщений: 3
По умолчанию БИЛЬЯРД на OpenGl

Здравствуйте, есть задача - написать игру в бильярд на Opengl. Есть опыт работы с c++, но с opengl столкнулся в первые. Игра должна представлять собой 2D приложение, с дизайном разобрался. Но возникла проблема, как сделать анимацию, что бы при нажатии левой кнопки мыши шар котился к заданому месту и взаимодействовал с другими объектами. В видео уроках и на форумах не нашел нужной информации. Если кто может просветите, а то уж запутался.
Вот мой код
Код:
#include "glut.h"

int WinWid=600;//длина 
int WinHei=350;// и ширина окна программы
float x1=150.0,y1=175.0;//начальные положения главного шара
int x=300, y=175;
bool down=false;
float dx=1.0,dy=1.0;
float xstep=1.0,ystep=1.0;

struct ball{
	void move(){
		glColor3f(220/225.0,195/225.0,177/255.0);
		glTranslatef(x1,y1,0.0);	
		glutSolidSphere(10.0,20.0,20.0);
	}
} ball1;
void Draw()//функция рисования луз и главного шара
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();

	glColor3f(70/255.0,27/255.0,2/255.0);
		glTranslatef(0.0,350.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
		glTranslatef(0.0,0.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
		glTranslatef(300.0,0.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
		glTranslatef(600.0,0.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
		glTranslatef(600.0,350.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
		glTranslatef(300.0,350.0,0.0);
		glutSolidSphere(25.0,50.0,50.0);
	glLoadIdentity();
	ball1.move();
	glutSwapBuffers();
}

/*void MouseMove(int ax,int ay)//просто двигаем мишь
{
		
}*/
void MousePress(int button,int state,int ax,int ay)//нажата клавиша миши
{
	if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN){
		//dx=ax;
		//dy=ay;
		x1 = ax;		// добавлено !!!!!!!!
		y1 = ay;		//добавлено !!!!!!!!!
		
	/*	if(x!=ax&&y!=ay){
			if(ax<x&&ay<y) {x-=xstep;y-=ystep;}
			if(ax<x&&ay>y) {x-=xstep;y+=ystep;}
			if(ax>x&&ay>y) {x+=xstep;y+=ystep;}
			if(ax>x&&ay<y) {x+=xstep;y-=ystep;}
		}*/
	}
}

void MousePressMove(int ax,int ay)//клавиши миши нажаты и мишь двигается
{
	x1=ax;
	y1=ay;
}

void Timer(int v)//функция обновления екрана
{
	glutPostRedisplay();//обновление екрана
	
	glutTimerFunc(100,Timer,0);
}

void Initialize()
{
	glClearColor(32/255.0,117/255.0,7/255.0,1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//glOrtho(-WinWid/2, WinWid/2, -WinHei/2, WinHei/2,-300.0,175.0);//координаты оси
	glOrtho(0, WinWid, WinHei, 0,-300.0,175.0);//координаты оси для миши
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//инициализация дисплея, буфер рисования, и сторонних вычислений
	glutInitWindowSize(WinWid,WinHei);//размеры екрана
	glutInitWindowPosition(100,100);//смещение окна программы
	glutCreateWindow("Бильярд");//название окна
	glutDisplayFunc(Draw);//передача указателя на функцию
	glutMotionFunc(MousePressMove);// мишь нажата и двигается
	//glutPassiveMotionFunc(MouseMove);//мишь только двигается
	glutMouseFunc(MousePress);//мишь только нажата
	glutTimerFunc(100,Timer,0);//таймер(анимация)
	Initialize();
	glutMainLoop();//главный цикл
}
kothit вне форума Ответить с цитированием
Старый 19.05.2013, 09:07   #2
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Цитата:
как сделать анимацию, что бы при нажатии левой кнопки мыши шар котился к заданому месту и взаимодействовал с другими объектами.
Во первых тебе понадобится отслеживать collision detection для твоих окружностей(то бишь шаров).
Во вторых(если мне не изменяет память) для создания анимации(т. к. ты используешь glut) тебе придется использовать glutTimerFunc чтобы назначить какую нибудь callback функцию в роли таймера.
WebbMan вне форума Ответить с цитированием
Старый 19.05.2013, 10:24   #3
kothit
 
Регистрация: 14.04.2013
Сообщений: 3
По умолчанию

Насколько я понял для анимации движения шара нужно изменять текущие координаты шара в функции glutTimerFunc. Но эта функция начинает работать не дожидаясь нажатия клавиши мыши. Нужно ставить логическое условие или как?
kothit вне форума Ответить с цитированием
Старый 19.05.2013, 17:09   #4
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Если я правильно понял, как то так:
Код:
bool flag = false;
float eps = ...
void MousePress(...)
{
        if(flag == flase) запоминаем x и y; flag = true;
}
void Timer(...)
{
	if(flag == true)
        {
            Координаты_вашего_шара с каким то шагом(step) стремятся к x и y(скорее всего надо сделать через уравнение прямой)
            допустим получили stepX и stepY через уравнение прямой:
            ball.x = ball.x + stepX;
            ball.y = ball.y + stepY;
            if( abs(ball.x - x) < eps &&  abs(ball.y - y) < eps)//если шар докатился
            {
                 flag = false;
            }
        }

}
WebbMan вне форума Ответить с цитированием
Старый 20.05.2013, 19:22   #5
kothit
 
Регистрация: 14.04.2013
Сообщений: 3
По умолчанию

Спасибо, буду пробовать.
kothit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра бильярд 2Д Milka_777 Помощь студентам 5 27.10.2017 22:21
Программа бильярд(соударение мячей) C# Kehab Помощь студентам 0 21.01.2012 11:26
Бильярд в Visual Basic Айвика Помощь студентам 3 24.07.2010 21:56
Программа бильярд. Dezolyator Помощь студентам 4 04.05.2010 19:15
бильярд в Дельфи aiktz Общие вопросы Delphi 6 04.05.2010 15:12