Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Мышка


Автор: Kirgston 20.2.2009, 00:19
Ребята... вот собственно переношу проект с Делфи под С++ =) мне надо добится результата чтобы мышка ставала по центру, и плавно перемещалась в правый верхний угол... в Делфи код был такой:

Центрую мышку и...

Код

if (Screen.Width=1024) and (Screen.Height=768) then
 begin
  x_:=mouse.CursorPos.X+4;
  y_:=mouse.CursorPos.Y-3;
  SetCursorPos(x_ , y_ );
  if (mouse.CursorPos.X>=980) and (mouse.CursorPos.Y<=55) then
   begin


В результате мышка центруется и движется пока координаты не привысят допустимых... Это всё в таймере с интервалом 1

В С++ я это сделал так:

Код

if (Screen->Width==1024 && Screen->Height==768) {
     while (cur_pos.x<980 && cur_pos.y>55) {
     GetCursorPos(&cur_pos);
     cur_pos.x=cur_pos.x+4;
     cur_pos.y=cur_pos.y-3;
     SetCursorPos(cur_pos.x,cur_pos.y);
     }


Тоисть я запускаю цыкл с проверкой и каждый раз на координаты... после чего их увеличиваю... но у меня мышка центрируется и попадает потом практически в самый конец... и скачет по углам... Пробовал менять цыкл... без него... пробовал с слипами... ничего... этот код также вписал в таймер... но оно чтото не правильно работает... помогите пожалуйста smile 

Автор: Dmi3ev 20.2.2009, 00:40
вот мышка перемещается по экрану плавно по таймеру:
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int x=1;
static int y=1;
SetCursorPos(++y, ++x);
}


то же самое, только с условием:
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int x=1;
static int y=1;
if (x<10 && y<10)
 SetCursorPos(++y, ++x);
else
 {
  ShowMessage("position 10, 10");
  Timer1->Enabled=false;
 }
}

Автор: Kirgston 20.2.2009, 10:21
Спасибо большое уже справился =) итог могу сказать такой... по меньше играйтесь с GetCursorPos smile

Автор: Dem_max 20.2.2009, 10:33
Цитата

 по меньше играйтесь с GetCursorPos

что это значит  smile 

Автор: Kirgston 20.2.2009, 12:27
Ееее не знаю... почему то у меня туда как бы числа рендомом... вообщем как вы видете сверху код. Вроде всё правильно. Но мышка прыгала по углам. Как только я это всё перевел в 2 переменные и работал с переменными всё стало "как надо" =). Не знаю изза чего это... но факт есть факт )))))


Ребята. Вот у меня появилась проблемка... захотелось чтобы мышка при определенном событии какбы направлялась в центр экрана. Да я понимаю...
SetCursorPos(Screen->Width\2, Screen->Height\2) ;

Но мне хочется больше импровизации =) хочется заставить мышку плавно перемещаться в центр. Да я например знаю как переместить с одного угла в центр или другой угол. Но тут как бы не так... а если мышка будет возле центра сверху... да я знаю что это очень геморойно, но интересно! =) Помогите пожалуйста хоть какимито мыслями  smile 

Автор: Anikmar 20.2.2009, 13:52
И что особо сложного?
Вычисляем разницу: Текущая координата минус координата центра.
Эту разницу делим на желаемое кол-во шагов - получаем смещение
Дальше в цикле по кол-ву шагов прибавляем к текущей координате смещение

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

Забавно получится - дурак пользователь мышку двигает, а она упорно в центр сползает. Думаю очень обрадует такой наворот  smile 

Автор: Kirgston 20.2.2009, 15:12
Неа что то тут не то... а если текущая координата меньше координаты центра? ... то что?... тогда курсор уплывает в минус...

Автор: Anikmar 20.2.2009, 16:01
Цитата(Kirgston @  20.2.2009,  15:12 Найти цитируемый пост)
Неа что то тут не то... а если текущая координата меньше координаты центра? ... то что?... тогда курсор уплывает в минус... 

Тогда и смещение будет отрицательным само собой.

Добавлено через 3 минуты и 11 секунд
Беру пример на основе одной координаты. 
Допустим Х
Кол-во шагов 100

Текущая мыши 10
Центр 700
Разница координат = 700-10=690

Смещение = 690/100=6.9

В цикле 100 раз прибавляем к 10 6.9 - в итоге получим 700

Теперь с другой стороны
Текущая координата = 1100
Разница координат 700-1100 = -400
Смещение = -400/100 = -4

В цикле 100 раз прибавляем к 1100 -4 получаем те же 700

Математика однако.

Автор: Kirgston 20.2.2009, 16:25
Вот формула координат центра

SetCursorPos( ((Screen->Width/2)-x)+x, ((Screen->Height/2)-y)+y);

Как мне сделать теперь чтобы курсор бежал плавно? smile 

Автор: Anikmar 20.2.2009, 16:32
Чем мой вариант не подходит не пойму?!

Автор: Dmi3ev 20.2.2009, 16:41
Цитата

Как мне сделать теперь чтобы курсор бежал плавно? 

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

Автор: Kirgston 20.2.2009, 16:41
Извините просто не увидел вашего варианта. Щас попробую!

Автор: Anikmar 20.2.2009, 16:42
Цитата(Kirgston @  20.2.2009,  16:25 Найти цитируемый пост)
SetCursorPos( ((Screen->Width/2)-x)+x, ((Screen->Height/2)-y)+y);


