I'm working on a breakout game and i want the paddle to follow the mouse
It works from the left side of the client area to the far right of the screen but when i go over the left side of the client area, i expected it to return a negative value and the paddle keeps moving left but instead, i get some coordinate like (32070, 32389) and it goes right

i tried adding m.x < 5000 but for some reason, that doesn't work

Heres the function that moves the paddle and the function i use to get the mouse inputs

void C_Paddle::Paddle_Movement()
{
    POINT m = Input.Get_Mouse();
    RECT ClientRect;
    GetClientRect(g_hwnd, &ClientRect);

    if ((Paddle_Rect.left + Paddle_Size/2) < m.x)
    {
        Paddle_Rect.left++;
        Paddle_Rect.right = Paddle_Rect.left + Paddle_Size;
    }
    if ((Paddle_Rect.left + Paddle_Size/2) > m.x)
    {
        Paddle_Rect.left--;
        Paddle_Rect.right = Paddle_Rect.left + Paddle_Size;
    }
}
void C_Input::Set_Mouse()
{
    GetCursorPos(&Mouse);
    ScreenToClient(g_hwnd, &Mouse);
}

POINT Get_Mouse() { return Mouse; }

Set_Mouse is constantly called in the main loop, would it be better practice to only call it from the wndproc?

Recommended Answers

All 6 Replies

It seems that you're using an unsigned integer to represent your coordinates. When you decrement an unsigned integer, such as 0, instead of getting -1, you get the highest possible value the integer can represent.

In fact, if you're getting 32 thousand, you're probably getting errors related to the comparison of integers -- you're probably representing your paddle coordinates with unsigned integers while your mouse coordinates are signed, or maybe the other way around. I'm guessing your paddle coordinates are rolling over from 0 to 65535 and then getting decremented 32 thousand times ... or something like that.

well, accorind to msdn, it's a LONG

typedef struct tagPOINT
{
    LONG   x;
    LONG   y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

Then that's not the case, since RECT and POINT both use LONGs. Maybe you should look closely at the behavior of Get_Mouse() and see what it outputs.

i didn't see the second half of ur post...

the paddle's coordinates are stored in the RECT structure so it's also signed

i made some changes to the code. The if statements are giving me errors now telling me that i'm comparing signed integers to unsigned. could that be part of the problem?

void C_Paddle::Paddle_Movement()
{
    POINT m = Input.Get_Mouse();
    RECT ClientRect;
    GetClientRect(g_hwnd, &ClientRect);

    if ((unsigned int)(Paddle_Rect.left + Paddle_Size/2) < m.x && 
        Paddle_Rect.left > ClientRect.left) //move right
    {
        Paddle_Rect.left++;
        Paddle_Rect.right = Paddle_Rect.left + Paddle_Size;
    }
    if ((unsigned int)(Paddle_Rect.left + Paddle_Size/2) > m.x && 
        Paddle_Rect.right < ClientRect.right) //move left
    {
        Paddle_Rect.left--;
        Paddle_Rect.right = Paddle_Rect.left + Paddle_Size;
    }
}

nvm, took the (unsigned int) out
idk why it gave me errors in the first place


[edit]aaaaah, and im comparing the wrong... variables

alright, i found out why this was happening
Paddle_Size is an UINT
i ghanged it to an int and its working properly now

thanks rashakil

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.