let () = Random.self_init () module Map = struct type background = | Grass | Water | Black let width = 1000 let height = 1000 let player_pos = ref (20, 3) let m = Array.init width (fun _x -> Array.init height (fun _y -> if Random.int 1000 <= 42 then Water else Grass ) ) let get_tile_kind ~x ~y = try m.(x).(y) with Invalid_argument _ -> Black end let tile_size = 40 let width = 835 let height = 635 let canvas = Jv.get Jv.global "canvas" let context = Jv.call canvas "getContext" [| Jv.of_string "2d" |] let init_bg () = Jv.set canvas "width" (Jv.of_int width); Jv.set canvas "height" (Jv.of_int height); Jv.set context "fillStyle" (Jv.of_string "#FF1188"); Jv.call context "fillRect" [| Jv.of_int 0; Jv.of_int 0; Jv.of_int width; Jv.of_int height |] let window = Jv.get Jv.global "window" let () = let (_ : Jv.t) = Jv.call window "addEventListener" [| Jv.of_string "load"; Jv.repr init_bg |] in () let tiles_per_w = width / tile_size let tiles_per_h = height / tile_size let orig_x = (width - (tiles_per_w * tile_size)) / 2 let orig_y = (height - (tiles_per_h * tile_size)) / 2 let grass = Jv.get Jv.global "grass" let papy_bottom = Jv.get Jv.global "papy_bottom" let water = Jv.get Jv.global "water" let draw_map () = let player_x, player_y = !Map.player_pos in Format.printf "player_x = %d@\nplayer_y = %d@\n" player_x player_y; for x = 0 to tiles_per_w - 1 do let mapx = x + player_x - (tiles_per_w / 2) in for y = 0 to tiles_per_h - 1 do let mapy = y + player_y - (tiles_per_h / 2) in let img = match Map.get_tile_kind ~x:mapx ~y:mapy with | Grass -> grass | Water -> water | Black -> water in let (_ : Jv.t) = Jv.call context "drawImage" [| img ; Jv.of_int (orig_x + (x * tile_size)) ; Jv.of_int (orig_y + (y * tile_size)) |] in () done done; let (_ : Jv.t) = Jv.call context "drawImage" [| papy_bottom; Jv.of_int (width / 2); Jv.of_int (height / 2) |] in () let () = let (_ : Jv.t) = Jv.call window "addEventListener" [| Jv.of_string "load"; Jv.repr draw_map |] in () let kb_handler e = let x, y = !Map.player_pos in let x, y = match Jv.to_string @@ Jv.get e "key" with | "z" -> (x, y - 1) | "q" -> (x - 1, y) | "s" -> (x, y + 1) | "d" -> (x + 1, y) | _s -> (x, y) in let x = max 0 x in let x = min (Map.width - 1) x in let y = max 0 y in let y = min (Map.height - 1) y in Map.player_pos := (x, y); draw_map () let bind_keys () = Jv.call window "addEventListener" [| Jv.of_string "keydown"; Jv.repr kb_handler |] let () = let (_ : Jv.t) = Jv.call window "addEventListener" [| Jv.of_string "load"; Jv.repr bind_keys |] in () (* let draw_background () = for x = 0 to tiles_per_w - 1 do for y = 0 to tiles_per_h - 1 do let (_ : Jv.t) = Jv.call context "drawImage" [| grass ; Jv.of_int (orig_x + (x * tile_size)) ; Jv.of_int (orig_y + (y * tile_size)) |] in () done done let () = let (_ : Jv.t) = Jv.call window "addEventListener" [| Jv.of_string "load"; Jv.repr draw_background |] in () let draw_papy () = let (_ : Jv.t) = Jv.call context "drawImage" [| papy_bottom ; Jv.of_int ((width / 2) - (tile_size / 2)) ; Jv.of_int ((height / 2) - (tile_size / 2)) |] in () let () = let (_ : Jv.t) = Jv.call window "addEventListener" [| Jv.of_string "load"; Jv.repr draw_papy |] in () *)