fix 关卡自动空气墙

master
chendian 9 months ago
parent 24b6616c09
commit 8c1c2f1721

@ -0,0 +1,18 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "GDScript: Launch Project",
"type": "godot",
"request": "launch",
"project": "${workspaceFolder}",
"debug_collisions": false,
"debug_paths": false,
"debug_navigation": false,
"additional_options": ""
}
]
}

@ -0,0 +1,3 @@
{
"godotTools.editorPath.godot4": "c:\\Users\\Administrator\\Desktop\\Godot_v4.4-beta1_win64.exe"
}

@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=9 format=3 uid="uid://dj7b6f02488hm"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=8 format=3 uid="uid://dj7b6f02488hm"]
[ext_resource type="Resource" uid="uid://by6jd5xqjml2m" path="res://config/attack/blunt_starfall_1.tres" id="1_dfu42"]
[ext_resource type="Resource" uid="uid://dq3pnbyfx4irr" path="res://config/attack_box/circle_foot.tres" id="2_doldq"]
@ -7,7 +7,6 @@
[ext_resource type="Animation" uid="uid://dxgqn5fa7aokj" path="res://resource/skill_animation/hero01_fist_air_skill_charging.tres" id="3_q461t"]
[ext_resource type="Resource" uid="uid://decgfcx2xsj8i" path="res://config/attack_box/circle_mid.tres" id="4_lpsn0"]
[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="5_70pp4"]
[ext_resource type="SpriteFrames" uid="uid://cajgs8smbkjan" path="res://resource/animation/character/hero01_fist_skill01.aseprite" id="7_gkp4g"]
[resource]
script = ExtResource("2_mje6b")
@ -33,5 +32,4 @@ is_lock_x = false
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("7_gkp4g")
animation_name = "fist_air_skill_charging"

@ -1,10 +1,9 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://0n2jnkdrwa2l"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://0n2jnkdrwa2l"]
[ext_resource type="Resource" uid="uid://bwe8xlgfhx1gl" path="res://config/attack/blunt_heavy_hit_blow.tres" id="1_5lwhl"]
[ext_resource type="Resource" uid="uid://bqejjllfy03h3" path="res://config/attack_box/box_normal.tres" id="2_g7bbg"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="2_ym7q1"]
[ext_resource type="Animation" uid="uid://b2xdmgnem1h4g" path="res://resource/skill_animation/hero01_fist_attack05.tres" id="3_dbjmb"]
[ext_resource type="SpriteFrames" uid="uid://bhsotj76tuovy" path="res://resource/animation/character/hero01_fist_attack.aseprite" id="4_mhr07"]
[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="5_en30r"]
[resource]
@ -29,5 +28,4 @@ is_lock_x = true
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("4_mhr07")
animation_name = "fist_attack05"

