clean map
This commit is contained in:
parent
91cff202f6
commit
753a50bf85
3 changed files with 46 additions and 45 deletions
|
|
@ -51,16 +51,11 @@ let papy_up = C2d.image_src_of_el (get_el "papy_up")
|
||||||
|
|
||||||
let water = C2d.image_src_of_el (get_el "water")
|
let water = C2d.image_src_of_el (get_el "water")
|
||||||
|
|
||||||
let map =
|
|
||||||
(* TODO receive map / state *)
|
|
||||||
(* dummy map; should ask for map to server *)
|
|
||||||
ref (Map.init ())
|
|
||||||
|
|
||||||
let draw_map =
|
let draw_map =
|
||||||
let papy_x = float_of_int (width - tile_size) /. 2. in
|
let papy_x = float_of_int (width - tile_size) /. 2. in
|
||||||
let papy_y = (float_of_int height /. 2.) -. (float_of_int tile_size *. 1.5) in
|
let papy_y = (float_of_int height /. 2.) -. (float_of_int tile_size *. 1.5) in
|
||||||
fun () ->
|
fun map ->
|
||||||
let player_x, player_y = !Map.player_pos in
|
let player_x, player_y = map.Map.player_pos in
|
||||||
for x = 0 to tiles_per_w - 1 do
|
for x = 0 to tiles_per_w - 1 do
|
||||||
let map_x = x + player_x - (tiles_per_w / 2) in
|
let map_x = x + player_x - (tiles_per_w / 2) in
|
||||||
let tile_x = float_of_int ((x * tile_size) + orig_x) in
|
let tile_x = float_of_int ((x * tile_size) + orig_x) in
|
||||||
|
|
@ -68,7 +63,7 @@ let draw_map =
|
||||||
let map_y = y + player_y - (tiles_per_h / 2) in
|
let map_y = y + player_y - (tiles_per_h / 2) in
|
||||||
let tile_y = float_of_int ((y * tile_size) + orig_y) in
|
let tile_y = float_of_int ((y * tile_size) + orig_y) in
|
||||||
let tile_img =
|
let tile_img =
|
||||||
match Map.get_tile_kind ~x:map_x ~y:map_y !map with
|
match Map.get_tile_kind ~x:map_x ~y:map_y map with
|
||||||
| Grass -> grass
|
| Grass -> grass
|
||||||
| Water -> water
|
| Water -> water
|
||||||
| Black -> water
|
| Black -> water
|
||||||
|
|
@ -77,7 +72,7 @@ let draw_map =
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
let papy =
|
let papy =
|
||||||
match !Map.player_dir with
|
match map.Map.player_dir with
|
||||||
| Left -> papy_left
|
| Left -> papy_left
|
||||||
| Right -> papy_right
|
| Right -> papy_right
|
||||||
| Down -> papy_down
|
| Down -> papy_down
|
||||||
|
|
@ -85,23 +80,8 @@ let draw_map =
|
||||||
in
|
in
|
||||||
C2d.draw_image context papy ~x:papy_x ~y:papy_y
|
C2d.draw_image context papy ~x:papy_x ~y:papy_y
|
||||||
|
|
||||||
let move dir =
|
let kb_handler state ev =
|
||||||
if !Map.player_dir = dir then begin
|
let move = Map.move !state.State.map in
|
||||||
let x, y = !Map.player_pos in
|
|
||||||
let x, y =
|
|
||||||
match dir with
|
|
||||||
| Left -> (x - 1, y)
|
|
||||||
| Right -> (x + 1, y)
|
|
||||||
| Down -> (x, y + 1)
|
|
||||||
| Up -> (x, y - 1)
|
|
||||||
in
|
|
||||||
match Map.get_tile_kind ~x ~y !map with
|
|
||||||
| Black | Water -> ()
|
|
||||||
| Grass -> Map.player_pos := (x, y)
|
|
||||||
end
|
|
||||||
else Map.player_dir := dir
|
|
||||||
|
|
||||||
let kb_handler ev =
|
|
||||||
match ev |> Ev.as_type |> Ev.Keyboard.code |> Jstr.to_string with
|
match ev |> Ev.as_type |> Ev.Keyboard.code |> Jstr.to_string with
|
||||||
| "KeyW" | "ArrowUp" -> move Up
|
| "KeyW" | "ArrowUp" -> move Up
|
||||||
| "KeyA" | "ArrowLeft" -> move Left
|
| "KeyA" | "ArrowLeft" -> move Left
|
||||||
|
|
@ -111,7 +91,7 @@ let kb_handler ev =
|
||||||
| _s -> ()
|
| _s -> ()
|
||||||
|
|
||||||
let rec game_loop state _timestamp =
|
let rec game_loop state _timestamp =
|
||||||
draw_map ();
|
draw_map !state.State.map;
|
||||||
let new_state = state in
|
let new_state = state in
|
||||||
G.request_animation_frame (game_loop new_state)
|
G.request_animation_frame (game_loop new_state)
|
||||||
|
|
||||||
|
|
@ -122,10 +102,6 @@ let () =
|
||||||
C2d.set_fill_style context (C2d.color (Jstr.v "#FF1188"));
|
C2d.set_fill_style context (C2d.color (Jstr.v "#FF1188"));
|
||||||
C2d.fill_rect context ~x:0. ~y:0. ~w:(float_of_int width)
|
C2d.fill_rect context ~x:0. ~y:0. ~w:(float_of_int width)
|
||||||
~h:(float_of_int height);
|
~h:(float_of_int height);
|
||||||
(* bind keys *)
|
|
||||||
let _e : Ev.listener =
|
|
||||||
Ev.listen Ev.keydown kb_handler (Window.as_target G.window)
|
|
||||||
in
|
|
||||||
|
|
||||||
(* get state from server*)
|
(* get state from server*)
|
||||||
let initial_state_fut = Ev.next Message.Ev.message Ws_client.ws_target in
|
let initial_state_fut = Ev.next Message.Ev.message Ws_client.ws_target in
|
||||||
|
|
@ -133,6 +109,10 @@ let () =
|
||||||
Fut.await initial_state_fut (fun msg ->
|
Fut.await initial_state_fut (fun msg ->
|
||||||
let initial_state = Ws_client.to_server_msg msg in
|
let initial_state = Ws_client.to_server_msg msg in
|
||||||
let state_ref = ref initial_state in
|
let state_ref = ref initial_state in
|
||||||
|
(* bind keys *)
|
||||||
|
let _e : Ev.listener =
|
||||||
|
Ev.listen Ev.keydown (kb_handler state_ref) (Window.as_target G.window)
|
||||||
|
in
|
||||||
(* attach message listener to update state *)
|
(* attach message listener to update state *)
|
||||||
Ws_client.on_update_state_message (fun received ->
|
Ws_client.on_update_state_message (fun received ->
|
||||||
state_ref := received;
|
state_ref := received;
|
||||||
|
|
|
||||||
40
src/map.ml
40
src/map.ml
|
|
@ -9,19 +9,39 @@ type background =
|
||||||
| Water
|
| Water
|
||||||
| Black
|
| Black
|
||||||
|
|
||||||
type t = background array array
|
type t =
|
||||||
|
{ tiles : background array array
|
||||||
let width = 1000
|
; mutable player_pos : int * int
|
||||||
|
; mutable player_dir : dir
|
||||||
let height = 1000
|
; width : int
|
||||||
|
; height : int
|
||||||
let player_pos = ref (20, 3)
|
}
|
||||||
|
|
||||||
let player_dir = ref Down
|
|
||||||
|
|
||||||
let init () =
|
let init () =
|
||||||
|
let width = 1000 in
|
||||||
|
let height = 1000 in
|
||||||
|
let tiles =
|
||||||
Array.init width (fun _x ->
|
Array.init width (fun _x ->
|
||||||
Array.init height (fun _y ->
|
Array.init height (fun _y ->
|
||||||
if Random.int 1000 <= 42 then Water else Grass ) )
|
if Random.int 1000 <= 42 then Water else Grass ) )
|
||||||
|
in
|
||||||
|
{ tiles; player_pos = (20, 3); player_dir = Down; width; height }
|
||||||
|
|
||||||
let get_tile_kind ~x ~y map = try map.(x).(y) with Invalid_argument _ -> Black
|
let get_tile_kind ~x ~y map =
|
||||||
|
try map.tiles.(x).(y) with Invalid_argument _ -> Black
|
||||||
|
|
||||||
|
let move map dir =
|
||||||
|
if map.player_dir = dir then begin
|
||||||
|
let x, y = map.player_pos in
|
||||||
|
let x, y =
|
||||||
|
match dir with
|
||||||
|
| Left -> (x - 1, y)
|
||||||
|
| Right -> (x + 1, y)
|
||||||
|
| Down -> (x, y + 1)
|
||||||
|
| Up -> (x, y - 1)
|
||||||
|
in
|
||||||
|
match get_tile_kind ~x ~y map with
|
||||||
|
| Black | Water -> ()
|
||||||
|
| Grass -> map.player_pos <- (x, y)
|
||||||
|
end
|
||||||
|
else map.player_dir <- dir
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ let handle_client request client =
|
||||||
| None -> Dream.log "User does not exists" |> Lwt.return
|
| None -> Dream.log "User does not exists" |> Lwt.return
|
||||||
| Some user_id ->
|
| Some user_id ->
|
||||||
(* TODO catch marshal failure *)
|
(* TODO catch marshal failure *)
|
||||||
|
Dream.log " SEND USER ISLAND";
|
||||||
(* send user island state *)
|
(* send user island state *)
|
||||||
let state =
|
let state =
|
||||||
match User.get_state user_id with
|
match User.get_state user_id with
|
||||||
|
|
@ -14,6 +14,7 @@ let handle_client request client =
|
||||||
| Ok state -> state
|
| Ok state -> state
|
||||||
in
|
in
|
||||||
let* () = Dream.send ~text_or_binary:`Text client (Network.marshal state) in
|
let* () = Dream.send ~text_or_binary:`Text client (Network.marshal state) in
|
||||||
|
Dream.log " SENDED USER ISLAND";
|
||||||
|
|
||||||
let rec loop () =
|
let rec loop () =
|
||||||
match%lwt Dream.receive client with
|
match%lwt Dream.receive client with
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue