19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
1

Перемещение фигуры вслед за мышкой

23.06.2012, 23:17. Показов 3976. Ответов 4
Метки нет (Все метки)

Вечер добрый, форумчане! Пытаюсь сделать так, чтобы при нажатии кнопки мыши примитив двигался вслед за курсором. Собственно, так и происходит - один раз, при создании окна, после чего всё замирает. Что делать, как исправить?

Код:

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
#include "stdafx.h"
#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <glut.h>
#include <iostream>
 
using namespace std;
 
/* начальная ширина и высота окна */
GLfloat Width = 500.0, Height = 500.0;
float Angle=15.0;
bool where_to=0; 
//float x=x-(Width/2), y=y-(Height/2);
float x=0.0, y=0.0; 
 
 
/* эта функция управляет всем выводом на экран */
void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0,1.0,1.0);
    glPushMatrix();
    glBegin(GL_LINES);
    
    glVertex2f(x, y);
    glVertex2f(x, y+200);
    //glVertex2f(-200.0, 0.0);
    //glVertex2f(200.0, 0.0);
    glEnd();
    glPopMatrix();
    glFinish();
}
 
void Initial()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
//  glOrtho(-(Width/2), Width/2, -(Height/2), Height/2, -250, 250);
    glOrtho(0, Width, Height, 0, -250, 250);
    glMatrixMode(GL_MODELVIEW);
    
}
 
void Timer(int)
{
    if(where_to==1)
    --Angle;
    else ++Angle;
    glRotatef(Angle, 0.0, 0.0, 1.0);
 
    glutPostRedisplay();
    glutTimerFunc(50, Timer, 0);
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
    case 'a': Angle++;
        break;
    case 'd': Angle--;
        break;
            }
}
 
void Skeyboard(int key, int x, int y)
{
    switch(key)
    {
    case GLUT_KEY_RIGHT: where_to=1;
        break;
    case GLUT_KEY_LEFT: where_to=0;
        break;
    }
}
 
void MousePressedMove(int ax, int ay)
{
    x=ax;
    y=ay;
}
 
void MouseMove(int ax, int ay)
{
    
    x=ax;
    y=ay;
    /*glBegin(GL_POINTS);
    glVertex2f(x,y);
    glVertex2f(x,y);
    glEnd();*/
}
 
void MousePressed(int button, int state, int x, int y)
{
    x=x;
    y=y;
 
}
 
/* Главный цикл приложения */
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(Width, Height);
    glutCreateWindow("1st one");
 
    glutDisplayFunc(Display);
    //glutTimerFunc(50,Timer,0);
    Initial();
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(Skeyboard);
    glutPassiveMotionFunc(MouseMove);
    glutMotionFunc(MousePressedMove);
//    void glutSolidOctahedron (void);
//  void glutSolidOctahedron(); 
    glutMainLoop();
    
    
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2012, 23:17
Ответы с готовыми решениями:

