5

以下は、私が直面している問題を示す簡略化されたコードです。

このコードの目的は、512x512 のウィンドウを作成し、左クリックが検出されたときにそのトップ レベル サーフェスの Y 寸法を 512x(512+25) に変更することです。別の左クリックが検出されると、寸法を 512x512 に戻します。

左クリックイベントが検出された場合、または が検出された場合は、マウス座標mouseMotionEventを (とともに) 表示します。printf()

観察された奇妙な動作:

コードを実行すると、左クリックを 1 回すると、ウィンドウの Y 寸法が変わりますが、新しく作成された領域内でマウスを移動すると、表示される Y 座標が 511 のままになります。

ときどきこの奇妙な動作が得られないことがありますが、Y 座標が 511 より大きくなることがあります。この奇妙な動作を得るには、マウスを素早く動かしながら数回左クリックします。

コンパイルするには (Linux):

$ gcc -o test test.c `sdl-config --cflags --libs`

ソース: (test.c)

#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>

/* Prototypes */
void event_handler(void);

/* global variables declaration */
SDL_Surface *screen=NULL;


/***** MAIN FUNCTION *****/
int main(int argc, char** argv)
{   
    /* init SDL */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    if ((screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE )) == NULL) {
        fprintf(stderr, "Graphic mode could not be correctly initialized : %s\n",     SDL_GetError());
        exit(EXIT_FAILURE);
    }
    SDL_WM_SetCaption("my window", NULL);

    /* handle event & wait until quit_event is raised */
    event_handler();    

    /* quit & return */
    SDL_Quit();
    return EXIT_SUCCESS;
}


/*** Event handler ***/
void event_handler(void)
{
    SDL_Event event;
    int quit=0;
    char message_is_displayed=0;
    SDL_Rect mess_coord = {0,512,512,512+25}; //{x_start,y_start,width,height}

    while(!quit)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                quit = 1;
                break;

            case SDL_MOUSEBUTTONDOWN:
                if (event.button.button == SDL_BUTTON_LEFT)
                {
                    if(!message_is_displayed)
                    {
                        screen = SDL_SetVideoMode(512,512+25, 32, SDL_SWSURFACE); //change the screen size
                        SDL_FillRect(screen, &mess_coord, SDL_MapRGB(screen->format, 255, 255, 255));  // fill in white the bottom area 
                    }
                    else
                    {
                        screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE);
                    }
                    message_is_displayed = !message_is_displayed;
                    SDL_Flip(screen);
                }
                printf("mouse position: (%d,%d)\n",event.button.x, event.button.y);
                break;

            case SDL_MOUSEMOTION:
                printf("mouse position: (%d,%d)\n",event.motion.x, event.motion.y);
                break;
        }
    }
}
4

3 に答える 3

0

次の関数を試して、変数oldxおよびoldyのx座標とy座標を次のように取得できます。

int oldx,oldy;    
oldx=wherex();
oldy=wherey();

Windowsで動作します。

于 2012-10-15T17:15:36.823 に答える
0

SDL1 を使用している場合は、これをコードに追加する必要があると思います。

int x, y;
SDL_GetMouseState(&x, &y);

マウスの位置はxyです。

于 2015-05-12T12:54:58.093 に答える
0

マウス ボタンを押すとすぐにサイズが変更され、ボタンの位置が出力されます。ウィンドウがトリミングされた後にマウスの位置がトリミングされている可能性があります。

SDL_MOUSEBUTTONUP でのみウィンドウのサイズを変更してみてください。この方法では、マウスが実際にクリックされたときの現在の位置 (SDL_MOUSEBUTTONDOWN) を出力し、離した後にサイズを変更します。

于 2015-05-12T15:29:38.620 に答える