fix 关卡

master
chendian 9 months ago
parent aaab19b734
commit 4c6a840b39

File diff suppressed because one or more lines are too long

@ -33,7 +33,9 @@ func get_level_grid_pos(pos: Vector3) -> Vector3i:
var ret: Vector3i = Vector3i(get_div_scale(pos.x, grid_size), get_div_scale(pos.y, grid_size), get_div_scale(pos.z, grid_size))
return ret
func get_level_grid_pos2(pos: Vector3) -> Vector3i:
pos += Vector3.ONE * Setting.pixel_size* Setting.grid_pixel_size;
var grid_size: float = Setting.pixel_size* Setting.grid_pixel_size * 2
var ret: Vector3i = Vector3i(get_div_scale(pos.x, grid_size), get_div_scale(pos.y, grid_size), get_div_scale(pos.z, grid_size))
return ret
@ -44,6 +46,11 @@ func get_level_float_pos(pos: Vector3i) -> Vector3:
return Vector3(pos.x*grid_size, pos.y*grid_size, pos.z*grid_size)
func get_level_float_pos2(pos: Vector3i) -> Vector3:
var grid_size: float = Setting.pixel_size* Setting.grid_pixel_size * 2
return Vector3(pos.x*grid_size, pos.y*grid_size, pos.z*grid_size)
func get_level_id(pos: Vector3) -> Vector3i:
var ret: Vector3i = Vector3i(get_div_scale(pos.x, Setting.size_basic.x), get_div_scale(pos.y, Setting.size_basic.y), get_div_scale(pos.z, Setting.size_basic.z))
return ret

@ -13,6 +13,10 @@ func init() -> void:
grid_block_material.set_shader_parameter("is_target", true)
grid_block_material.set_shader_parameter("is_focus", true)
for level_instance in level_instance_list:
level_instance.init_level_character()
level_instance.init_level_main()
func get_level_instance_list() -> Array[LevelInstance]:
if not level_instance_list:
@ -28,7 +32,6 @@ func get_level_instance_list() -> Array[LevelInstance]:
rooms_node_child_child.level_area_cfg = rooms_node_child.cfg
rooms_node_child_child.set_level_range_visible(false)
level_instance_list.append(rooms_node_child_child)
rooms_node_child_child.init()
return level_instance_list

@ -70,16 +70,11 @@ func set_level_range_visible(value: bool) -> void:
level_range.visible = value
func init() -> void:
init_level_character()
init_level_main()
func set_focus() -> void:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var level_size: Vector3 = level_range.size
var focus_min: Vector3 = get_global_position() + Vector3(0.640001, 0.640001, 0.640001)
var focus_max: Vector3 = get_global_position() + level_size - Vector3(0.640001, 0.639999, 0.639999)
var focus_min: Vector3 = get_global_position() - Vector3(0.640001, 0.640001, 0.640001)
var focus_max: Vector3 = get_global_position() + level_size + Vector3(0.640001, 0.640001, 0.640001)
grid_block_material.set_shader_parameter("focus_min", focus_min)
grid_block_material.set_shader_parameter("focus_max", focus_max)
@ -139,13 +134,9 @@ func init_level_main() -> void:
mark_white_list.clear()
mark_black_list.clear()
grid_main_cache_cells.clear()
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
# 正前面
for x in range(id_min.x, id_max.x+1):
for y in range(id_min.y, id_max.y+1):
var pos: Vector3i = Vector3i(x, y, id_max.z)
add_grid_main_cache_cell(level_main, pos)
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
# 底面黑块
for x in range(id_min.x, id_max.x+1):
for z in range(id_min.z, id_max.z+1):
@ -154,24 +145,87 @@ func init_level_main() -> void:
if not(id == GridMap.INVALID_CELL_ITEM or z == id_max.z):
continue
mark_black_list.append(pos)
# 底面黑块剔除
var mark_black_remove_list: Array[Vector3i] = []
for mark_black in mark_black_list:
var is_edge: bool
var check_dir: Vector3i
if mark_black.x == id_min.x:
check_dir = Vector3i(-1, 0, 0); is_edge=true;
elif mark_black.z == id_min.z:
check_dir = Vector3i(0, 0, -1); is_edge=true;
elif mark_black.x == id_max.x:
check_dir = Vector3i(1, 0, 0); is_edge=true;
elif mark_black.z == id_max.z:
check_dir = Vector3i(0, 0, 1); is_edge=true;
else:
check_dir = Vector3i(0, -1, 0)
if mark_black in [
Vector3i(id_min.x, id_min.y, id_min.z),
Vector3i(id_max.x, id_min.y, id_min.z),
Vector3i(id_min.x, id_min.y, id_max.z),
Vector3i(id_max.x, id_min.y, id_max.z)
]:
continue
if is_edge:
var is_hole: bool
for y in range(id_min.y+1, id_max.y):
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
if not check_grid(level_main, pos):
is_hole = true
break
if not is_hole:
continue
var mark_black_check: Vector3i = mark_black + check_dir
var float_pos_check: Vector3 = Util.get_level_float_pos2(mark_black_check) + Vector3(0.64, 0, 0.64)
if not (Global.level_mgr.get_level_by_pos(float_pos_check) and not check_grid(level_main, float_pos_check)):
continue
mark_black_remove_list.append(mark_black)
mark_black_list = mark_black_list.filter(func (x): return x not in mark_black_remove_list)
# 底面黑块延申空气墙
for mark_black in mark_black_list:
for y in range(id_min.y, id_max.y):
add_grid_main_cache_cell(level_main, mark_black)
for y in range(id_min.y+1, id_max.y):
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
add_grid_main_cache_cell(level_main, pos)
mark_white_list.append(pos)
# 底面黑块剔除延申空气墙
for mark_black in mark_black_remove_list:
for y in range(id_min.y+1, id_max.y):
var pos: Vector3i = Vector3i(mark_black.x, y, mark_black.z)
if not check_grid(level_main, pos):
continue
add_grid_main_cache_cell(level_main, pos)
mark_white_list.append(pos)
# 顶面
for x in range(id_min.x, id_max.x+1):
for z in range(id_min.z, id_max.z+1):
var pos: Vector3i = Vector3i(x, id_max.y, z)
add_grid_main_cache_cell(level_main, pos)
if z == id_max.z:
mark_white_list.append(pos)
continue
var pos_down: Vector3i = Vector3i(x, id_max.y - 1, z)
if level_main.get_cell_item(pos_down) == GridMap.INVALID_CELL_ITEM:
var pos_up: Vector3i = Vector3i(x, id_max.y + 1, z)
var float_pos_check: Vector3 = Util.get_level_float_pos2(pos_up) + Vector3(0.64, 0, 0.64)
if Global.level_mgr.get_level_by_pos(float_pos_check) and not check_grid(level_main, pos_up):
continue
mark_white_list.append(pos)
else:
mark_black_list.append(pos)
func check_grid(level_main: GridMap, pos: Vector3i) -> bool:
var id: int = level_main.get_cell_item(pos)
return id != GridMap.INVALID_CELL_ITEM
func add_grid_main_cache_cell(level_main: GridMap, pos: Vector3i) -> void:
var id: int = level_main.get_cell_item(pos)
if id == GridMap.INVALID_CELL_ITEM:
@ -183,9 +237,15 @@ func add_grid_main_cache_cell(level_main: GridMap, pos: Vector3i) -> void:
grid_main_cache_cells.append(cache_data)
func set_replace(is_active: bool)-> void:
func set_replace(is_active: bool, last_grid_main_cache_cells: Array[GridMainCacheCellData] = [])-> void:
var level_main: GridMap = %LevelGridMain as GridMap
if is_active:
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
for cache_data in last_grid_main_cache_cells:
if cache_data.pos.x < id_min.x or cache_data.pos.z < id_min.z or cache_data.pos.x > id_max.x or cache_data.pos.z > id_max.z:
continue
level_main.set_cell_item(cache_data.pos, cache_data.id, cache_data.orientation)
for cache_data in grid_main_cache_cells:
level_main.set_cell_item(cache_data.pos, GridMap.INVALID_CELL_ITEM)
for pos in mark_white_list:
@ -217,6 +277,10 @@ func get_level_active_spots() -> Array[LevelActiveSpot]:
return level_active_spots
func get_grid_main_cache_cells() -> Array[GridMainCacheCellData]:
return grid_main_cache_cells
func pos_min() -> Vector3:
return get_global_position()

