OcamlSDL中用颜色填充矩形的问题

OcamlSDL中用颜色填充矩形的问题,ocaml,sdl,Ocaml,Sdl,我试图在OcamlSDL中的窗口中心显示一个彩色正方形。为正方形创建曲面和矩形,并在屏幕上的正确位置对其进行点选,这是毫无问题的,但是当我尝试为矩形着色时,只有部分矩形被着色(如图所示) 这是我的密码: open Sdlevent open Sdlkey open Sdlvideo let image_src = "background.jpg" let win_x = 1200 let win_y = 800 let side = 10 let sq_size = 40 let seps =

我试图在OcamlSDL中的窗口中心显示一个彩色正方形。为正方形创建曲面和矩形,并在屏幕上的正确位置对其进行点选,这是毫无问题的,但是当我尝试为矩形着色时,只有部分矩形被着色(如图所示)

这是我的密码:

open Sdlevent
open Sdlkey
open Sdlvideo

let image_src = "background.jpg"
let win_x = 1200
let win_y = 800
let side = 10
let sq_size = 40
let seps = 10
let board_side = side * sq_size + seps * side
let o_x = (win_x - board_side) / 2
let o_y = (win_y - board_side) / 2
let f_x = o_x + board_side
let f_y = o_y + board_side

let rec event_handler () = match wait_event () with
    | KEYDOWN {keysym=KEY_ESCAPE} -> ()
    | event -> event_handler ()

let main () =
    Sdl.init [`VIDEO];
    at_exit Sdl.quit;
    let screen = Sdlvideo.set_video_mode win_x win_y [] in
    let bg = Sdlloader.load_image image_src in
    let pos_bg = Sdlvideo.rect 0 0 win_x win_y in
    Sdlvideo.blit_surface ~dst_rect:pos_bg ~src:bg ~dst:screen ();
    Printf.printf "board side = %d, o_x = %d, o_y = %d, f_x = %d, f_y = %d\n" board_side o_x o_y f_x f_y ;
    let board = Sdlvideo.create_RGB_surface [`HWSURFACE] board_side board_side 32 (Int32.of_int 0) (Int32.of_int 0) (Int32.of_int 0) (Int32.of_int 0) in
    let pos_board = Sdlvideo.rect o_x o_y f_x f_y in
    Sdlvideo.fill_rect ~rect:pos_board board (Int32.of_int 4294967295) ;
    Sdlvideo.blit_surface ~dst_rect:pos_board ~src:board ~dst:screen () ;
    Sdlvideo.flip screen;
    event_handler ()

let _ = main ()
我环顾四周,没有发现任何与我类似的案例,OcamlSDL的文档也没有帮助。
我觉得我错过了一些明显的东西,但我不知道是什么。有什么建议吗?这是在Ubuntu 14.04 64位上。

仔细看下面的两行:

Sdlvideo.fill_rect ~rect:pos_board board (Int32.of_int 4294967295) ;
Sdlvideo.blit_surface ~dst_rect:pos_board ~src:board ~dst:screen () ;
您正在板中填充一个矩形,从左上边缘偏移pos_板。所以只有一部分木板是白色的。现在你的棋盘是一个带白色角的黑色矩形

然后,再次使用pos_板的偏移量,将板点到屏幕上。在屏幕中间,白色的角落变成黑色的角落。正如截图所示


如果您希望整个电路板为白色,则必须使用(0,0)作为左上角。电路板中的坐标是相对的。

我不知道Ocaml,但这里有几点需要注意:当您创建矩形(RGB曲面)时,您将Alpha通道设置为0。它应该是1,以便完全可见。另一件事,fill_rect函数的作用是,将一个硬编码的巨大数字作为参数传递。它应该做什么?创建RGB曲面时使用的颜色组件遮罩似乎“向后”工作:将alpha遮罩设置为Int32的可能高值使曲面完全透明。至于fill_rect()函数,它采用Int32(在ocaml中是一种特定类型)作为颜色。我不确定这个整数将如何在“引擎盖下”使用,所以我指定了可能得到白色的高值(因为我假设它遵循RGBA颜色格式)。我已经有几年没有看过这段代码了,但看起来你是对的。我会尽快测试并接受你的答案。