Вращение объекта вслед за мышкой
Всем привет! Есть такое задание: надо сделать так, чтобы объект ( в моем случае космический...

Перемещение окна вслед за мышью, не за заголовок
#include&lt;Windows.h&gt; LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); HWND hWnd; char...

Перемещение изображения мышкой
Подскажите, возможно ли переместить изображение в место клика левой кнопки мышки? Если не сложно,с...

Перемещение объектов мышкой
Здравствуйте, наткнулся на статью http://javascript.ru/ui/draganddrop. Есть, ли аналогичная, но по...

4
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
23.06.2012, 23:35 2
А откуда приложение узнает, что надо всё перерисовать? glutPostRedisplay в соответствующих местах доставить стоит.
1
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
23.06.2012, 23:44  [ТС] 3
В видео-уроке как-то схожий код работал

glutPostRedisplay - в дисплей запихать?

Добавлено через 5 минут
А, всё, разобрался. Спасибо
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
24.06.2012, 20:15  [ТС] 4
Чтобы не создавать новой темы, публикую небольшой вопрос тут: каким образом фигуры обвести контуром?

Код:
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
#include "stdafx.h"
#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <glut.h>
 
using namespace std;
 
/* начальная ширина и высота окна */
GLfloat Width = 500.0, Height = 500.0;
float Angle=0.0;
bool where_to=FALSE;
bool rotate_=FALSE;
bool what=FALSE, what_b=FALSE, begin=FALSE;
 
float x=0.0, y=0.0; 
float Old_x=0.0, Old_y=0;
 
/* эта функция управляет всем выводом на экран */
void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST);
    glColor3f(1.0,1.0,1.0);
    if(begin==TRUE)//цикл условия начала отрисовки фигур
    {
    glPushMatrix();
 
    glRotatef(Angle,0.0,1.0,1.0);
    glTranslatef(x, y, 0.0);
    if(what_b==TRUE) glutSolidSphere(60.0, 20, 20);
    else glutWireSphere(60.0, 20, 20);
 
    glPopMatrix();
 
    glColor3f(1.0, 0.0, 0.0);
    glPushMatrix();
 
    glRotatef(Angle, 0.0, 1.0, 0.0);
 
    glTranslatef(x+110, y, 0.0);
    if(what==TRUE) glutSolidSphere(40.0, 20, 20);
    else glutWireSphere(40.0, 20, 20);
    glutWireTetrahedron();
 
    glPopMatrix();
    
    if(rotate_==TRUE){
        if(where_to==TRUE)Angle+=10.0;
        else Angle-=10.0;}
 
    /*glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_POINTS);
    glVertex2f(x, y);
    glEnd();*/
 
    glColor3f(1.0, 1.0, 0.0);
 
    glPushMatrix();
    glRotatef(Angle,0.0,1.0,1.0);
    glBegin(GL_TRIANGLE_STRIP);
    glVertex3f(-110.0, 0.0, 50.0);
    glVertex3f(-160.0, 0.0, 50.0);
    glVertex3f(-135.0, -80.0, 0.0);
    glVertex3f(-110.0, 0.0, -50.0);
    glVertex3f(-160.0, 0.0, -50.0);
    glEnd();
    glBegin(GL_TRIANGLES);
    glVertex3f(-160.0, 0.0, -50.0);
    glVertex3f(-135.0, -80.0, 0.0);
    glVertex3f(-160.0, 0.0, 50.0);
 
    glVertex3f(-160.0, 0.0, 50.0);
    glVertex3f(-110.0, 0.0, 50.0);
    glVertex3f(-160.0, 0.0, -50.0);
 
    glVertex3f(-160.0, 0.0, -50.0);
    glVertex3f(-110.0, 0.0, 50.0);
    glVertex3f(-110.0, 0.0, -50.0);
    glEnd();
 
    glPopMatrix();
    }
    glFinish();
}
 
void Initial()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-Width/2, Width/2, +(Height/2), -(Height/2), -250, 250);
    glMatrixMode(GL_MODELVIEW);
}
 
void Timer(int)
{
    glutPostRedisplay();
    glutTimerFunc(50, Timer, 0);
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
    case 'z': rotate_=1;
        break;
    case 'x': rotate_=0;
        break;
    case '1': {what=1; what_b=1;}
        break;
    case '2': {what=0; what_b=0;}
        break;
    }
    #define ESCAPE '\033'
    if( key == ESCAPE ) exit(0);
}
 
void Skeyboard(int key, int x, int y)
{
    switch(key)
    {
    case GLUT_KEY_RIGHT: where_to=0;
        break;
    case GLUT_KEY_LEFT: where_to=1;
        break;
    case GLUT_KEY_UP: rotate_=1;
        break;
    case GLUT_KEY_DOWN: rotate_=0;
        break;
    }
}
 
void MousePressedMove(int ax, int ay)
{
    if(GLUT_LEFT_BUTTON){
    x=ax-Width/2;
    y=ay-Height/2;}
    
    if(GLUT_RIGHT_BUTTON){
    x=ax-Old_x;
    y=ay-Old_y;}
 
    rotate_=0;
    begin=1; 
    glutPostRedisplay();
}
 
void MousePressed(int button, int state, int x, int y)
{
    Old_x=x;
    Old_y=y;
    switch (state)
    { 
    case GLUT_UP: rotate_=1; 
        break;
    case GLUT_DOWN: {rotate_=0; begin=1;}
        break;
    }
    glutPostRedisplay();
}
 
/* Главный цикл приложения */
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(Width, Height);
    glutCreateWindow("1st one");
    glutDisplayFunc(Display);
    
    Initial();
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(Skeyboard);
    glutMotionFunc(MousePressedMove);
    glutMouseFunc(MousePressed);
    glutTimerFunc(50,Timer,0);
    glutMainLoop();
}
Миниатюры
Перемещение фигуры вслед за мышкой  
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
24.06.2012, 23:43 5
Пожалуй, только через шейдеры.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2012, 23:43
Помогаю со студенческими работами здесь

Перемещение JLabel мышкой
Доброго времени суток! Подскажите как в Swing сделать JLabel которую можно перетаскивать мышкой?...

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

Перемещение с image мышкой
Как например если навести на image мышью,и жать левую кнопку мыши,и чтоб он перемещался за...

Перемещение изображения мышкой
Добрый день, нужно реализовать перемещение изображения по метке. Метка(Label) меньше изображения,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru