2011-12-30 18 views
5

Gần đây, chúng tôi đã chuyển Bitfighter từ GLUT đến SDL. Có rất nhiều lợi ích để làm điều này, nhưng cũng có một vài nhược điểm, đặc biệt là trong lĩnh vực quản lý cửa sổ.Xử lý các cửa sổ tối đa bằng SDL

Công cụ bitfighter chạy trong cửa sổ tỷ lệ khung hình cố định (800x600 pixel). Người dùng có thể làm cho cửa sổ của họ có kích thước bất kỳ mà họ muốn, nhưng chúng tôi nắm bắt sự kiện thay đổi kích thước và điều chỉnh kích thước được yêu cầu để đảm bảo cửa sổ giữ tỷ lệ chính xác (sử dụng SDL_SetVideoMode).

(Vấn đề sau đây áp dụng cho Windows, nhưng vẫn chưa được thử nghiệm trên các nền tảng khác. Những gì tôi mô tả dưới đây đề cập cụ thể đến Windows, mặc dù tôi đang tìm kiếm một giải pháp nền tảng độc lập.)

Thông thường, điều này hoạt động tốt, ngoại trừ khi người dùng phóng to cửa sổ của họ bằng cách nhấp đúp vào thanh tiêu đề hoặc sử dụng nút phóng to. Trong trường hợp đó, sự kiện thay đổi kích thước cửa sổ được gọi với kích thước cửa sổ xấp xỉ kích thước màn hình (trừ một số pixel cho trang trí cửa sổ). Thật không may, khi cửa sổ được phóng to, SDL_SetVideoMode không có hiệu lực (không giống như GLUT có thể thay đổi kích thước cửa sổ tối đa). Hơn nữa, các cuộc gọi tiếp theo tới SDL_GetVideoInfo báo cáo kích thước chúng tôi đã yêu cầu, không phải kích thước thực tế hiện tại của cửa sổ, do đó rất khó để biết liệu kích thước đã thay đổi có hiệu quả hay không.

Tôi đang tìm kiếm một cách nền tảng độc lập để làm bất cứ điều nào sau đây (theo thứ tự ưu tiên giảm dần):

  1. Thay đổi kích thước cửa sổ sau khi nó được tối đa
  2. Detect khi một cửa sổ đã được tối đa để rằng, biết rằng tôi không thể thay đổi kích thước, ít nhất tôi có thể điều chỉnh video thành trung tâm
  3. Ngăn cửa sổ tối đa hóa (chặn nhấp đúp vào thanh tiêu đề cửa sổ, sử dụng nút phóng to và kéo cửa sổ đến đầu màn hình)

Bitfighter được viết bằng C++ và chúng tôi đang sử dụng bản phát hành chính thức mới nhất của SDL.

+0

Bạn đang ở vị trí để thử HEAD SDL 1.3? – genpfault

+0

Chúng tôi có thể; tùy thuộc vào độ ổn định của nó. Chúng tôi hy vọng sẽ phát hành trong một vài tuần. – Watusimoto

+1

Xem qua mã của bạn, có vẻ như bạn đã di chuyển sang SDL 2.0. Điều này có khắc phục được sự cố của bạn không? – faffy

Trả lời

0

Tôi giả định rằng bạn sử dụng OpenGL với SDL, vì bạn đã sử dụng GLUT trước đây. Tôi không biết bất kỳ giải pháp nào cho vấn đề đó, điểm exept 2. Nếu bạn muốn Video có kích thước cụ thể, chỉ cần rời khỏi SDL-Window như vậy và gọi

glViewport(0, 0, width, height); 

với kích thước phù hợp với tỷ lệ đúng. Với các giải pháp đó, bạn vẫn sẽ có đường viền màu đen trong cửa sổ của mình, nhưng nó chỉ hiển thị nhiều như bạn muốn. (Với 2 đối số đầu tiên mà bạn cũng có thể thiết lập vị trí của các Viewport trong cửa sổ;))

1

Di chuyển đến SDL 2.0 (mà có vẻ như bạn đã có)

SDL 2.0 cung cấp một API tốt hơn để quản lý cửa sổ (nó thực sự cung cấp một). Trong khi vẫn còn nhiều lỗi trong quản lý Windows trong SDL 2.0 (đặc biệt là ở phía Linux), nó đã được cải thiện rất nhiều kể từ 1.2 ngày.