非强制战斗刷怪机制

master
chendian 1 year ago
parent 80d1d19ced
commit 921f944d2f

@ -0,0 +1,18 @@
[remap]
importer="MagicaVoxel.With.Extensions.To.Mesh"
type="Mesh"
uid="uid://3mgx1q8pqlsu"
path="res://.godot/imported/c_monster01.vox-486352342a0a2f93ba2924918f2db70a.mesh"
[deps]
source_file="res://resource/mesh_level/c_monster01.vox"
dest_files=["res://.godot/imported/c_monster01.vox-486352342a0a2f93ba2924918f2db70a.mesh"]
[params]
Scale=0.02
GreedyMeshGenerator=true
SnapToGround=false
FirstKeyframeOnly=true

@ -1,18 +0,0 @@
[remap]
importer="MagicaVoxel.With.Extensions.To.Mesh"
type="Mesh"
uid="uid://48vrhuyvto7c"
path="res://.godot/imported/n_empty.vox-c7cd8e085056a3a3c2f2f6fdde55ca1f.mesh"
[deps]
source_file="res://resource/mesh_level/n_empty.vox"
dest_files=["res://.godot/imported/n_empty.vox-c7cd8e085056a3a3c2f2f6fdde55ca1f.mesh"]
[params]
Scale=0.02
GreedyMeshGenerator=true
SnapToGround=false
FirstKeyframeOnly=true