@ -1,10 +1,9 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://dpaa7dflbjk62"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://dpaa7dflbjk62"]
[ext_resource type="Resource" uid="uid://cdkjjljp81p56" path="res://config/attack/blunt_mid_hit_down.tres" id="1_ywehi"]
[ext_resource type="Resource" uid="uid://qp5sy3u3rlpe" path="res://config/attack_box/box_high.tres" id="2_ywehi"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_6wryu"]
[ext_resource type="Animation" uid="uid://by2e51w02ka8s" path="res://resource/skill_animation/hero01_fist_skill03.tres" id="4_c7ye6"]
[ext_resource type="SpriteFrames" uid="uid://cajgs8smbkjan" path="res://resource/animation/character/hero01_fist_skill01.aseprite" id="5_sjxkh"]
[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="6_aemq5"]
[resource]
@ -29,5 +28,4 @@ is_lock_x = true
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("5_sjxkh")
animation_name = "fist_skill03"

@ -1,11 +1,10 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://cu73c3osx40k2"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://cu73c3osx40k2"]
[ext_resource type="Resource" uid="uid://dfjtcdh13vohe" path="res://config/attack/blunt_normal_hit_up_back.tres" id="1_f41cj"]
[ext_resource type="Resource" uid="uid://dq3pnbyfx4irr" path="res://config/attack_box/circle_foot.tres" id="2_bmi1a"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="5_j7ual"]
[ext_resource type="Animation" uid="uid://cpda46s7n6mar" path="res://resource/skill_animation/hero01_fist_air_skill02.tres" id="6_le53b"]
[ext_resource type="Resource" uid="uid://c6alg8pmqfdxm" path="res://config/weapon/fist.tres" id="7_cmht3"]
[ext_resource type="SpriteFrames" uid="uid://cajgs8smbkjan" path="res://resource/animation/character/hero01_fist_skill01.aseprite" id="7_kay3f"]
[resource]
script = ExtResource("5_j7ual")
@ -29,5 +28,4 @@ is_lock_x = true
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("7_kay3f")
animation_name = "fist_skill_special01"

@ -1,10 +1,9 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://chuf7yp2oc0f7"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://chuf7yp2oc0f7"]
[ext_resource type="Resource" uid="uid://bv4uoey1liqoq" path="res://config/attack/sharp_heavy_hit_blow.tres" id="1_m5u18"]
[ext_resource type="Resource" uid="uid://bnfnjdw0tms3h" path="res://config/attack_box/box_large.tres" id="2_0351a"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_to21l"]
[ext_resource type="Animation" uid="uid://cjc6sis2xn1yy" path="res://resource/skill_animation/hero01_long_air_skill02.tres" id="4_u7aq7"]
[ext_resource type="SpriteFrames" uid="uid://dhfqj1dxldqao" path="res://resource/animation/character/hero01_long_skill01.aseprite" id="5_6p3pi"]
[ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="6_vj7l0"]
[resource]
@ -29,5 +28,4 @@ is_lock_x = true
is_lock_x_move = true
range = 0.0
warn_type = 0
sprite_frames = ExtResource("5_6p3pi")
animation_name = "long_air_skill02"

@ -1,10 +1,9 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://fnub06pyo2l8"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=6 format=3 uid="uid://fnub06pyo2l8"]
[ext_resource type="Resource" uid="uid://cw7rb4rlfw33q" path="res://config/attack/sharp_heavy_hit_back.tres" id="1_2k8jp"]
[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_1jdoh"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_tbh7t"]
[ext_resource type="Animation" uid="uid://nhnwu6uccylr" path="res://resource/skill_animation/hero01_long_stab02.tres" id="4_2k8jp"]
[ext_resource type="SpriteFrames" uid="uid://c6w03xigmrd31" path="res://resource/animation/character/hero01_long_skill03.aseprite" id="5_ys6gu"]
[ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="6_3b28o"]
[resource]
@ -29,5 +28,4 @@ is_lock_x = true
is_lock_x_move = true
range = 0.0
warn_type = 0
sprite_frames = ExtResource("5_ys6gu")
animation_name = "long_skill_stab02"

@ -1,11 +1,10 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=8 format=3 uid="uid://cahm6vjsskkc5"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://cahm6vjsskkc5"]
[ext_resource type="Resource" uid="uid://dmfr73m28vsqj" path="res://config/attack/sharp_normal_hit_back_hard.tres" id="1_o1kbx"]
[ext_resource type="Animation" uid="uid://dbm6ssy6cqb2d" path="res://resource/skill_animation/hero01_long_stab03.tres" id="2_jcwvc"]
[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_o1kbx"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_51oqr"]
[ext_resource type="Resource" uid="uid://rxt1emwats2v" path="res://config/character/bullet_hero01_long_stab.tres" id="4_hrq33"]
[ext_resource type="SpriteFrames" uid="uid://c6w03xigmrd31" path="res://resource/animation/character/hero01_long_skill03.aseprite" id="5_aqnpo"]
[ext_resource type="Resource" uid="uid://cy3wwalxeyro0" path="res://config/weapon/long.tres" id="6_cys3s"]
[resource]
@ -31,5 +30,4 @@ is_lock_x = true
is_lock_x_move = true
range = 0.0
warn_type = 0
sprite_frames = ExtResource("5_aqnpo")
animation_name = "long_skill_stab02"

@ -1,8 +1,7 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=5 format=3 uid="uid://cjp4q8uhiryjd"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=4 format=3 uid="uid://cjp4q8uhiryjd"]
[ext_resource type="Animation" uid="uid://qcmj7d5pg6lw" path="res://resource/skill_animation/hero01_short_skill01.tres" id="2_j0c0j"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_0dcj8"]
[ext_resource type="SpriteFrames" uid="uid://dlmesk4xyydmd" path="res://resource/animation/character/hero01_short_skill03.aseprite" id="3_j0c0j"]
[ext_resource type="Resource" uid="uid://pnhii1a83axg" path="res://config/weapon/short.tres" id="6_7qlca"]
[resource]
@ -25,5 +24,4 @@ is_lock_x = true
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("3_j0c0j")
animation_name = "short_skill_stab01"

@ -1,10 +1,9 @@
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=8 format=3 uid="uid://ckmsp5bdyk3tx"]
[gd_resource type="Resource" script_class="SkillWeaponCfg" load_steps=7 format=3 uid="uid://ckmsp5bdyk3tx"]
[ext_resource type="Resource" uid="uid://cuc04svaipss7" path="res://config/attack/sharp_normal_none.tres" id="1_5n6sn"]
[ext_resource type="Resource" uid="uid://diedb7vw7eyxp" path="res://config/attack_box/box_mid.tres" id="2_67ngl"]
[ext_resource type="Script" uid="uid://dgwtu2wj5033u" path="res://script/config/skill_weapon_cfg.gd" id="3_cub6b"]
[ext_resource type="Animation" uid="uid://b3fuombjh57oj" path="res://resource/skill_animation/hero01_short_stab01.tres" id="4_67ngl"]
[ext_resource type="SpriteFrames" uid="uid://c6w03xigmrd31" path="res://resource/animation/character/hero01_long_skill03.aseprite" id="5_kk2vu"]
[ext_resource type="Resource" uid="uid://pnhii1a83axg" path="res://config/weapon/short.tres" id="6_5n6sn"]
[ext_resource type="Resource" uid="uid://cb4q16lmqwbin" path="res://config/character/bullet_hero01_short_stab01.tres" id="6_cub6b"]
@ -31,5 +30,4 @@ is_lock_x = false
is_lock_x_move = false
range = 0.0
warn_type = 0
sprite_frames = ExtResource("5_kk2vu")
animation_name = "long_skill_stab01"

@ -54,7 +54,7 @@ import/use_multiple_threads=false
[editor_plugins]
enabled=PackedStringArray("res://addons/MagicaVoxel_Importer_with_Extensions/plugin.cfg", "res://addons/beehave/plugin.cfg", "res://addons/editor_menu_tools/plugin.cfg", "res://addons/nklbdev.aseprite_importers/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg")
enabled=PackedStringArray("res://addons/MagicaVoxel_Importer_with_Extensions/plugin.cfg", "res://addons/beehave/plugin.cfg", "res://addons/nklbdev.aseprite_importers/plugin.cfg", "res://addons/resources_spreadsheet_view/plugin.cfg")
[file_customization]

@ -12,7 +12,7 @@ background_mode = 1
sky = SubResource("Sky_hmsea")
ambient_light_source = 2
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_energy = 0.2
ambient_light_energy = 0.15
tonemap_white = 2.39
ssao_intensity = 1.0
glow_enabled = true

@ -10,8 +10,10 @@ shader = ExtResource("1_ggegd")
shader_parameter/is_target = false
shader_parameter/is_focus = false
shader_parameter/target_position = Vector3(0, 1.28, 1)
shader_parameter/focus_min = Vector3(0, 0, 0)
shader_parameter/focus_max = Vector3(0, 0, 0)
shader_parameter/focus_min = Vector3(50.56, 5.76, -0.640001)
shader_parameter/focus_max = Vector3(64.64, 13.44, 7.04)
shader_parameter/tex_noise1 = ExtResource("2_mif3q")
shader_parameter/tex_noise2 = ExtResource("3_k18qr")
shader_parameter/tex_noise3 = ExtResource("2_mif3q")
shader_parameter/tex_noise_sub = ExtResource("3_k18qr")
shader_parameter/tex_noise_sub_color = Color(0.0666667, 0.639216, 0.0823529, 0.227451)

@ -1,6 +1,6 @@
[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://cn575sh80pqxk"]
[ext_resource type="Shader" uid="uid://xk1b514pohnb" path="res://render/shader/level_water.gdshader" id="1_bicx1"]
[ext_resource type="Shader" uid="uid://xk1b514pohnb" path="res://render/shader/level_grid_water.gdshader" id="1_bicx1"]
[ext_resource type="Texture2D" uid="uid://c4byf37he3mjt" path="res://render/texture/particle/noise/noise1.png" id="2_a8f7n"]
[resource]

@ -1,4 +1,5 @@
shader_type spatial;
render_mode cull_disabled;
uniform sampler2D tex : source_color,filter_nearest;
uniform float flash_white;

@ -4,13 +4,17 @@ uniform bool is_focus = false;
uniform vec3 target_position = vec3(0, 1.28, 1);
uniform vec3 focus_min = vec3(0,0,0);
uniform vec3 focus_max = vec3(0,0,0);
uniform sampler2D tex_noise1 : source_color;
uniform sampler2D tex_noise2 : source_color;
uniform sampler2D tex_noise3 : source_color;
uniform sampler2D tex_noise_sub : source_color;
uniform vec4 tex_noise_sub_color : source_color = vec4(1.0);
varying vec3 world_position;
varying vec2 uv1;
varying vec2 uv2;
varying vec2 uv3;
uniform sampler2D tex_noise1 : source_color;
uniform sampler2D tex_noise2 : source_color;
uniform sampler2D tex_noise3 : source_color;
varying vec2 uv_sub;
void vertex()
{
@ -19,6 +23,7 @@ void vertex()
uv1 = local_uv / 32.0;
uv2 = local_uv / 32.0;
uv3 = local_uv / 8.0;
uv_sub = local_uv / 16.0;
}
bool is_in_focus(vec3 f_min,vec3 f_max){
@ -53,15 +58,24 @@ void fragment() {
brightness = brightness*0.6;
}
//通用网格纹理
float noise_value1 = texture(tex_noise1,floor(uv1 /0.02) *0.02).r;
float discrete_noise_value1 = floor(noise_value1 / 0.5) * 0.5;
float noise_value2 = texture(tex_noise2,floor(uv2 /0.02) *0.02).r;
float discrete_noise_value2 = floor(noise_value2 / 0.5) * 0.5;
float noise_value3 = texture(tex_noise3,floor(uv3 /0.02) *0.02).r;
float discrete_noise_value3 = floor(noise_value3 / 0.1) * 0.1;
c -= discrete_noise_value1 * 0.2;
c += discrete_noise_value2 * 0.2;
c -= discrete_noise_value3 * 0.08;
float noise_value_sub = texture(tex_noise_sub,floor(uv_sub /0.02) *0.02).r;
if (noise_value_sub > 0.2){
c.rgb = mix(c.rgb,tex_noise_sub_color.rgb,tex_noise_sub_color.a);
}else{
c -= discrete_noise_value1 * 0.2;
c += discrete_noise_value2 * 0.2;
c -= discrete_noise_value3 * 0.08;
}
//应用亮度
c.rgb = mix(vec3(0.0), c.rgb, brightness);
ALBEDO = c.rgb;
if(is_light){

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -11,7 +11,7 @@ data = {
"width": 64
}
[sub_resource type="ImageTexture" id="ImageTexture_2ckdg"]
[sub_resource type="ImageTexture" id="ImageTexture_xmqvm"]
image = SubResource("Image_eyj8x")
[resource]
@ -22,4 +22,4 @@ item/0/mesh_cast_shadow = 1
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
item/0/preview = SubResource("ImageTexture_2ckdg")
item/0/preview = SubResource("ImageTexture_xmqvm")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -72,24 +72,24 @@ tracks/4/keys = {
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("View:frame")
tracks/5/path = NodePath("Status:skill_move_speed")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.2, 0.3),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"values": [-1.0, 4.0, 0.0]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Status:skill_move_speed")
tracks/6/path = NodePath("View:frame")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0, 0.2, 0.3),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [-1.0, 4.0, 0.0]
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

@ -32,43 +32,45 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/type = "method"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Battle")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_sub_character"
}]
}
tracks/5/type = "method"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Battle")
tracks/5/path = NodePath("Effect")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
@ -76,42 +78,28 @@ tracks/5/keys = {
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_sub_character"
"method": &"cast_attack_particle1"
}]
}
tracks/6/type = "method"
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Effect")
tracks/6/path = NodePath("Status:skill_move_speed")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle1"
}]
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [2.0, 6.0, 0.0]
}
tracks/7/type = "value"
tracks/7/type = "method"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Status:skill_move_speed")
tracks/7/path = NodePath("Battle")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 0,
"values": [2.0, 6.0, 0.0]
}
tracks/8/type = "method"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Battle")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0.2),
"transitions": PackedFloat32Array(1),
"values": [{
@ -119,3 +107,15 @@ tracks/8/keys = {
"method": &"attack1"
}]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("View:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}

@ -121,24 +121,24 @@ tracks/6/keys = {
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("View:frame")
tracks/7/path = NodePath("Status:skill_float_speed")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0.1, 0.2),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
"values": [2.0, 0.0]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Status:skill_float_speed")
tracks/8/path = NodePath("View:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0.1, 0.2),
"transitions": PackedFloat32Array(1, 1),
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [2.0, 0.0]
"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
}

@ -32,43 +32,45 @@ tracks/1/keys = {
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("View:frame")
tracks/2/path = NodePath("Status:break_level")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7]
"values": [0, 3, 4]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Status:break_level")
tracks/3/path = NodePath("Status:speed_up_rate")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 0.3, 0.5),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [0, 3, 4]
"values": [-0.5, -1.0]
}
tracks/4/type = "value"
tracks/4/type = "method"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Status:speed_up_rate")
tracks/4/path = NodePath("Battle")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.1),
"transitions": PackedFloat32Array(1, 1),
"update": 1,
"values": [-0.5, -1.0]
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_sub_character"
}]
}
tracks/5/type = "method"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Battle")
tracks/5/path = NodePath("Effect")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
@ -76,20 +78,18 @@ tracks/5/keys = {
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_sub_character"
"method": &"cast_attack_particle1"
}]
}
tracks/6/type = "method"
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Effect")
tracks/6/path = NodePath("View:frame")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0.1),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [],
"method": &"cast_attack_particle1"
}]
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5, 6, 7]
}

