Заставить объекты следовать за мышью - PullRequest
0 голосов
/ 14 февраля 2012

Другие вопросы, близкие к этой теме, не очень помогают мне понять это. Я только начинаю программировать, используя Visual Studio и Direct2D, и у меня возникают проблемы с пониманием того, как сделать два "глаза", которые являются эллипсами внутри эллипсов, следовать за моей мышью.

Внутри функции void MainWindow::CalculateLayout() Я использую

    const float radius3=radius/4;
    const float radius3_2=radius/5;
    const float x3=x-100;
    const float y3=y-150;
    ellipse3 = D2D1::Ellipse(D2D1::Point2F(x3, y3), radius3, radius3_2);
        //left eye

    const float radius4=radius/4;
    const float radius4_2=radius/5;
    const float x4=x+100;
    const float y4=y-150;
    ellipse4 = D2D1::Ellipse(D2D1::Point2F(x4, y4), radius4, radius4_2);
        //right eye

    const float radius5=radius/8;
    const float radius5_2=radius5/2;
    const float x5=x-100;
    const float y5=y-150;
    ellipse5 = D2D1::Ellipse(D2D1::Point2F(x5, y5), radius5, radius5_2);    
    // left eyeball

    const float radius6=radius/8;
    const float radius6_2=radius6/2;
    const float x6=x+100;
    const float y6=y-150;
    ellipse6 = D2D1::Ellipse(D2D1::Point2F(x6, y6), radius6, radius6_2);    
    // right eyeball

, чтобы установить, где глаза и глазные яблоки. Я думаю, что что-то вроде this должно использоваться для контроля, где находится мышь. Я пытаюсь сделать это из пустого проекта, а не из формы. Является ли решение просто заменить const float x5=x-100 значением X MouseMove?

1 Ответ

0 голосов
/ 14 февраля 2012

Вам нужно заменить определение x5, но вам нужно сделать это с формулой, которая ограничит его пребывание в глазном яблоке.

Ваша формула будет выглядеть примерно так:

// compute the angle from the eyes to the mouse
angle = arctan( (mouseY - y) / (mouseX - x) );
// x-100 and y-150 are assumed to be the origins (center) of the eyeball
// eyeballRadius should be the radius of the eyeball, or slightly smaller (so the eyes do not extend outside of it)
x5 = (x-100) + cos(angle) * eyeballRadius;
y5 = (y-150) + sin(angle) * eyeballRadius;

Надеюсь, это поможет.

Чтобы получить эффект косоглазия, когда курсор находится очень близко, каждый глаз должен вычислять свой собственный угол, например, левый угол будет leftAngle = arctan( (mouseY - (y-150)) / (mouseX - (x-100)) )

...