@ -0,0 +1,11 @@
[gd_resource type="MeshLibrary" load_steps=2 format=3 uid="uid://cnmlppi3r8sl0"]
[ext_resource type="ArrayMesh" uid="uid://3mgx1q8pqlsu" path="res://resource/mesh_level/c_monster01.vox" id="1_fi3ob"]
[resource]
item/0/name = "c_monster01"
item/0/mesh = ExtResource("1_fi3ob")
item/0/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
item/0/shapes = []
item/0/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
item/0/navigation_layers = 1

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -24,11 +24,32 @@ func vector_reduce(vector: Vector2, reduce: float) -> Vector2:
return vector * scale_rate
func raycast_wall(from: Vector3, to: Vector3) -> bool:
var space_state: PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
var query: PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(from, to, 1)
var result: Dictionary = space_state.intersect_ray(query)
return result.size()>0
func get_level_grid_pos(pos: Vector3) -> Vector3i:
var grid_size: float = Setting.pixel_size* Setting.grid_pixel_size
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_float_pos(pos: Vector3i) -> Vector3:
var grid_size: float = Setting.pixel_size* Setting.grid_pixel_size
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
func get_div_scale(a: float, b: float) -> int:
#解决浮点数精度问题
var div: float = a / b
var is_positive: bool = div > 0
var decimal: float = abs(div - int(div))
if is_positive and decimal > 0.999:
div += 0.001
if not is_positive and decimal < 0.001:
div += 0.001
return floor(div)
func raycast_character(shape: Shape3D, origin: Vector3, dir: Vector2) -> Array[Character]:
@ -86,6 +107,7 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
var default_shape_large_stair2: Array[Variant] = [load("res://resource/mesh_library/default_shape_large_stair2.tres") as Shape3D, Transform3D.IDENTITY]
var mesh_library_level: MeshLibrary = load("res://resource/mesh_library/mesh_library_level.tres") as MeshLibrary
var mesh_library_ground: MeshLibrary = load("res://resource/mesh_library/mesh_library_ground.tres") as MeshLibrary
var mesh_library_character: MeshLibrary = load("res://resource/mesh_library/mesh_library_character.tres") as MeshLibrary
var material_block_normal: Material = load("res://render/material/grid_block.tres") as Material
var material_block_link: Material = load("res://render/material/grid_block_link.tres") as Material
var mesh_library_level_id_list: Array[int] = []
@ -98,8 +120,9 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
var is_ground = mesh_name.begins_with("g_")
if is_ground:
mesh_name = mesh_name.trim_prefix("g_")
var is_character = mesh_name.begins_with("c_")
var mesh: Mesh = load(file_name_full) as Mesh
var mesh_library: MeshLibrary = mesh_library_ground if is_ground else mesh_library_level
var mesh_library: MeshLibrary = mesh_library_ground if is_ground else (mesh_library_character if is_character else mesh_library_level)
var mesh_library_id_list: Array[int] = mesh_library_ground_id_list if is_ground else mesh_library_level_id_list
var mesh_id: int = mesh_library.find_item_by_name(mesh_name)
if mesh_id == -1:
@ -110,7 +133,7 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
mesh_library.set_item_mesh(mesh_id, mesh)
var material: Material = mesh.surface_get_material(0) as Material
var material_set: Material = material_block_link if mesh_name.ends_with("_link") else material_block_normal
if (not material) or (material.get_path() != material_set.get_path()):
if (mesh.get_surface_count() >0) and (not material) or (material.get_path() != material_set.get_path()):
if from_editor_tool:
reimport_files.append(file_name_full)
else:
@ -124,6 +147,7 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
"h": item_shapes = default_shape_normal_half if not is_ground else default_shape_large_half
"s1": item_shapes = default_shape_normal_stair1 if not is_ground else default_shape_large_stair1
"s2": item_shapes = default_shape_normal_stair2 if not is_ground else default_shape_large_stair2
"c": pass
_: item_shapes = [mesh.create_convex_shape(), Transform3D.IDENTITY]
if item_shapes:
mesh_library.set_item_shapes(mesh_id, item_shapes)
@ -250,3 +274,12 @@ func get_skill_player_weapon_by_weapon(weapon: WeaponCfg) -> Array[SkillWeaponCf
if res.weapon == weapon:
ret.append(res)
return ret
func get_character_cfg_by_name(name: String) -> CharacterCfg:
var path_default: String = "res://config/character/%s.tres" % name
if ResourceLoader.exists(path_default):
var res = load(path_default)
if res is CharacterCfg:
return res
return null

@ -18,7 +18,8 @@ func init() -> void:
func get_level_instance_list() -> Array[LevelInstance]:
if not level_instance_list:
level_instance_list = []
var rooms_node: Node3D = %Levels as Node3D
var rooms_node: Node3D = %Levels as Node3D
var level_character: GridMap = %LevelCharacter as GridMap
for rooms_node_child in rooms_node.get_children():
if not rooms_node_child is LevelArea:
continue
@ -27,6 +28,8 @@ 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_character_spots(level_character)
return level_instance_list
@ -44,3 +47,5 @@ func get_born_pos() -> Vector3:
func set_player_position(pos: Vector3) -> void:
grid_block_material.set_shader_parameter("target_position", pos)
grid_block_link_material.set_shader_parameter("target_position", pos)

@ -26,6 +26,12 @@ class_name LevelInstance
@onready var grid_block_material: Material = load("res://render/material/grid_block.tres") as Material
var level_area_cfg: LevelAreaCfg #运行时设置
var character_spots: Array[ChacacterSpot] #运行时设置
class ChacacterSpot:
var pos: Vector3
var cfg: CharacterCfg
func _on_size_change() -> void:
@ -46,12 +52,8 @@ func set_focus_to(is_focus: bool) -> void:
func _set_focus(is_focus: bool, key: String) -> void:
if is_focus:
grid_block_material.set_shader_parameter("is_focus_"+key, true)
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var level_size: Vector3 = level_range.size
var pos_min: Vector3 = get_global_position() + Vector3(0.640001, 0.640001, 0.640001)
var pos_max: Vector3 = get_global_position() + level_size - Vector3(0.640001, 0.639999, 0.639999)
grid_block_material.set_shader_parameter("focus_min_"+key, pos_min)
grid_block_material.set_shader_parameter("focus_max_"+key, pos_max)
grid_block_material.set_shader_parameter("focus_min_"+key, pos_min())
grid_block_material.set_shader_parameter("focus_max_"+key, pos_max())
else:
grid_block_material.set_shader_parameter("is_focus_"+key, false)
@ -70,3 +72,42 @@ func level_pos() -> Vector2:
func set_level_range_visible(visible: bool) -> void:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
level_range.visible = visible
func init_character_spots(level_character: GridMap) -> void:
character_spots = []
var id_min: Vector3i = Util.get_level_grid_pos(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos(pos_max())
var mesh_library: MeshLibrary = level_character.get_mesh_library()
for x in range(id_min.x, id_max.x+1):
for y in range(id_min.y, id_max.y+1):
for z in range(id_min.z, id_max.z+1):
var pos: Vector3i = Vector3i(x, y, z)
var item_id: int = level_character.get_cell_item(pos)
if item_id == GridMap.INVALID_CELL_ITEM:
continue
var name: String = mesh_library.get_item_name(item_id)
if not name.begins_with("c_"):
continue
var character_name: String = name.trim_prefix("c_")
var character_cfg: CharacterCfg = Util.get_character_cfg_by_name(character_name)
if not character_cfg:
continue
var character_spot = ChacacterSpot.new()
character_spot.cfg = character_cfg
character_spot.pos = Util.get_level_float_pos(pos)
character_spots.append(character_spot)
func get_character_spots() -> Array[ChacacterSpot]:
return character_spots
func pos_min() -> Vector3:
return get_global_position() + Vector3(0.640001, 0.640001, 0.640001)
func pos_max() -> Vector3:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var level_size: Vector3 = level_range.size
return get_global_position() + level_size - Vector3(0.640001, 0.639999, 0.639999)

@ -60,7 +60,7 @@ func on_character_destroy(id: int): target = 0
func set_player_position(pos: Vector3) -> void:
level.set_player_position(pos)
var new_id: Vector3i = get_level_id(pos)
var new_id: Vector3i = Util.get_level_id(pos)
var new_level_instance: LevelInstance = level_instance_dict.get(new_id)
if not new_level_instance:
return #todo 不存在的关卡 主角直接死亡
@ -69,7 +69,12 @@ func set_player_position(pos: Vector3) -> void:
return
#todo 销毁原关卡实体 并存档
cur_level_instance.set_focus_from(true)
#创建关卡内角色
for character_spot: LevelInstance.ChacacterSpot in new_level_instance.get_character_spots():
if not character_spot.cfg:
continue
Global.character_mgr.create_character(character_spot.cfg, Enum.ETeam.Monster, character_spot.pos)
new_level_instance.set_focus_to(true)
cur_level_instance = new_level_instance
level_loading_rate = 1-level_loading_rate
@ -85,24 +90,5 @@ func get_level_id_list(pos: Vector3, size: Vector3i) -> Array[Vector3i]:
for y in range(size.y):
for z in range(size.z):
var pos_sub: Vector3 = pos +Vector3(x*size_basic.x, y*size_basic.y, z*size_basic.z)
ret.append(get_level_id(pos_sub))
return ret
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))
# print("get_level_id", pos, ret)
ret.append(Util.get_level_id(pos_sub))
return ret
func get_div_scale(a: float, b: float) -> int:
#解决浮点数精度问题
var div: float = a / b
var is_positive: bool = div > 0
var decimal: float = abs(div - int(div))
if is_positive and decimal > 0.999:
div += 0.001
if not is_positive and decimal < 0.001:
div += 0.001
# print("get_div_scale", " ", a, " ", b, " ", decimal, " ", div)
return floor(div)

Loading…
Cancel
Save