@ -63,7 +63,7 @@ func on_character_pos_changed(id: int, pos: Vector3):
set_player_position(pos)
func on_character_die(id: int):
func on_character_die(id: int) -> void:
if id in current_enmey:
current_enmey.remove_at(current_enmey.find(id))
#强制战斗关卡通关
@ -79,8 +79,7 @@ func on_character_die(id: int):
func set_player_position(pos: Vector3) -> void:
level.set_player_position(pos)
var new_id: Vector3i = Util.get_level_id(pos)
var new_level_instance: LevelInstance = level_instance_dict.get(new_id)
var new_level_instance: LevelInstance = get_level_by_pos(pos)
if not new_level_instance:
return #todo 不存在的关卡 主角直接死亡
if cur_level_instance:
@ -118,7 +117,11 @@ func enter_level() -> void:
var replace_level_instance: LevelInstance = replace_cache.pop_at(0)
if replace_level_instance != cur_level_instance:
replace_level_instance.set_replace(false)
cur_level_instance.set_replace(true)
if len(replace_cache) >= 2:
var replace_level_instance: LevelInstance = replace_cache[0]
cur_level_instance.set_replace(true, replace_level_instance.get_grid_main_cache_cells())
else:
cur_level_instance.set_replace(true)
level_loading_rate = 1-level_loading_rate
SignalManager.level_size_change.emit(cur_level_instance.get_level_size())
@ -173,3 +176,16 @@ func enemy_born(count: int) -> bool:
Global.character_mgr.create_character(cfg, Enum.ETeam.Monster, character_spot.pos)
enemy_count += 1
return true
func get_level_by_pos(pos: Vector3) -> LevelInstance:
var level_id: Vector3i = Util.get_level_id(pos)
if level_id in level_instance_dict:
return level_instance_dict.get(level_id)
return null
func get_cur_level_name() -> String:
if not cur_level_instance:
return ""
return cur_level_instance.get_name()

@ -15,8 +15,12 @@ func _process(_delta: float) -> void:
var player: Character = Global.character_mgr.get_player()
if not player:
return
refresh_debug_info("break_level", str(player.get_status("break_level")))
refresh_debug_info("stance", str(player.get_status("stance")))
refresh_debug_info("硬直等级", str(player.get_status("break_level")))
refresh_debug_info("姿态", str(player.get_status("stance")))
refresh_debug_info("位置", str(player.pos()))
refresh_debug_info("关卡", Global.level_mgr.get_cur_level_name())
refresh_debug_info("关卡坐标", str(Util.get_level_grid_pos2(player.pos())))
refresh_debug_info("关卡浮点坐标", str(Util.get_level_float_pos2(Util.get_level_grid_pos2(player.pos()))))
func refresh_debug_info(label_value: String, value: String) -> void:

Loading…
Cancel
Save