File diff suppressed because one or more lines are too long

@ -69,6 +69,7 @@ shader_parameter/screen_size = Vector2(640, 360)
[sub_resource type="Animation" id="Animation_4kxot"]
resource_name = "end"
length = 0.8
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
@ -76,15 +77,16 @@ tracks/0/path = NodePath(".:duration")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 0.4),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [-2.0, -2.0, 1.0]
"values": [-2.0, 1.0]
}
[sub_resource type="Animation" id="Animation_x6v17"]
resource_name = "start"
length = 0.8
step = 0.1
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
@ -92,10 +94,10 @@ tracks/0/path = NodePath(".:duration")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.7, 0.8),
"transitions": PackedFloat32Array(1, 1, 1),
"times": PackedFloat32Array(0, 0.4),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [1.0, -2.0, -2.0]
"values": [1.0, -2.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_fofuj"]
@ -335,13 +337,12 @@ offset_bottom = 40.0
script = ExtResource("3_6chl0")
[node name="LoadingPage" type="Control" parent="."]
visible = false
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
script = ExtResource("4_jqajt")
duration = -2.0
duration = 1.0
[node name="ColorRect" type="ColorRect" parent="LoadingPage"]
material = SubResource("ShaderMaterial_b5bdl")

@ -1,18 +1,19 @@
extends Node3D
#基本信息
const pixel_size: float = 0.02
const grid_pixel_size: float = 32
const animation_frame_rate: float = 0.1
const pixel_size: float = 0.02
const grid_pixel_size: float = 32
const animation_frame_rate: float = 0.1
const animation_speed_scale: float = 1.0
#技能系统
const input_alive_time: float = 0.5
const bullet_cd: float = 0.1
const bullet_cd: float = 0.1
#移动
const drag_ground: float = 20
const drag_air: float = 5
const drag_air: float = 5
#关卡
const size_basic: Vector3 = Vector3(12.8, 6.4, 6.4)
const level_loading_time: float = 0.4
#ui
const weapon_anime_duration: float = 0.1
#pt

@ -131,7 +131,7 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
var mesh_library_deco2_id_list: Array[int] = []
var mesh_library_chara_id_list: Array[int] = []
var material_block_normal: Material = load("res://render/material/level_grid_block.tres") as Material
var material_grid_block: Material = load("res://render/material/level_grid_block.tres") as Material
var reimport_files: Array[String] = []
for file_name_full in path_list:
@ -168,13 +168,13 @@ func refresh_mesh_library(path_list: Array, from_editor_tool: bool = false):
if has_material:
var material: Material = mesh.surface_get_material(0) as Material
var material_set: Material = material_block_normal
var material_set: Material = material_grid_block
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:
print("surface_set_material")
mesh.surface_set_material(0, material_block_normal)
mesh.surface_set_material(0, material_grid_block)
ResourceSaver.save(mesh, file_name_full)
if has_shape:

@ -16,7 +16,6 @@ var velocity_cache: Vector3
func _process(delta) -> void:
if Global.is_level_loading: return
if status.is_pause: return
if status.is_be_throw: return
move_tick(delta)
@ -24,7 +23,7 @@ func _process(delta) -> void:
func move_tick(delta) -> bool:
var is_hit_floor: bool = update_on_floor(delta)
var is_hit_floor: bool = update_on_floor()
update_move(delta)
update_speed_y(delta)
var is_against_wall: bool = update_move_check(delta)
@ -41,9 +40,9 @@ func move_tick(delta) -> bool:
return is_against_wall
func update_on_floor(delta) -> bool:
func update_on_floor() -> bool:
var is_on_floor: bool = character.is_on_floor()
var is_hit: bool = not status.is_on_floor and is_on_floor
var is_hit: bool = not status.is_on_floor and is_on_floor
status.is_on_floor = is_on_floor
if status.is_on_floor and not status.is_jumping:
status.is_jumped = false
@ -67,20 +66,20 @@ func update_speed_y(delta) -> void:
func update_move(delta):
var move_velocity: Vector2 = status.move_dir.normalized() * (status.cfg.move.speed * (1 + status.speed_up_rate))
var skill_velocity: Vector2 = status.skill_move_dir * status.skill_move_speed if not status.skill_move_stop else Vector2.ZERO
var move_velocity: Vector2 = status.move_dir.normalized() * (status.cfg.move.speed * (1 + status.speed_up_rate))
var skill_velocity: Vector2 = status.skill_move_dir * status.skill_move_speed if not status.skill_move_stop else Vector2.ZERO
var hit_back_velocity: Vector2 = status.hit_back_dir * status.hit_back_speed
move_velocity += skill_velocity + hit_back_velocity
status.speed_dir = Vector2(move_velocity.x, move_velocity.y)
if skill_velocity.length() >0:
move_velocity *= (1-status.speed_down_push_rate)
if skill_velocity.length() > 0:
move_velocity *= (1 - status.speed_down_push_rate)
if move_velocity.length() == 0:
move_velocity = Vector2(character.velocity.x, character.velocity.z);
if status.is_on_floor:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_ground*delta)
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_ground * delta)
else:
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_air*delta)
move_velocity = Util.vector_reduce(move_velocity, Setting.drag_air * delta)
character.velocity.x = move_velocity.x
character.velocity.z = move_velocity.y
@ -90,15 +89,15 @@ func update_move(delta):
status.is_right = status.move_dir.x > 0
func update_deformation(delta):
func update_deformation(_delta):
var velocity_change_sum: float = status.velocity_change.x + status.velocity_change.y + status.velocity_change.z
if velocity_change_sum > 6:
var velocity_change_x: float = status.velocity_change.x
var velocity_change_y: float = status.velocity_change.y + status.velocity_change.z
var dir_x: int = 1 if (velocity_change_x > 1) or (velocity_change_y < -1) else 0
var dir_y: int = 1 if (velocity_change_y > 1) or (velocity_change_x < -1) else 0
var dir_x: int = 1 if (velocity_change_x > 1) or (velocity_change_y < -1) else 0
var dir_y: int = 1 if (velocity_change_y > 1) or (velocity_change_x < -1) else 0
if dir_x or dir_y:
status.deformation_dir=Vector2(dir_x, dir_y)
status.deformation_dir = Vector2(dir_x, dir_y)
character.add_buff("deformation", 0.2)
@ -109,8 +108,8 @@ func update_move_effect(delta):
Enum.ECharacterType.Monster: pass
_: return
var speed: float = character.velocity.length()
var speed_rate: float = clamp(speed / after_image_speed_max, 0, 1)
var speed: float = character.velocity.length()
var speed_rate: float = clamp(speed / after_image_speed_max, 0, 1)
var after_image_alpha: float = clamp(after_image_speed_curve.sample(speed_rate), 0, 1)
if after_image_alpha > 0:
effect.cast_after_image(after_image_alpha)
@ -137,8 +136,8 @@ func update_move_check(delta) -> bool:
if normal_speed < -6 and normal.y >= 0 and not buff.has_buff("hit_ground_cd"):
#墙体互动
Global.effect_mgr.cast_particle(ResourceManager.particle_hit_ground_heavy, character.pos(), normal)
var velocity_new: Vector3 = velocity - normal * normal_speed * 2
var attack_dir: Vector2 = Vector2(velocity_new.x, velocity_new.z).normalized()
var velocity_new: Vector3 = velocity - normal * normal_speed * 2
var attack_dir: Vector2 = Vector2(velocity_new.x, velocity_new.z).normalized()
character.velocity = Vector3.ZERO
var attack_info: Struct.AttackInfo = Struct.AttackInfo.new()
attack_info.attack = ResourceManager.cfg_attack_rebound
@ -146,7 +145,7 @@ func update_move_check(delta) -> bool:
attack_info.attack_dir = attack_dir
battle.add_attack(attack_info)
buff.add_buff("hit_ground_cd", 0.1)
elif normal_speed <-3:
elif normal_speed < -3:
#反弹
Global.effect_mgr.cast_particle(ResourceManager.particle_hit_ground_normal, character.pos(), normal)
character.velocity = velocity - normal * normal_speed * 1.5
@ -161,7 +160,7 @@ func update_move_check(delta) -> bool:
func jump():
character.velocity.y = status.cfg.move.jump_velocity
status.is_jumped = true
# status.is_jumped = true
status.trigger_jump = true
buff.add_buff("jumping", 0.1)
if status.is_on_floor:

