Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание и обсуждение игр
Регистрация

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

Ответ
 
Опции темы
Старый 09.11.2016, 22:08   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 374
Репутация: 102
По умолчанию Перемещение объекта мышкой OpenGl

Добрый вечер. Начала изучать OpenGL при выполнении задания - сделать пасьянс. В программе просто должны выводиться карты как в пасьянсе и перемещаться по нажатию мышки в одну из 4 колод. Если с выводом изображений карт +- понятно, то с перемещением ничего не понятно. Для начала открыла урок, в котором происходит просто перемещение объекта за мышкой. Сразу же возник следующий вопрос:
1. Как одно изображение карты из массива изображений карт-сделать объектом, который будет перемещаться вслед за мышкой и оставаться на том месте, "куда мышь привела этот объект".
Код
Код:

#pragma warning(disable: 4996)
 
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
 
float WinWid=1000.0;
float WinHei=980.0;
int Angle=0.0;
float Scale=1.0;
 
float x=0.0,y=0.0;
void Draw()
{
     glClear(GL_COLOR_BUFFER_BIT);
     Angle%=360;
     glPushMatrix();
     Scale=1.0-abs(sin(3.14*Angle/90.0)/sqrt(3.0)/2);
     glRotatef(Angle,0.0,0.0,1.0);
     glScalef(Scale,Scale,1.0);
    glBegin(GL_LINES);
    for(float i=0+x;i<=WinWid+x;i+=20.0)
    {
         glVertex2f(i, 0+y);
          glVertex2f(i, WinHei+y);
    }
        for(float i=0+y;i<=WinHei+y;i+=20.0)
    {
         glVertex2f(0+x,i);
          glVertex2f(WinWid+x,i);
    }
         glEnd();
         glPopMatrix();
         glutSwapBuffers();
 
}
 void MouseMove(int ax,int ay)
 {
     x=ax;
     y=ay;
    glutSetWindowTitle("MouseMove");
 }
 void MousePressed(int button, int state,int x,int y)
 {
 glutSetWindowTitle("MousePressed");
 }
 void MousePressedMove(int ax,int ay)
 {
 glutSetWindowTitle("MousePressedMove");
 }
 void Timer(int value)
 {
    glColor3f(1.0,1.0,1.0);
    //Draw();
    glutPostRedisplay();
    glutTimerFunc(50,Timer,0);
 }
 void Initialize()
 {
   glClearColor(0.0,0.57,0.0,1.0);//0.57
   glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,WinWid, WinHei, 0, -200.0, 200.0);
    glMatrixMode(GL_MODELVIEW);
 }
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(WinWid, WinHei);
    glutInitWindowPosition(100, 0);
  glutCreateWindow("Test");
   glutDisplayFunc(Draw);
    glutMotionFunc(MousePressedMove);
    glutPassiveMotionFunc(MouseMove);
    glutMouseFunc(MousePressed);
    glutTimerFunc(50,Timer,0);
    Initialize();
  glutMainLoop();
    return 0;
}

В коде объект следует за мышкой, но по новому нажатию на мышку не фиксирует свое положение,а "перемещается дальше за мышкой". Мне нужно,чтобы по клацанью мыши объект оставался на месте, в которое я его переместила (как в обычной игре в карты). Пока не пробовала выводить карты, так как вдруг ошибаюсь и надо будет работать не с массивом изображений, а как-то по-другому это преподать. Прошу помочь разобраться с моим заданием. Благодарю.
Вероника99 вне форума   Ответить с цитированием
Старый 10.11.2016, 00:00   #2
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 374
Репутация: 102
По умолчанию

