Имитирует движение окна и реагирует на столкновения - PullRequest
0 голосов
/ 01 июня 2009

Я читал эту тему и решил попробовать. К моему изумлению, это действительно казалось легче, чем то, что я делаю, я думаю. У меня есть некоторая путаница по поводу переменной "DesiredPos". Ну, по крайней мере, в моей реализации. Я пытаюсь постоянно перемещать окно и заставлять его реагировать как мяч, когда оно ударяется о края монитора. Понравился мяч в игре Понг. Я создал такие программы, которые двигают мышь, но я не могу разобраться с этой.

Это то, что я имею до сих пор, у меня ограниченный опыт, когда дело касается многих функций в Windows API. Имейте в виду, что это грубый черновик.

EDIT Я еще не реализовал обнаружение столкновений, но просто хотел, чтобы движущаяся часть работала.

#include <windows.h>
#include <math.h>

int newX(int oldx);
int newY(int oldy);
double SmoothMoveELX(double x);
int main()
{

    int lengthInMs = 10*1000;
    HWND notepad = FindWindow("Notepad",NULL);
    RECT window;
    SetTimer(
            notepad,
            NULL,
            30,
            (TIMERPROC)NULL
            );
    int startTime = GetTickCount();
    int pos = elap / lengthInMs;


    while(1)
    {
            RECT window;
            GetWindowRect(notepad,&window);
            int elap = (GetTickCount() - startTime);
            if(elap  >= lengthInMs)
            {
                  int NEWX = NewX(window.x);
                  int NEWY = NewY(window.y);
                  MoveWindow(
                             notepad,
                             NEWX,
                             NEWY,
                             100,
                             100,
                             TRUE
                             );  
                             }
                             }
} 

int NewX(int oldx)
{
    int newx = oldx*(1-SmoothMoveELX(pos))
             + 10 *SmoothMoveELX(pos));

    return newx;
}

int newY(int oldy)
{
    int newy = oldy*(1-SmoothMoveELX(pos))
             + 10 *SmoothMoveELX(pos));
    return newy;
}

double SmoothMoveELX(double x)
{
       double PI = Atan(1) * 4;
       return ((cos(1 - x) * PI + 1) /2 )
}

1 Ответ

1 голос
/ 01 июня 2009

Мой совет - взглянуть на «интеграцию верлетов». Это довольно простой способ симулировать базовую механику. Google для этого, и вы найдете много примеров, в том числе обнаружение столкновений и трения. В долгосрочной перспективе это даст вам более естественные результаты, чем оценка скорости или новой позиции с помощью функции синуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...