@ -10,7 +10,7 @@ var view_focus_off: Callable = view_focus_off_func
@export var size: Vector3i = Vector3i.ONE:
set(value):
if (value.x<1) or (value.y<1) or (value.z<1):
if (value.x < 1) or (value.y < 1) or (value.z < 1):
value = Vector3i.ONE
size = value
_on_size_change()
@ -21,6 +21,7 @@ var view_focus_off: Callable = view_focus_off_func
@export var id_from: int = 0
@export var id_to: int = 0
@export_tool_button("替换", "Callable")
var replace_id: Callable = replace_id_func
@ -28,40 +29,40 @@ var replace_id: Callable = replace_id_func
var print_item: Callable = print_item_func
func view_focus_on_func()->void:
func view_focus_on_func() -> void:
grid_block_material.set_shader_parameter("is_focus", true)
set_focus()
func view_focus_off_func()->void:
func view_focus_off_func() -> void:
grid_block_material.set_shader_parameter("is_focus", false)
set_focus()
func replace_id_func()->void:
func replace_id_func() -> void:
var level_main: GridMap = %LevelGridMain as GridMap
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
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):
for z in range(id_min.z, id_max.z+1):
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)
if level_main.get_cell_item(pos) == id_from:
level_main.set_cell_item(pos, id_to, level_main.get_cell_item_orientation(pos))
func print_item_func ()-> void:
var level_main: GridMap = %LevelGridMain as GridMap
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
var mesh_library: MeshLibrary = level_main.get_mesh_library()
func print_item_func() -> void:
var level_main: GridMap = %LevelGridMain as GridMap
var id_min: Vector3i = Util.get_level_grid_pos2(pos_min())
var id_max: Vector3i = Util.get_level_grid_pos2(pos_max())
var mesh_library: MeshLibrary = level_main.get_mesh_library()
var item_count_map: Dictionary = {}
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):
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_main.get_cell_item(pos)
var item_id: int = level_main.get_cell_item(pos)
if item_id != GridMap.INVALID_CELL_ITEM:
if item_count_map.has(item_id):
item_count_map[item_id] += 1
@ -71,7 +72,6 @@ func print_item_func ()-> void:
print("[", item_id, "]", mesh_library.get_item_name(item_id), ":", item_count_map[item_id])
@onready var grid_block_material: Material = load("res://render/material/level_grid_block.tres") as Material
#character
@ -109,14 +109,14 @@ class GridMainCacheCellData:
func _on_size_change() -> void:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var size_basic: Vector3 = Setting.size_basic
level_range.size = Vector3(size.x*size_basic.x, size.y*size_basic.y, size.z*size_basic.z)
var size_basic: Vector3 = Setting.size_basic
level_range.size = Vector3(size.x * size_basic.x, size.y * size_basic.y, size.z * size_basic.z)
level_range.position = level_range.size / 2
func get_level_size() -> Vector2:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var level_size: Vector3 = level_range.size
var level_size: Vector3 = level_range.size
return Vector2(level_size.x, level_size.z)
@ -132,22 +132,22 @@ func set_level_range_visible(value: bool) -> void:
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.640001, 0.640001)
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.640001, 0.640001)
grid_block_material.set_shader_parameter("focus_min", focus_min)
grid_block_material.set_shader_parameter("focus_max", focus_max)
func init_level_character() -> void:
var level_character: GridMap = %LevelGridCharacter as GridMap
var level_character: GridMap = %LevelGridCharacter as GridMap
character_spots = []
character_born_spots = []
level_active_spots = []
enemy_cfgs = []
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()
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()
var used_cells: Array[Vector3i] = level_character.get_used_cells()
for pos in used_cells:
if pos.x < id_min.x or pos.x > id_max.x:
@ -157,7 +157,7 @@ func init_level_character() -> void:
if pos.z < id_min.z or pos.z > id_max.z:
continue
var float_pos: Vector3 = Util.get_level_float_pos(pos)
var item_id: int = level_character.get_cell_item(pos)
var item_id: int = level_character.get_cell_item(pos)
if item_id == GridMap.INVALID_CELL_ITEM:
continue
var item_name: String = mesh_library.get_item_name(item_id)
@ -166,7 +166,7 @@ func init_level_character() -> void:
character_born_spot.pos = float_pos
character_born_spots.append(character_born_spot)
elif item_name.begins_with("chara_enemy_"):
var character_name: String = item_name.trim_prefix("chara_enemy_")
var character_name: String = item_name.trim_prefix("chara_enemy_")
var character_cfg: CharacterCfg = Util.get_character_cfg_by_name(character_name)
if not character_cfg:
continue
@ -181,7 +181,7 @@ func init_level_character() -> void:
continue
var level_active_spot = LevelActiveSpot.new()
level_active_spot.scene = scene
level_active_spot.pos = float_pos
level_active_spot.pos = float_pos
level_active_spots.append(level_active_spot)
for enemy_num: LevelEnemy in enemy_nums:
@ -197,82 +197,88 @@ func init_level_main() -> void:
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):
var pos: Vector3i = Vector3i(x, id_min.y, z)
var id: int = level_main.get_cell_item(pos)
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;
# 需要延申空气墙的黑块
var air_wall_mark_black_list: Array[Vector3i] = []
# 正前面黑块
for x in range(id_min.x + 1, id_max.x):
var pos: Vector3i = Vector3i(x, id_min.y, id_max.z)
var has_link = false
var mark_black_list_check: Array[Vector3i] = []
for y in range(id_min.y, id_max.y):
var pos_check: Vector3i = Vector3i(x, y, id_max.z)
if not check_grid(level_main, pos_check):
has_link = true
break
mark_black_list_check.append(pos_check)
if has_link:
for pos_check in mark_black_list_check:
mark_black_list.append(pos_check)
air_wall_mark_black_list.append(pos_check)
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)
# 底面黑块延申空气墙
mark_black_list.append(pos)
air_wall_mark_black_list.append(pos)
# 左面黑块
var black_y_max_left: int = id_max.y - 1
for z in range(id_min.z + 1, id_max.z + 1):
var pos: Vector3i = Vector3i(id_min.x, id_min.y, z)
var has_link = false
var mark_black_list_check: Array[Vector3i] = []
for y in range(id_min.y - 1, black_y_max_left):
var pos_check: Vector3i = Vector3i(id_min.x, y + 1, z)
if not check_grid(level_main, pos_check):
has_link = true
black_y_max_left = max(y, id_min.y)
if y + 1 < id_max.y:
air_wall_mark_black_list.append(pos_check + Vector3i(0, 1, 0))
break
mark_black_list_check.append(pos_check)
if not has_link:
for pos_check in mark_black_list_check:
mark_black_list.append(pos_check)
var pos_check: Vector3i = Vector3i(id_min.x, black_y_max_left, z)
air_wall_mark_black_list.append(pos_check)
# 右边面黑块
var black_y_max_right: int = id_max.y - 1
for z in range(id_min.z + 1, id_max.z + 1):
var pos: Vector3i = Vector3i(id_max.x, id_min.y, z)
var has_link = false
var mark_black_list_check: Array[Vector3i] = []
for y in range(id_min.y - 1, black_y_max_right):
var pos_check: Vector3i = Vector3i(id_max.x, y + 1, z)
if not check_grid(level_main, pos_check):
has_link = true
black_y_max_right = max(y, id_min.y)
if y + 1 < id_max.y:
air_wall_mark_black_list.append(pos_check + Vector3i(0, 1, 0))
break
mark_black_list_check.append(pos_check)
if not has_link:
for pos_check in mark_black_list_check:
mark_black_list.append(pos_check)
var pos_check: Vector3i = Vector3i(id_max.x, black_y_max_right, z)
air_wall_mark_black_list.append(pos_check)
# 黑块cache
for mark_black in mark_black_list:
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):
# 黑块延申空气墙
for mark_black in air_wall_mark_black_list:
for y in range(mark_black.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):
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)
if level_main.get_cell_item(pos_down) == GridMap.INVALID_CELL_ITEM or pos_down in mark_white_list:
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
@ -292,12 +298,12 @@ func add_grid_main_cache_cell(level_main: GridMap, pos: Vector3i) -> void:
return
var cache_data = GridMainCacheCellData.new()
cache_data.pos = pos
cache_data.id = id
cache_data.orientation= level_main.get_cell_item_orientation(pos)
cache_data.id = id
cache_data.orientation = level_main.get_cell_item_orientation(pos)
grid_main_cache_cells.append(cache_data)
func set_replace(is_active: bool, last_grid_main_cache_cells: Array[GridMainCacheCellData] = [])-> 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())
@ -347,7 +353,7 @@ func pos_min() -> Vector3:
func pos_max() -> Vector3:
var level_range: CSGBox3D = $LevelRange as CSGBox3D
var level_size: Vector3 = level_range.size
var level_size: Vector3 = level_range.size
return get_global_position() + level_size