Интересная формула.
А можно узнать зачем -х+х?

Автор: Kirgston 20.2.2009, 16:52
Еххххх ребята )))) не вьежаете вы ))))

Anikmar, тоже что и я сделал ))))) в итоге будет перемещение буквой Г. Сначала по Х, а потом по У. Уже также думал... надо заставить перемещатся одновременно... и учитывать что экран 4:3 делать просто инкремент или декремент нельзя...


Dmi3ev, также повторюсь =) нельзя. А если у меня курсор будет с правой стороны? Тогда надо отнимать. А если сверху? А если сбоку? А если рядом с центром? Простой инкремент тут не выход...  я уже думал над этим всем ))))) уже 6ой час сижу и думаю ))))

Автор: Anikmar 20.2.2009, 17:24
Цитата(Kirgston @  20.2.2009,  16:52 Найти цитируемый пост)
Еххххх ребята )))) не вьежаете вы ))))

Да мы тут просто, так... Это...  smile 

Код

    POINT CurPos;
    float x,y,dx,dy,xc,yc;
    int i;
    const int Count = 1000;

    Timer1->Enabled = false;

    xc = Screen->Width/2;
    yc = Screen->Height/2;

    i = Count;

    GetCursorPos(&CurPos);
    x = CurPos.x;
    y = CurPos.y;
    dx = (xc - x) / i;
    dy = (yc - y) / i;

    while (i-->0)
    {
        Sleep(1);
        x+=dx;
        y+=dy;
        SetCursorPos(x,y);
    }


Не знаю, где там буква Г

Автор: Kirgston 20.2.2009, 17:24
Ну ребят выручайте пожалуйста... чтото я наверно очень туплю... просто такая елементарщина .... а не могу решить... вот что сейчас получилось (не работает как надо)

int x,y,o_x,o_y;
o_x=cur_pos.x;
o_y=cur_pos.y;
x=((Screen->Width/2)-o_x);
y=((Screen->Height/2)-o_y);
x=x/100;
y=y/100;

SetCursorPos( (Screen->Width/2)-x, (Screen->Height/2)-y);

Заранее большое спасибо!

Добавлено через 3 минуты и 6 секунд
Цитата(Anikmar @ 20.2.2009,  17:24)
Цитата(Kirgston @  20.2.2009,  16:52 Найти цитируемый пост)
Еххххх ребята )))) не вьежаете вы ))))

Да мы тут просто, так... Это...  smile 

Код

    POINT CurPos;
    float x,y,dx,dy,xc,yc;
    int i;
    const int Count = 1000;

    Timer1->Enabled = false;

    xc = Screen->Width/2;
    yc = Screen->Height/2;

    i = Count;

    GetCursorPos(&CurPos);
    x = CurPos.x;
    y = CurPos.y;
    dx = (xc - x) / i;
    dy = (yc - y) / i;

    while (i-->0)
    {
        Sleep(1);
        x+=dx;
        y+=dy;
        SetCursorPos(x,y);
    }


Не знаю, где там буква Г

ОМГ! Да вы батюшка шайтан!!!  smile  поделитесь пожалуйста логикой  smile  как вы к этому пришли? БОЛЬШОЕ СПАСИБО!

Добавлено через 10 минут и 7 секунд
Кстати поделитесь пожалуйста что такое "-->" я его вообще впервые вижу .... чайник я одним словом smile 

Автор: Dmi3ev 20.2.2009, 17:48
i-- декремент
>0 условие

Автор: Anikmar 20.2.2009, 17:52
Цитата(Dmi3ev @  20.2.2009,  17:48 Найти цитируемый пост)
i-- декремент
>0 условие 

Ага

Цитата(Kirgston @  20.2.2009,  17:24 Найти цитируемый пост)
.... чайник я одним словом

Ну... есть немного...

Цитата(Kirgston @  20.2.2009,  16:52 Найти цитируемый пост)
Еххххх ребята )))) не вьежаете вы ))))

Ну...
 smile

Добавлено через 3 минуты и 43 секунды
Цитата(Kirgston @  20.2.2009,  17:24 Найти цитируемый пост)
ОМГ! Да вы батюшка шайтан!!!    поделитесь пожалуйста логикой    как вы к этому пришли? БОЛЬШОЕ СПАСИБО!


Логика эта изучалась в 90-х годах прошлого века, когда проходили товарища по фамилии Брезенхем (надеюсь не попутал в написании фамилии)... Там было грустнее - так как вольности типа float не проходили, да и программили мы на МК-ххх (такие калькуляторы были)...

А так - это обычная математика.

Автор: Kirgston 20.2.2009, 18:13
Аааааа это декремент И и проверка на больше нуля ... хе хе а я уж подумал это "-->" как бы... отдельная функция...

Да что тут говорить ... =) чайник я и всё )))) хоть и с детства увлекаюсь, но начал заниматься программированием только год назад... начал с Делфи, а щас как месяц назад (может чуток меньше перешел на С++ ) ... да и проблемки у меня с математикой. Не дружу я с ней =) вот вроде логику компютера понимаю отлично, а вот незнание математики иногда подбивает сильно...

А мы щас программим на MCS-51 ^_^ это ... не знаю... вроде до калькулятора дотягивает =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)