Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
1

Перемещение объекта мышкой

09.11.2016, 22:45. Просмотров 1515. Ответов 31
Метки нет (Все метки)

Добрый вечер. Начала изучать OpenGL при выполнении задания - сделать пасьянс. В программе просто должны выводиться карты как в пасьянсе и перемещаться по нажатию мышки в одну из 4 колод. Если с выводом изображений карт +- понятно, то с перемещением ничего не понятно. Для начала открыла урок, в котором происходит просто перемещение объекта за мышкой. Сразу же возник следующий вопрос:
1. Как одно изображение карты из массива изображений карт-сделать объектом, который будет перемещаться вслед за мышкой и оставаться на том месте, "куда мышь привела этот объект".
Код
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
#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;
}
В коде объект следует за мышкой, но по новому нажатию на мышку не фиксирует свое положение,а "перемещается дальше за мышкой". Мне нужно,чтобы по клацанью мыши объект оставался на месте, в которое я его переместила (как в обычной игре в карты). Пока не пробовала выводить карты, так как вдруг ошибаюсь и надо будет работать не с массивом изображений, а как-то по-другому это преподать. Прошу помочь разобраться с моим заданием. Благодарю.

Добавлено через 1 час 38 минут
Не подскажите?(

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2016, 22:45
Ответы с готовыми решениями:

Выделение и перемещение объектов мышкой
Доброго времени суток! Интересует вопрос выделения объектов мышкой и...

Перемещение фигуры вслед за мышкой
Вечер добрый, форумчане! Пытаюсь сделать так, чтобы при нажатии кнопки мыши...

Отрисовка линии мышкой поверх 3д объекта
Добрый вечер всем. Много чего перепробовал, но что-то ничего не помогло....

Перемещение 2 d объекта
Помогите пожалуйста. Могу нарисовать несколько треугольников в различных...

Перемещение объекта
Есть код осуществляющий поворот объектов из 3дмакса по имени:...

31
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
10.11.2016, 10:47 2
Вероника99, очевидно что при нажатии на кнопку мыши нужно запоминать объект который мы захватили, при перемещении мышки и наличии захваченного объекта менять его координаты, а при отпускании кнопки мыши "забывать" объект
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
10.11.2016, 12:54  [ТС] 3
Т.е. следует создать массив структур,который хранил бы координаты объекта и само изображение карты? И в функции void
C++
1
2
MousePressed(int button, int state,int x,int y)
 { }
подставлять полученные координаты в поля структуры и в ней же выводить изображение с помощью LoadImage?
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
10.11.2016, 14:11 4
Вероника99, я в ваш код не вчитывался, вы уж извините, но общий подход один и тот же:
1 у вас где-то как-то хранится объект и где-то есть какая-то функция которая может его нарисовать
2 у этого объекта по-нормальному есть локальное начало координат (точка вставки) относительно которой указаны координаты вершин представляющих объект, углы поворота приводящие локальную систему координат в соответствие с общей и, возможно, признаки необходимости отражения по осям
3 перед рисованием объекта вызываются в нужном количестве переносы, вращения и отражения отвечающие за положение нашего объекта
4 меняя точку вставки, углы и отражения можно добиться видимости движения объекта
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
14.11.2016, 17:02  [ТС] 5
Спасибо за ответ. Пока есть структура , которая хранит информацию про карты, вывод карт на экран и попытка как-то переместить хотя бы одну карту. Хочу сперва разобраться с перемещением одной карты.
Кликните здесь для просмотра всего текста

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
147
148
149
150
151
152
153
154
155
156
157
158
159
#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).Подскажите пожалуйста, как правильно сделать так,чтобы после такого перемещения, карта выводилась в месте,куда указал курсор? Сейчас при отпускании мыши, "двигающаяся" карта исчезает. Спасибо
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 10:04 6
Вероника99, как я понял вы берете одну из карт и принудительно рисуете ее в координатах мыши. создайте в начале объект ОДНОЙ карты с координатами которые вы будете менять и с методом рисования который вы будете вызывать что в процедуре рисования всего пасьянса что в процедуре перетаскивания
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 16:04  [ТС] 7
Сделала все как Вы написали, создала структурную переменную obj, функцию display1 также поместила в структуру
Кликните здесь для просмотра всего текста

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
#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+=390;
        }
 
        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)
{
      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);
        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);
 
ball.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;
}


На данном этапе при вызове функции display1 в MousePressed, появляется карта на месте щелчка курсора, а если еще display1 вызывать в MousePressedMove, то выводится n-кол-во карт,которое следует за нажатым курсором. Могли бы ли Вы подсказать какое нужно произвести действие,чтобы карта удалялась в месте,с которого ее сместили и чтобы не было этого "домино" вслед за курсором. Спасибо
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 16:24 8
Вероника99, обычно перед каждым рисованием сцены идет очистка через
C++
1
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Добавлено через 1 минуту
то есть:
1 очищаем сцену
2 настраиваем что-то там свое вроде матрицы проекции
3 рисуем сцену для чего вызываем функции рисования каждого объекта

Добавлено через 55 секунд
и так каждый кадр
если у какого то из объектов меняются координаты мы конечно же увидим это как результат рисования

Добавлено через 2 минуты
только в вашем коде эти изменения нигде не фиксируются - нужно что бы были поля объекта в которые вы пишете те самые x1 y1 а объект уже сам себя будет рисовать
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 16:35  [ТС] 9
А куда это вписать? В display1?
Если да,то происходит аварийное завершение...Как поступить?

Добавлено через 9 минут
Цитата Сообщение от vxg Посмотреть сообщение
в которые вы пишете те самые x1 y1
А как же вот эти поля?Они не подходят?
C++
1
2
3
struct BALL {
    int x,y;
    AUX_RGBImageRec **cards1;...}
А куда вставить эту функцию очистки сцены?В display1 происходит аварийное завершение и почти ничего не выводится,т.е карты тут же исчезают
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 16:36 10
Вероника99, у вас только одно место где идет вызов glClear - это display (без 1)

Добавлено через 1 минуту
Вероника99, как я понял BALL это все поле пасьянса которое отвечает за вывод всего расклада и x y задают просто начало поля. могу быть не прав, глубоко не копал
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 16:40  [ТС] 11
Сделала так:
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
 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);
        [B] glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);[/B]
 
        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);
 }
Теперь карта нормально перемещается вслед за курсором,но при этом исчезают все остальные карты. Можно ли как-то ,сделать так чтобы glClearдействовало только на одну карту?
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 16:42 12
Вероника99, я не просто так написал фразу "рисуем ВСЮ сцену" - то есть еще раз
1 делаем очистку
2 рисуем ВСЕ - и те карты которые лежат и ту которую двигаем. причем процедуре рисования будет все равно кто из них кто ибо у каждой карты будут координаты и процедура рисования просто изобразит все карты. то что координаты одной из карт будут двигаться вслед за движением мышки - это наша тайна)
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 16:51  [ТС] 13
1. Очистка есть:
C++
1
2
3
4
5
6
void display ()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ball.Draw();
glFlush();
}
2. Рисование:
C++
1
2
3
4
5
6
    void display1 (int i,int x1,int y1)
{
      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);       
}
Вроде все так как Вы пишите)На скрине показано,что сейчас происходит.
Цитата Сообщение от vxg Посмотреть сообщение
Вероника99, как я понял BALL это все поле пасьянса которое отвечает за вывод всего расклада и x y задают просто начало поля. могу быть не прав, глубоко не копал
Структура BALL хранит информацию про координаты карты и ее изображение, я думала,что за счет этих полей и можно менять координаты карт
0
Миниатюры
Перемещение объекта мышкой  
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 17:06 14
Вероника99, очистка которую вы добавили снесет все изображение и домино должно пройти, попробуйте как еще разок
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 17:15  [ТС] 15
Оно сносит все изображения и нормально двигается за мышкой без домино, в таком случае:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 void MousePressedMove(int ax,int ay)
 {
 
         glRasterPos2d (ax,ay); 
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    //  glClear(GL_COLOR_BUFFER_BIT );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_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);
 }
Т.е я очистку сделала в функции мыши, но мне такое не подходит. Нужно чтобы просто карта передвигалась и при этом все остальные карты оставались на своих местах, кроме взятой
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 18:34 16
Вероника99, в маусмув меняйте координаты одной карты и посылайте редисплей - это приведёт к вызову дисплей функции которая очистит экран и выведет все карты включая ту которую вы тянете
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 19:41  [ТС] 17
Под редисплеем вы это имели в виду?
C++
1
2
3
4
5
6
7
8
9
10
void MouseMove(int ax,int ay)
 {
     obj.x=ax;
    obj.y=ay;
    
    glutDisplayFunc (display);
        //if(ax<=&& ay>=)
    
    glutSetWindowTitle("MouseMove");
 }
0
8Observer8
2319 / 1479 / 245
Регистрация: 05.10.2013
Сообщений: 4,611
Записей в блоге: 58
15.11.2016, 20:08 18
Смысл в том, что логика кода должна быть такой, чтобы после изменения координат хотя бы одного объекта, нужно стирать все объекты и рисовать их заново.

Когда вы в MouseMove изменили координаты карты нужно первым делом стереть всё вызовом:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
И только потом нарисовать все объекты заново и вашу перемещённую карту.
0
Вероника99
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 461
15.11.2016, 20:24  [ТС] 19
Спасибо за ответ. Логику поняла, хорошо бы еще это все закодить.
Для эксперимента сделала таким образом:
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
void MouseMove(int ax,int 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)
 {
    // glClear(GL_COLOR_BUFFER_BIT);
         glRasterPos2d (ax,ay); 
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    //  glClear(GL_COLOR_BUFFER_BIT );
 
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     obj.x=ax;
    obj.y=ay;
    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);
    display();
    //glutDisplayFunc (display);
 
 glutSetWindowTitle("MousePressedMove");
 
 //obj.display1 (ax,ay,35);
 }
Сейчас при нажатии на мышку карта следует за курсором, при отпускании карта остается на месте,куда ее переместили, нету "домино", но все изображения жутко мигают, видимо из-за постоянной перерисовки. Возможно надо что-то исправить?
0
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,002
15.11.2016, 20:25 20
Вероника99, нет редисплей это именно он и есть) полистайте архив Библиотека графических примитивов. Отдаю всем хорошим людям - не жалко там по-моему есть
0
15.11.2016, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2016, 20:25

Перемещение объекта
Наверное совсем глупый вопрос, но всё же. Имеется двумерный объект и прямая....

Вращение и перемещение объекта
Здравствуйте! Помогите разобраться с проблемой. Суть программы: Есть 3D...

Перемещение объекта мышью
Вот уже облазил весь форум, а понять причину не могу... При нажатии и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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