@ -4,24 +4,24 @@ class_name CameraManager
@export var global_effect_curve: Curve
var target: int
var target_character_pos: Vector2 = Vector2.ZERO
var target_pos: Vector2 = Vector2.ZERO
var target_character_pos: Vector2 = Vector2.ZERO
var target_pos: Vector2 = Vector2.ZERO
var target_pos_y: float
var target_pos_now: Vector2 = Vector2.ZERO
var level_size: Vector2 = Vector2(12.8, 7.68)
var level_pos: Vector2 = Vector2.ZERO
var offset: float = 10
var target_pos_now: Vector2 = Vector2.ZERO
var level_size: Vector2 = Vector2(12.8, 7.68)
var level_pos: Vector2 = Vector2.ZERO
var offset: float = 10
var shake_offset_x: float
var camera_limit: Vector3 = Vector3(6.4, 1.7, 2.95) #x,z-up,z-down
var camera_size: float = 7.2
var basic_size: Vector2 = Vector2(640, 360)
var scale_y: float = cos(deg_to_rad(45.0)) * 2.0 #1.414
var sample_rate: float = 3.6
var stage_size: Vector2 = basic_size * sample_rate
var stage_scale: Vector2 = Vector2(1, scale_y) / sample_rate
var stage_offset_y: float = (scale_y - 1.0) * 0.5 / sample_rate * stage_size.y
var screen_pos_scale: Vector2 = Vector2(sample_rate, sample_rate/scale_y)
var screen_pos_offset: Vector2 = Vector2(0, -stage_offset_y)
var camera_limit: Vector3 = Vector3(6.4, 1.7, 2.95) # x,z-up,z-down
var camera_size: float = 7.2
var basic_size: Vector2 = Vector2(640, 360)
var scale_y: float = cos(deg_to_rad(45.0)) * 2.0 # 1.414
var sample_rate: float = 3.6
var stage_size: Vector2 = basic_size * sample_rate
var stage_scale: Vector2 = Vector2(1, scale_y) / sample_rate
var stage_offset_y: float = (scale_y - 1.0) * 0.5 / sample_rate * stage_size.y
var screen_pos_scale: Vector2 = Vector2(sample_rate, sample_rate / scale_y)
var screen_pos_offset: Vector2 = Vector2(0, -stage_offset_y)
var global_effect_list: Array[Variant] = []
@ -54,14 +54,14 @@ func update_global_effect(delta):
global_effect.life_time_now = min(global_effect.life_time_now, global_effect.life_time)
if global_effect.life_time_now == global_effect.life_time:
remove_list.append(global_effect)
var rate: float = global_effect.life_time_now/global_effect.life_time
var value: float = global_effect_curve.sample(rate)*global_effect.value
var rate: float = global_effect.life_time_now / global_effect.life_time
var value: float = global_effect_curve.sample(rate) * global_effect.value
match global_effect.effect_type:
Enum.EGlobalEffect.CameraSize:
size = camera_size * (1 - value)
refresh_target_pos()
Enum.EGlobalEffect.CameraShake:
shake_offset_x = (sin(rate * PI * 10) - 0.5)*0.04*value
shake_offset_x = (sin(rate * PI * 10) - 0.5) * 0.04 * value
Enum.EGlobalEffect.ColorShift:
Global.view_mgr.set_post_processing("shift_strength", value)
Enum.EGlobalEffect.Blur:
@ -83,12 +83,12 @@ func update_camera_pos(delta):
func target_pos_lerp(index: int, delta: float, delta_scale: float):
var target_pos_real: Vector2 = target_pos
var diff = abs(target_pos_now[index] - target_pos_real[index])
var diff = abs(target_pos_now[index] - target_pos_real[index])
if diff < Setting.pixel_size:
target_pos_now[index] = target_pos_real[index]
else:
var weight_min = Setting.pixel_size / 2 / diff
var weight = max(delta * delta_scale, weight_min)
var weight = max(delta * delta_scale, weight_min)
target_pos_now[index] = lerp(target_pos_now[index], target_pos_real[index], weight)
@ -111,23 +111,23 @@ func on_character_destroy(id: int): target = 0
func refresh_target_pos():
var pos: Vector2 = target_character_pos
var camera_size_diff: float = (camera_size - size)/2.0
var x_min: float = level_pos.x + camera_limit.x - camera_size_diff
var x_max: float = level_pos.x + level_size.x - camera_limit.x + camera_size_diff
var y_min: float = level_pos.y + camera_limit.y - target_pos_y - camera_size_diff
var y_max: float = level_pos.y + level_size.y - camera_limit.z - target_pos_y + camera_size_diff
var pos: Vector2 = target_character_pos
var camera_size_diff: float = (camera_size - size) / 2.0
var x_min: float = level_pos.x + camera_limit.x - camera_size_diff
var x_max: float = level_pos.x + level_size.x - camera_limit.x + camera_size_diff
var y_min: float = level_pos.y + camera_limit.y - target_pos_y - camera_size_diff
var y_max: float = level_pos.y + level_size.y - camera_limit.z - target_pos_y + camera_size_diff
target_pos.x = Util.snap_float(clamp(pos.x, x_min, x_max))
target_pos.y = Util.snap_float(clamp(pos.y-target_pos_y, y_min, y_max))
target_pos.y = Util.snap_float(clamp(pos.y - target_pos_y, y_min, y_max))
func on_level_size_change(size: Vector2): level_size = size
func on_level_size_change(size_new: Vector2): level_size = size_new
func on_level_pos_change(pos: Vector2): level_pos = pos
func on_level_pos_change(pos_new: Vector2): level_pos = pos_new
func on_level_loading_end():
refresh_target_pos()
target_pos_now.x = target_pos.x
target_pos_now.y = target_pos.y
@ -162,8 +162,8 @@ func effect(pause_time) -> void:
if not pause_time:
return
var basic_pause_time: float = 0.3
var effect_time = pause_time * 2
var rate = pause_time/basic_pause_time
var effect_time = pause_time * 2
var rate = pause_time / basic_pause_time
add_global_effect(Enum.EGlobalEffect.CameraShake, effect_time, 0.8 * rate)
add_global_effect(Enum.EGlobalEffect.CameraSize, effect_time, 0.1 * rate)
add_global_effect(Enum.EGlobalEffect.ColorShift, effect_time, 0.8 * rate)
@ -176,7 +176,7 @@ func effect_shake(pause_time) -> void:
if not pause_time:
return
var basic_pause_time: float = 0.3
var effect_time = pause_time * 2
var rate = pause_time/basic_pause_time
var effect_time = pause_time * 2
var rate = pause_time / basic_pause_time
add_global_effect(Enum.EGlobalEffect.CameraShake, effect_time, 0.8 * rate)
return

@ -1,8 +1,8 @@
extends Node3D
func _input(event) -> void:
if !event.is_action_type():
return
if !event.is_action_type(): return
for action_name in InputMap.get_actions():
if event.is_action_pressed(action_name):
SignalManager.input_action_pressed.emit(action_name)

@ -5,14 +5,14 @@ var target: int
var level: Level
var cur_level_instance: LevelInstance
var level_instance_dict: Dictionary = {}
var level_loading_rate: float
var level_loading_time: float
var level_active_spots: Array[Node]
var level_character_born_spots: Array[LevelInstance.ChacacterBornSpot]
var level_enemy_cfgs: Array[CharacterCfg]
var level_doors: Array[LevelDoor]
var is_level_active: bool
var enemy_count: int #由关卡生成的怪物数量
var current_enmey: Array[int] #当前存活怪物id
var enemy_count: int # 由关卡生成的怪物数量
var current_enmey: Array[int] # 当前存活怪物id
var replace_cache: Array[LevelInstance]
@ -40,10 +40,12 @@ func init():
func _process(delta) -> void:
if not level:
return
if level_loading_rate < 1:
level_loading_rate += delta *2
if level_loading_rate > 1:
level_loading_rate = 1
if level_loading_time > 0:
level_loading_time -= delta
if level_loading_time <= 0:
enter_level()
SignalManager.level_loading_end.emit()
Global.is_level_loading = false
func get_born_pos() -> Vector3:
@ -81,19 +83,25 @@ func set_player_position(pos: Vector3) -> void:
level.set_player_position(pos)
var new_level_instance: LevelInstance = get_level_by_pos(pos)
if not new_level_instance:
return #todo 不存在的关卡 主角直接死亡
if cur_level_instance:
return # todo 不存在的关卡 主角直接死亡
var is_first_level: bool = cur_level_instance == null
if !is_first_level:
if new_level_instance == cur_level_instance:
check_level_active(pos)
return
new_level_instance.set_focus()
cur_level_instance = new_level_instance
enter_level()
if is_first_level:
enter_level()
else:
SignalManager.level_loading_start.emit()
Global.is_level_loading = true
level_loading_time = Setting.level_loading_time
func enter_level() -> void:
SignalManager.level_loading_start.emit()
cur_level_instance.set_focus()
is_level_active = false
level_active_spots = []
level_doors = []
@ -123,12 +131,9 @@ func enter_level() -> void:
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())
SignalManager.level_pos_change.emit(cur_level_instance.get_level_pos())
SignalManager.level_loading_end.emit()
func check_level_active(pos: Vector3) -> void:
if is_level_active:
@ -150,12 +155,12 @@ func check_level_active(pos: Vector3) -> void:
func get_level_id_list(pos: Vector3, size: Vector3i) -> Array[Vector3i]:
var size_basic: Vector3 = Setting.size_basic
var size_basic: Vector3 = Setting.size_basic
var ret: Array[Vector3i] = []
for x in range(size.x):
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)
var pos_sub: Vector3 = pos + Vector3(x * size_basic.x, y * size_basic.y, z * size_basic.z)
ret.append(Util.get_level_id(pos_sub))
return ret
@ -169,16 +174,16 @@ func enemy_born(count: int) -> bool:
return false
var count_start: int = enemy_count
for i in count:
var cfg_index: int = count_start + i
var cfg: CharacterCfg = level_enemy_cfgs[cfg_index]
var pos_index: int = enemy_count % level_character_born_spots.size()
var cfg_index: int = count_start + i
var cfg: CharacterCfg = level_enemy_cfgs[cfg_index]
var pos_index: int = enemy_count % level_character_born_spots.size()
var character_spot: LevelInstance.ChacacterBornSpot = level_character_born_spots[pos_index]
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:
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)

@ -12,9 +12,9 @@ var color_material: ShaderMaterial
func _ready():
color_material = $ColorRect.material as ShaderMaterial
# SignalManager.level_loading_start.connect(on_level_loading_start)
# SignalManager.level_loading_end.connect(on_level_loading_end)
SignalManager.level_loading_start.connect(on_level_loading_start)
SignalManager.level_loading_end.connect(on_level_loading_end)
visible = true
func on_level_loading_start():

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Loading…
Cancel
Save