added (very primitive) gravity and physics engine
This commit is contained in:
parent
8f4b74c171
commit
16977db2d6
BIN
display.cmi
BIN
display.cmi
Binary file not shown.
BIN
display.cmx
BIN
display.cmx
Binary file not shown.
194
display.ml
194
display.ml
|
@ -25,21 +25,37 @@ let chunk_size = 6 ;;
|
|||
let chunk_size_f = float_of_int chunk_size ;;
|
||||
|
||||
(* between 0 (empty) and 100 (full) *)
|
||||
let density = 50 ;;
|
||||
let density = 35 ;;
|
||||
|
||||
let speed_multiplier = 0.15 ;;
|
||||
let speed_multiplier = 0.1 ;;
|
||||
|
||||
(* money money money *)
|
||||
let coins = ref 0 ;;
|
||||
|
||||
(* player has a cube hitbox with 2*this_value as length *)
|
||||
let collison_leniency = (float_of_int cube_size) /. 10. ;;
|
||||
let collison_leniency = (float_of_int cube_size) /. 6. ;;
|
||||
|
||||
(* hitbox for coins *)
|
||||
let coin_magnet_dist = 1. ;;
|
||||
|
||||
(* -------------------------------------------------------------------------------------------------------- *)
|
||||
|
||||
(* m/sœ *)
|
||||
let gravity = 0.98 ;;
|
||||
|
||||
(* should be bigger then collision_leniency *)
|
||||
let gravity_leniency = (float_of_int cube_size) /. 6. ;;
|
||||
|
||||
let vx = ref 0.0
|
||||
and vy = ref 0.0
|
||||
and vz = ref 0.0 ;;
|
||||
|
||||
let ax = ref 0.0
|
||||
and ay = ref 0.0
|
||||
and az = ref 0.0 ;;
|
||||
|
||||
(* -------------------------------------------------------------------------------------------------------- *)
|
||||
|
||||
(* avg number of chunk generation required before encountering a structure of type 1 *)
|
||||
let structure_1_frequency = 2500 ;;
|
||||
|
||||
|
@ -1042,6 +1058,17 @@ let is_collision_cube_bis (cam_coords : pt_3d) (cuube : coloredCube) =
|
|||
cuube.cube.(6).y +. collison_leniency >= (-. cam_coords.y) &&
|
||||
cuube.cube.(6).z +. collison_leniency >= cam_coords.z ;;
|
||||
|
||||
let is_collision_cube_G (cam_coords : pt_3d) (cuube : coloredCube) =
|
||||
if is_string_integer cuube.flag then
|
||||
false
|
||||
else
|
||||
cuube.cube.(0).x -. gravity_leniency <= (-. cam_coords.x) &&
|
||||
cuube.cube.(0).y -. gravity_leniency <= (-. cam_coords.y) &&
|
||||
cuube.cube.(0).z -. gravity_leniency <= cam_coords.z &&
|
||||
cuube.cube.(6).x +. gravity_leniency >= (-. cam_coords.x) &&
|
||||
cuube.cube.(6).y +. gravity_leniency >= (-. cam_coords.y) &&
|
||||
cuube.cube.(6).z +. gravity_leniency >= cam_coords.z ;;
|
||||
|
||||
let is_collision (cam_coords : pt_3d) (cubes : pt_3d array array) =
|
||||
let res = ref false in
|
||||
let n = !n_walls in
|
||||
|
@ -1127,6 +1154,51 @@ let is_collision_hash_2 (cam_coords : pt_3d) (rcubes : (coloredCube dynamic) opt
|
|||
!res
|
||||
end ;;
|
||||
|
||||
let is_collision_hash_G (cam_coords : pt_3d) (rcubes : (coloredCube dynamic) option) = match rcubes with
|
||||
| None -> false
|
||||
| Some cubes -> begin
|
||||
let res = ref false in
|
||||
let n = cubes.len in
|
||||
|
||||
let distances = Array.make n 0. in
|
||||
|
||||
for i = 0 to n-1 do
|
||||
distances.(i) <- cube_dist cubes.tab.(i).cube;
|
||||
done ;
|
||||
|
||||
let to_be_removed = ref [] in
|
||||
let rem_len = ref 0 in
|
||||
|
||||
for i = 0 to n-1 do
|
||||
if is_string_integer cubes.tab.(i).flag then begin (* coin *)
|
||||
if is_collision_coin cam_coords cubes.tab.(i).cube then begin
|
||||
let valc = str_to_int cubes.tab.(i).flag in
|
||||
coins := !coins + valc;
|
||||
to_be_removed := (i - !rem_len)::(!to_be_removed);
|
||||
incr rem_len;
|
||||
(*Printf.printf "%d" valc;
|
||||
Stdlib.print_endline " "*)
|
||||
end
|
||||
end
|
||||
else if (String.length cubes.tab.(i).flag) = 1 then begin (* ore *)
|
||||
if is_collision_coin cam_coords cubes.tab.(i).cube then begin
|
||||
add_ore_to_inventory cubes.tab.(i).flag;
|
||||
to_be_removed := (i - !rem_len)::(!to_be_removed);
|
||||
incr rem_len;
|
||||
(*Printf.printf "%d" valc;
|
||||
Stdlib.print_endline " "*)
|
||||
end
|
||||
end
|
||||
else if not !res && distances.(i) < chunk_size_f then
|
||||
(*res := is_collision_cube cam_coords cubes.tab.(i).cube*)
|
||||
res := is_collision_cube_G cam_coords cubes.tab.(i)
|
||||
done;
|
||||
|
||||
indent_list cubes !to_be_removed;
|
||||
|
||||
!res
|
||||
end ;;
|
||||
|
||||
let convert_laby laby =
|
||||
let width = Array.length laby
|
||||
and height = Array.length laby.(0)
|
||||
|
@ -1215,77 +1287,64 @@ let cheesify (laby : tile array array array) =
|
|||
done
|
||||
done;;
|
||||
|
||||
let is_collision_global_2 hash cx cy cz =
|
||||
(* O(n³) goes brrr *)
|
||||
let boo = ref false in
|
||||
for i = -1 to 1 do
|
||||
for j = -1 to 1 do
|
||||
for k = -1 to 1 do
|
||||
boo := !boo || is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+i,cy+j,cz+k))
|
||||
done
|
||||
done
|
||||
done;
|
||||
!boo ;;
|
||||
|
||||
let is_collision_global_G hash cx cy cz =
|
||||
let boo = ref false in
|
||||
for i = -1 to 1 do
|
||||
for j = -1 to 1 do
|
||||
for k = -1 to 1 do
|
||||
boo := !boo || is_collision_hash_G camera_xyz (Hashtbl.find_opt hash (cx+i,cy+j,cz+k))
|
||||
done
|
||||
done
|
||||
done;
|
||||
!boo ;;
|
||||
|
||||
let rec move_cam_hash_2 hash cx cy cz b c =(* Printf.printf "[%b]" b; Stdlib.print_endline " " ; *)match c with
|
||||
| 'z' ->
|
||||
camera_xyz.z <- camera_xyz.z +. speed_multiplier *. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.);
|
||||
camera_xyz.x <- camera_xyz.x +. speed_multiplier *. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.);
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then move_cam_hash_2 hash cx cy cz false 's'
|
||||
| 'q' ->
|
||||
camera_xyz.z <- camera_xyz.z +. speed_multiplier *. Float.cos (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.);
|
||||
camera_xyz.x <- camera_xyz.x +. speed_multiplier *. Float.sin (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.);
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then move_cam_hash_2 hash cx cy cz false 'd'
|
||||
| 's' ->
|
||||
camera_xyz.z <- camera_xyz.z -. speed_multiplier *. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.);
|
||||
camera_xyz.x <- camera_xyz.x -. speed_multiplier *. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.);
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then move_cam_hash_2 hash cx cy cz false 'z'
|
||||
| 'd' ->
|
||||
camera_xyz.z <- camera_xyz.z +. speed_multiplier *. Float.cos (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.);
|
||||
camera_xyz.x <- camera_xyz.x +. speed_multiplier *. Float.sin (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.);
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then move_cam_hash_2 hash cx cy cz false 'q'
|
||||
| 'p' ->
|
||||
camera_xyz.y <- camera_xyz.y -. speed_multiplier ;
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
) then move_cam_hash_2 hash cx cy cz false 'm'
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then begin Stdlib.print_endline "Nope (p)" ; move_cam_hash_2 hash cx cy cz false 'm' end
|
||||
| 'm' ->
|
||||
camera_xyz.y <- camera_xyz.y +. speed_multiplier ;
|
||||
if b && (
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx+1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx-1,cy,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy+1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy-1,cz))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz+1))) ||
|
||||
(is_collision_hash_2 camera_xyz (Hashtbl.find_opt hash (cx,cy,cz-1)))
|
||||
) then move_cam_hash_2 hash cx cy cz false 'p'
|
||||
is_collision_global_2 hash cx cy cz
|
||||
) then begin Stdlib.print_endline "Nope (m)" ; move_cam_hash_2 hash cx cy cz false 'p' end
|
||||
| 'a' -> camera_angle_y := !camera_angle_y + 1
|
||||
| 'e' -> camera_angle_y := !camera_angle_y - 1
|
||||
| _ -> () ;;
|
||||
|
@ -1617,6 +1676,34 @@ let draw_inventories () =
|
|||
draw_integer_alignedleft 40 (__height__ - (240 + 50 * (Array.length playerOreInventory -1 -i))) playerOreInventory.(i) 20
|
||||
done ;;
|
||||
|
||||
exception CannotPass ;;
|
||||
let move_auto_y hash redraw =
|
||||
try
|
||||
let (cx, cy, cz) = coords_to_chunk_f (-. camera_xyz.x) (-. camera_xyz.y) camera_xyz.z in
|
||||
for i = 1 to 15 do
|
||||
camera_xyz.y <- camera_xyz.y +. !vy /. 15.;
|
||||
let new_cy = ctcf_one (-. camera_xyz.y) in
|
||||
if is_collision_global_G hash cx new_cy cz then begin
|
||||
if i <> 1 then
|
||||
redraw := true;
|
||||
camera_xyz.y <- camera_xyz.y -. !vy /. 15. ;
|
||||
raise CannotPass
|
||||
end
|
||||
else
|
||||
()
|
||||
done ;
|
||||
redraw := true;
|
||||
()
|
||||
with
|
||||
| CannotPass -> vy := 0.; () ;;
|
||||
|
||||
|
||||
let update_gravity dt hash redraw =
|
||||
vy := !vy +. gravity *. dt ;
|
||||
Printf.printf "{%f, %f, %f}" !vx !vy !vz;
|
||||
Stdlib.print_endline " ";
|
||||
move_auto_y hash redraw ;;
|
||||
|
||||
let play_dos laby =
|
||||
try
|
||||
Stdlib.print_endline "Building terrain...";
|
||||
|
@ -1650,6 +1737,8 @@ let play_dos laby =
|
|||
camera_xyz.z <- 2. ;
|
||||
|
||||
while true do
|
||||
let time_s = Unix.gettimeofday() in
|
||||
|
||||
if !redraw then begin (* update the display *)
|
||||
auto_synchronize false;
|
||||
open_graph openstring;
|
||||
|
@ -1670,11 +1759,18 @@ let play_dos laby =
|
|||
|
||||
let usr_input = get1char_plus () in
|
||||
if usr_input <> '@' then begin
|
||||
for i = 0 to 9 do
|
||||
Stdlib.print_endline "EEEEE";
|
||||
for i = 0 to 15 do
|
||||
move_cam_hash_2 hash !ch_x !ch_y !ch_z true usr_input
|
||||
done;
|
||||
redraw := true
|
||||
end
|
||||
end;
|
||||
Unix.sleepf 0.001;
|
||||
|
||||
let time_e = Unix.gettimeofday() in
|
||||
(*Printf.printf "[%f]" (time_e -. time_s);
|
||||
Stdlib.print_endline " ";*)
|
||||
update_gravity (time_e -. time_s) hash redraw
|
||||
done ;
|
||||
()
|
||||
with
|
||||
|
|
Loading…
Reference in New Issue