Не подскажете?(
Вероника99 вне форума   Ответить с цитированием
Старый 10.11.2016, 22:29   #3
8Observer8
Профессионал
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Адрес: Саратов
Сообщений: 3,069
Репутация: 832
По умолчанию

Вы очень мало выводите отладочной информации. Если нет возможности выводить в консоль, то сделайте текстовое поле вывода с прокруткой, чтобы видеть в какой последовательности вызываются события MousePressed и т.д. Вам нужны обработчики: MouseDown, MouseUp (или MouseRelease), MouseMove. Пока что нужно выводите только текст, чтобы разобраться с обработчиками. Допустим, вы нажали на кнопку мыши и видите в окне вывода: MouseDown + координаты клика. Дальше вы, не отпуская кнопку мыши двигаете её и видите в выводе MouseMove + координаты курсора. Потом вы отпускаете левую кнопку мыши и видите срабатывание обработчика MouseRelease. Когда в текстовом виде будет работать так как нужно по логике, то можно начать рисовать.

Последний раз редактировалось 8Observer8; 10.11.2016 в 22:32.
8Observer8 вне форума   Ответить с цитированием
Старый 14.11.2016, 07:47   #4
phomm
personality
Профессионал
 
Аватар для phomm
 
Регистрация: 28.04.2009
Адрес: Тюмень
Сообщений: 2,855
Репутация: 1511

icq: 421049471
skype: phomm-
По умолчанию

Ну, для озвученной задачи в базовом виде нужен только флаг (булева переменная), что мышка была кликнута (в функции клика мыши меняем этот флаг), если флаг был включен, то обновляем координаты:
Код:

if (isMouseDragOn)
{
     x=ax;
     y=ay;
}

Далее уже можно плясать:
Вводить для каждого графического объекта класс, где будет массив точек, флаг что тащим объект и прочие нужные вещи (например, цвет). Потом прописываем массив таких объектов, один указатель на такой объект будет являть текущий объект, в функции клика анализируем какой объект был под мышкой (обычно решают задачу по алгоритму точка в многоугольнике, но для случая наложения объектов друг на друга надо будет ещё сохранять глубину, для случая невыпуклых многоугольников тоже появляются свои тонкости), и ему ставим флаг на таскание, при движении мыши обновляя ему координаты (но не через прямое присвоение координат, а учитывая место , где внутри объекта кликнули, иначе при захвате объект будет дергаться).
В общем, тут много моментов, и каждый надо рассматривать отдельно, просто взять заготовку мало.
phomm вне форума   Ответить с цитированием
Старый 14.11.2016, 18:01   #5
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 374
Репутация: 102
По умолчанию

Спасибо за ответы. Пока есть структура , которая хранит информацию про карты, вывод карт на экран и попытка как-то переместить хотя бы одну карту. Хочу сперва разобраться с перемещением одной карты.
Код:

#include "stdafx.h"
#include <stdlib.h>
#include "GL/glut.h"
#include "GL/glaux.h"
#include <math.h>
#include <vector>
#include <algorithm>
#include <ctime>

#define N 36
#pragma comment(lib, "GL/opengl32.lib")
#pragma comment(lib, "GL/glu32.lib")
#pragma comment(lib, "GL/glut32.lib")
#pragma comment(lib, "GL/glaux.lib")
using namespace std;
int w=1000, h=980;


AUX_RGBImageRec *MyImage;

AUX_RGBImageRec **cards; //массив карт

float gravity = 3.85;
float drag=0.8;

struct BALL {
	int x,y;
	float dx,dy;
	void move ()
	{

	}
	void Draw()
	{
		//glRasterPos2d (x,y);
		//glDrawPixels (MyImage->sizeX, MyImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, MyImage->data);

		int x1=300,y1=830;
		glRasterPos2d (x1,y1); //50  0.5
		for(int i=0;i<4;i++)
		{
		glRasterPos2d (x1,y1); //50  0.5
		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
		glDrawPixels (cards[i]->sizeX, cards[i]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, cards[i]->data);
		x1+=130;
		}
	
//вывод карт по правилам пасьянса
		...
		for(int i=32;i<36;i++)
		{
		glRasterPos2d (x1,y1); 
		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
		glDrawPixels (cards[i]->sizeX, cards[i]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, cards[i]->data);
		x1+=130;
		}


	}
} ball;

 void MouseMove(int ax,int ay)
 {
	 //x=ax;
	 //y=ay;
	

		//if(ax<=&& ay>=)
	 
	glutSetWindowTitle("MouseMove");
 }
 void MousePressed(int button, int state,int x,int y)
 {
	

 glutSetWindowTitle("MousePressed");
 }
 void MousePressedMove(int ax,int ay)
 {
	 	  glRasterPos2d (ax,ay); 
	 		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
		glDrawPixels (cards[35]->sizeX, cards[35]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, cards[35]->data);
 glutSetWindowTitle("MousePressedMove");
 }





void display ()
{
 glClear (GL_COLOR_BUFFER_BIT);

ball.Draw();

glFlush();
}

void timer (int = 0)
{
	display ();
	
	glutTimerFunc(50,timer,0);
}

int main (int argc, char **argv) {

	ball.x=ball.y=500;
	pl1.x=30;
	pl1.y=140;
	
	char mas[50][50]={"drawable/c6.bmp","drawable/c7.bmp","drawable/c8.bmp","drawable/c9.bmp","drawable/c10.bmp","drawable/c11.bmp",
	"drawable/c12.bmp","drawable/c13.bmp","drawable/c14.bmp",
	"drawable/d6.bmp","drawable/d7.bmp","drawable/d8.bmp","drawable/d9.bmp","drawable/d10.bmp","drawable/d11.bmp",
	"drawable/d12.bmp","drawable/d13.bmp","drawable/d14.bmp",
	"drawable/h6.bmp","drawable/h7.bmp","drawable/h8.bmp","drawable/h9.bmp","drawable/h10.bmp","drawable/h11.bmp",
	"drawable/h12.bmp","drawable/h13.bmp","drawable/h14.bmp",
	"drawable/s6.bmp","drawable/s7.bmp","drawable/s8.bmp","drawable/s9.bmp","drawable/s10.bmp","drawable/s11.bmp",
	"drawable/s12.bmp","drawable/s13.bmp","drawable/s14.bmp"
	};

	vector<int> x(N);

	for(int i=0;i<N;i++)
		x[i]=i;

	srand(unsigned(time(0)));
    random_shuffle(x.begin(), x.end()); // перемешиваем
	cards = (AUX_RGBImageRec**) realloc((cards), ((N)+1)*sizeof(AUX_RGBImageRec*));

	for(int i=0;i<N;i++)
	{
		
		cards[i]= auxDIBImageLoad(mas[x[i]] );
	}

	MyImage = auxDIBImageLoad ("c6.bmp");

	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB );
	glutInitWindowSize (w, h);
	 glutInitWindowPosition(100, 0);
	glutCreateWindow ("Game 1.0");
	glMatrixMode(GL_PROJECTION);
	glClearColor(0.0,0.57,0.0,1.0);
	glLoadIdentity();
	gluOrtho2D(0,w,0,h);

	glutDisplayFunc (display);
	glutTimerFunc (50,timer,0);


	glutMotionFunc(MousePressedMove);
	glutPassiveMotionFunc(MouseMove);
	glutMouseFunc(MousePressed);

	glutMainLoop();
	return 0;
}

В данный момент при долгом нажатии на левую кнопку мыши,за курсором следует последняя карта (метод MousePressedMove).Подскажите пожалуйста, как правильно сделать так,чтобы после такого перемещения, карта выводилась в месте,куда указал курсор? Сейчас при отпускании мыши, "двигающаяся" карта исчезает. Спасибо
Вероника99 вне форума   Ответить с цитированием
Старый 15.11.2016, 18:05   #6
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 374
Репутация: 102
По умолчанию

Немного продвинулась дальше. Есть структура BALL ,которая хранит изображение, метод Dispay1 , который выводит изображение карты. Могли бы ли вы, мне подсказать, как при перемещении карты убрать это "домино" ,как на скрине, и каким образом можно удалить карту с начального места, с которого она была перемещена. Спасибо
Код:


#include "stdafx.h"
#include <stdlib.h>
#include "GL/glut.h"
#include "GL/glaux.h"
#include <math.h>
#include <vector>
#include <algorithm>
#include <ctime>

#define N 36
#pragma comment(lib, "GL/opengl32.lib")
#pragma comment(lib, "GL/glu32.lib")
#pragma comment(lib, "GL/glut32.lib")
#pragma comment(lib, "GL/glaux.lib")
using namespace std;
int w=1000, h=980;


AUX_RGBImageRec *MyImage;

//AUX_RGBImageRec **obj.cards1;


struct BALL {
	int x,y;
	AUX_RGBImageRec **cards1;
	void move ()
	{

	}
	void Draw()
	{
		//glRasterPos2d (x,y);
		//glDrawPixels (MyImage->sizeX, MyImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, MyImage->data);

		int x1=300,y1=830;
		glRasterPos2d (x1,y1); //50  0.5
		for(int i=0;i<4;i++)
		{
			obj.display1 (i,x1,y1);
	
		x1+=130;
		}
		x1=300;
		y1=790;
		for(int i=4;i<8;i++)
		{
			obj.display1 (i,x1,y1);
		
		x1+=130;
		}
		x1=300;
		y1=750;
		for(int i=8;i<12;i++)
		{
			obj.display1 (i,x1,y1);
	
		x1+=130;
		}
		x1=300;
		y1=580;
		for(int i=12;i<14;i++)
		{
			obj.display1 (i,x1,y1);
	
		x1+=390;
		}


		x1=300;
		y1=540;
		for(int i=14;i<16;i++)
		{
			obj.display1 (i,x1,y1);
	
		x1+=390;
		}

		x1=300;
		y1=500;
		for(int i=16;i<18;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=390;
		}


			x1=300;
		y1=330;
		for(int i=18;i<20;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=390;
		}


		
			x1=300;
		y1=290;
		for(int i=20;i<22;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=390;
		}
		
		x1=300;
		y1=250;
		for(int i=22;i<24;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=390;
		}


		x1=300;
		y1=80;
		for(int i=24;i<28;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=130;
		}

		x1=300;
		y1=40;
		for(int i=28;i<32;i++)
		{
		obj.display1 (i,x1,y1);

		x1+=130;
		}

			x1=300;
		y1=0;
		for(int i=32;i<36;i++)
		{
			obj.display1 (i,x1,y1);

		x1+=130;
		}


	}



	void display1 (int i,int x1,int y1)
{// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	  glRasterPos2d (x1,y1); 
	 	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
		
		glDrawPixels (obj.cards1[i]->sizeX, obj.cards1[i]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, obj.cards1[i]->data);
		
}


} ball,obj;



void DrawField()
{
	glColor3f(0.0,0.0,1.0);

}




void MouseMove(int ax,int ay)
 {
	 //x=ax;
	 //y=ay;
	

		//if(ax<=&& ay>=)
	 
	glutSetWindowTitle("MouseMove");
 }
bool mouseL;
 void MousePressed(int button, int state,int x,int y) //x y -координаты положения курсора
 {
	
	  switch(button)
    {
        case GLUT_LEFT_BUTTON:
            if(!mouseL) {printf("Leva9 knopka nazata\n"); mouseL=true;}
            else {printf("Leva9 knopka otpysena\nx=%i\ny=%i",x,y); 
			mouseL=false;
			obj.display1 (35,x,y);
			}
        break;
      
    }
 glutSetWindowTitle("MousePressed");
 }
 void MousePressedMove(int ax,int ay)
 {

	 	 glRasterPos2d (ax,ay); 
	 		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	//	glClear(GL_COLOR_BUFFER_BIT );

		glDrawPixels (obj.cards1[35]->sizeX, obj.cards1[35]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, obj.cards1[35]->data);
		


		

 glutSetWindowTitle("MousePressedMove");

 //obj.display1 (ax,ay,35);
 }






void display ()
{
 //glClear (GL_COLOR_BUFFER_BIT);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
obj.Draw();
//pl1.Draw();
//DrawField();

glFlush();
}

void timer (int = 0)
{
	display ();
	//Tick();
	//glutTimerFunc(50,timer,0);
}

int main (int argc, char **argv) {

	ball.x=ball.y=500;
	
	
	char mas[50][50]={"drawable/c6.bmp","drawable/c7.bmp","drawable/c8.bmp","drawable/c9.bmp","drawable/c10.bmp","drawable/c11.bmp",
	"drawable/c12.bmp","drawable/c13.bmp","drawable/c14.bmp",
	"drawable/d6.bmp","drawable/d7.bmp","drawable/d8.bmp","drawable/d9.bmp","drawable/d10.bmp","drawable/d11.bmp",
	"drawable/d12.bmp","drawable/d13.bmp","drawable/d14.bmp",
	"drawable/h6.bmp","drawable/h7.bmp","drawable/h8.bmp","drawable/h9.bmp","drawable/h10.bmp","drawable/h11.bmp",
	"drawable/h12.bmp","drawable/h13.bmp","drawable/h14.bmp",
	"drawable/s6.bmp","drawable/s7.bmp","drawable/s8.bmp","drawable/s9.bmp","drawable/s10.bmp","drawable/s11.bmp",
	"drawable/s12.bmp","drawable/s13.bmp","drawable/s14.bmp"
	};

	vector<int> x(N);

	for(int i=0;i<N;i++)
		x[i]=i;

	srand(unsigned(time(0)));
    random_shuffle(x.begin(), x.end()); // перемешиваеаем
	obj.cards1 = (AUX_RGBImageRec**) realloc((obj.cards1), ((N)+1)*sizeof(AUX_RGBImageRec*));

	for(int i=0;i<N;i++)
	{
		//obj.cards1[i]=auxDIBImageLoad("c6.bmp");
	obj.cards1[i]= auxDIBImageLoad(mas[x[i]] );
	}

	MyImage = auxDIBImageLoad ("c6.bmp");
 glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize (w, h);
     glutInitWindowPosition(100, 0);
    glutCreateWindow ("Game 1.0");
    glMatrixMode(GL_PROJECTION);
    glClearColor(0.0,0.57,0.0,1.0);
    glLoadIdentity();
    gluOrtho2D(0,w,0,h);
 
    glutDisplayFunc (display);
    glutTimerFunc (50,timer,0);
 
 
    glutMotionFunc(MousePressedMove);
    glutPassiveMotionFunc(MouseMove);
    glutMouseFunc(MousePressed);
 
    glutMainLoop();
	return 0;
}

Изображения
Тип файла: jpg 1.jpg (103.0 Кб, 0 просмотров)
Вероника99 вне форума   Ответить с цитированием
Старый 15.11.2016, 18:38   #7
8Observer8
Профессионал
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Адрес: Саратов
Сообщений: 3,069
Репутация: 832
По умолчанию

Могу подсказать, как убрать шлейф за картой. Нужно добавить перед перерисовкой объектов:
Код:

glClear(GL_COLOR_BUFFER_BIT);

8Observer8 вне форума   Ответить с цитированием
Старый 15.11.2016, 19:20   #8
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 374
Репутация: 102
По умолчанию

Добавила в эту функцию
Код:

void MousePressedMove(int ax,int ay)
 {
	 glClear(GL_COLOR_BUFFER_BIT);
	 	 glRasterPos2d (ax,ay); 
	 		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	//	glClear(GL_COLOR_BUFFER_BIT );


glDrawPixels (obj.cards1[35]->sizeX, obj.cards1[35]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, obj.cards1[35]->data);
	//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glutSetWindowTitle("MousePressedMove");

 //obj.display1 (ax,ay,35);
 }

Оно перемещает без шлейфа,но и удаляет все остальные карты, а как можно было бы сделать чтобы не удаляло карты?
Вероника99 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение объекта OpenGl bosyak Мультимедиа в Delphi 7 06.11.2015 06:38
Перемещение нарисованного объекта Mr.Dmitry Общие вопросы Delphi 22 09.10.2015 17:59
Передвижение объекта мышкой Яр|/||< (^_^) Qt и кроссплатформенное программирование С/С++ 3 26.06.2012 01:10
Естьли программа, определяющая класс объекта под мышкой? TwiX Win Api 4 01.08.2009 17:13




01:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru