2013-09-04 30 views
5

Tôi đang sử dụng SDL2 trên Windows (tôi đã thử nghiệm cả Windows 7 và Windows 8). Tôi đã chơi xung quanh với kết xuất một kết cấu bị khóa với các tọa độ chuột để tạo ra một loại hiệu ứng "crosshair".SDL2 hiển thị kết cấu rõ ràng nằm sau chuột

Nó hoạt động, nhưng kết cấu nhìn rõ ràng phía sau chuột tạo ra sự chậm trễ khó xử giữa chuyển động của chuột và các bản cập nhật được hiển thị. Thành thật mà nói, sự chậm trễ là rất nhỏ, nhưng để một người quan tâm về độ chính xác tuyệt đối, nó sẽ lái xe người điên.

Câu hỏi của tôi về cơ bản, điều này có bình thường không? Tôi đoán rằng sự chậm trễ là do thời gian cần để Windows cung cấp sự kiện cho SDL và sau đó SDL cung cấp sự kiện cho tôi. Làm thế nào có thể đạt được một hiệu ứng "crosshair" bị khóa thông qua SDL?

Mã của tôi để tham khảo:

#include "SDL.h" 

int main(int argc, char* args[]) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 

    SDL_Window* window = SDL_CreateWindow("SDL", 100, 100, 640, 480, SDL_WINDOW_SHOWN); 

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    SDL_Surface* surface = SDL_LoadBMP("mouse.bmp"); 

    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); 
    SDL_FreeSurface(surface); 

    bool isExiting = false; 
    int x = 0; 
    int y = 0; 

    while(!isExiting) 
    { 
     SDL_Event e; 
     while(SDL_PollEvent(&e)) 
     { 
      if(e.type == SDL_QUIT) 
      { 
       isExiting = true; 
       break; 
      } 
      else if(e.type == SDL_MOUSEMOTION) 
      { 
       x = e.motion.x; 
       y = e.motion.y; 
      } 
     } 

     SDL_Rect destRect; 
     destRect.h = 19; 
     destRect.w = 19; 
     destRect.x = x; 
     destRect.y = y; 

     SDL_RenderClear(renderer); 
     SDL_RenderCopy(renderer, texture, NULL, &destRect); 
     SDL_RenderPresent(renderer); 
    } 

    SDL_Quit(); 

    return 0; 
} 
+0

Bạn có bật [Windows compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows) không? Vòng lặp 'while' chính của bạn luôn mất ~ 16-17ms để thực thi? – genpfault

+0

@genpfault Tính năng tổng hợp được bật. Tôi sẽ kiểm tra khi bị vô hiệu hóa. Tôi đã không hẹn giờ vòng lặp nào, vì vậy tôi sẽ phải cố gắng đó là tốt. –

+0

'SDL_Surface' của bạn sẽ không được vẽ xung quanh vị trí chuột, thay đổi thành' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard

Trả lời

2

Trong khi tôi không thể chắc chắn lý do tại sao vòng lặp của bạn chậm, SDL đã hỗ trợ cho việc thay đổi bề mặt chuột, cũng như một số chức năng khác mà bạn có thể quan tâm đến Nó có vẻ như. bạn có thể đặt SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y) để sử dụng tốt. Đây là liên kết tới trang wiki hỗ trợ chuột: http://wiki.libsdl.org/CategoryMouse

Mã hóa vui vẻ!

0

Trong một dự án tôi đang làm việc trên, tôi làm điều gì đó như thế này:

(Bên ngoài vòng trò chơi chính):

SDL_Texture* cursor = //blah; 
SDL_Rect cursor_hitbox; 
SDL_QueryTexture(cursor, NULL, NULL, &cursor_hitbox.w, &cursor_hitbox.h); 

(Trong vòng trò chơi chính):

SDL_GetMouseState(&cursor_hitbox.x, &cursor_hitbox.y); 

Trong khi sử dụng, tôi chưa thực sự nhận thấy bất kỳ độ trễ đầu vào nào. Có lẽ đó chỉ là loại sự kiện?

Lưu ý rằng điều này rất có thể không hiệu quả, vì bạn sẽ nhận được trạng thái chuột trên mọi khung hình, thay vì chỉ khi bạn di chuyển chuột.

Các vấn đề liên quan