diff --git a/DungeonShooting_Godot/prefab/test/TestActivity.tscn b/DungeonShooting_Godot/prefab/test/TestActivity.tscn index 475c7ad..4f7ee6c 100644 --- a/DungeonShooting_Godot/prefab/test/TestActivity.tscn +++ b/DungeonShooting_Godot/prefab/test/TestActivity.tscn @@ -1,24 +1,22 @@ -[gd_scene load_steps=7 format=3] +[gd_scene load_steps=7 format=3 uid="uid://bjf0e6nehg51j"] [ext_resource type="Shader" path="res://resource/materlal/Blend.gdshader" id="1"] [ext_resource type="Script" path="res://src/framework/activity/ActivityObjectTemplate.cs" id="2"] [ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="3"] - - [sub_resource type="ShaderMaterial" id="ShaderMaterial_rxkv3"] resource_local_to_scene = true shader = ExtResource("1") shader_parameter/blend = Color(0, 0, 0, 0.470588) shader_parameter/schedule = 1 -[sub_resource type="ShaderMaterial" id="ShaderMaterial_s2ghg"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_aaga8"] resource_local_to_scene = true shader = ExtResource("1") shader_parameter/blend = Color(1, 1, 1, 1) shader_parameter/schedule = 0 -[sub_resource type="SpriteFrames" id="SpriteFrames_4au77"] +[sub_resource type="SpriteFrames" id="SpriteFrames_kkdcb"] animations = [{ "frames": [{ "duration": 1.0, @@ -36,10 +34,8 @@ z_index = -5 material = SubResource("ShaderMaterial_rxkv3") -[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] -material = SubResource("ShaderMaterial_s2ghg") -sprite_frames = SubResource("SpriteFrames_4au77") +[node name="AnimatedSprite" type="AnimatedSprite2D" parent="."] +material = SubResource("ShaderMaterial_aaga8") +sprite_frames = SubResource("SpriteFrames_kkdcb") [node name="Collision" type="CollisionShape2D" parent="."] - -[node name="AnimationPlayer" type="AnimationPlayer" parent="."] diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 9e54ad1..a70d5cf 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -81,16 +81,36 @@ } } } - + /// <summary> /// 当前物体的海拔高度, 如果大于0, 则会做自由落体运动, 也就是执行投抛代码 /// </summary> - public float Altitude { get; set; } + public float Altitude + { + get => _altitude; + set + { + _altitude = value; + _hasResilienceVerticalSpeed = false; + } + } + + private float _altitude = 0; /// <summary> /// 物体纵轴移动速度, 如果设置大于0, 就可以营造向上投抛物体的效果, 该值会随着重力加速度衰减 /// </summary> - public float VerticalSpeed { get; set; } + public float VerticalSpeed + { + get => _verticalSpeed; + set + { + _verticalSpeed = value; + _hasResilienceVerticalSpeed = false; + } + } + + private float _verticalSpeed; /// <summary> /// 物体投抛时旋转速度, 角度制 @@ -117,6 +137,11 @@ /// </summary> public Vector2 ThrowCollisionSize { get; set; } = new Vector2(-1, -1); + /// <summary> + /// 是否启用垂直方向上的运动模拟, 默认开启, 如果禁用, 那么下落和投抛效果, 同样 Throw() 函数也将失效 + /// </summary> + public bool EnableVerticalMotion { get; set; } = true; + // -------------------------------------------------------------------------------- //组件集合 @@ -649,7 +674,7 @@ _firstFall = true; _hasResilienceVerticalSpeed = false; _resilienceVerticalSpeed = 0; - + if (ThrowCollisionSize.X < 0 && ThrowCollisionSize.Y < 0) { _throwRectangleShape.Size = GetDefaultTexture().GetSize(); @@ -663,75 +688,79 @@ } else { - GlobalRotationDegrees = GlobalRotationDegrees + ThrowRotationDegreesSpeed * newDelta; - - var ysp = VerticalSpeed; - - Altitude += VerticalSpeed * newDelta; - VerticalSpeed -= GameConfig.G * newDelta; - - //当高度大于16时, 显示在所有物体上 - if (Altitude >= 16) + if (EnableVerticalMotion) //如果启用了纵向运动, 则更新运动 { - AnimatedSprite.ZIndex = 20; - } - else - { - AnimatedSprite.ZIndex = 0; - } - - //达到最高点 - if (ysp > 0 && ysp * VerticalSpeed < 0) - { - OnThrowMaxHeight(Altitude); - } + GlobalRotationDegrees = GlobalRotationDegrees + ThrowRotationDegreesSpeed * newDelta; - //落地判断 - if (Altitude <= 0) - { - _isFallOver = true; - Altitude = 0; + var ysp = VerticalSpeed; - //第一次接触地面 - if (_firstFall) + _altitude += VerticalSpeed * newDelta; + _verticalSpeed -= GameConfig.G * newDelta; + + //当高度大于16时, 显示在所有物体上 + if (Altitude >= 16) { - _firstFall = false; - OnFirstFallToGround(); + AnimatedSprite.ZIndex = 20; + } + else + { + AnimatedSprite.ZIndex = 0; + } + + //达到最高点 + if (ysp > 0 && ysp * VerticalSpeed < 0) + { + OnThrowMaxHeight(Altitude); } - MoveController.ScaleAllForce(BounceSpeed); - //如果落地高度不够低, 再抛一次 - if (Bounce && (!_hasResilienceVerticalSpeed || _resilienceVerticalSpeed > 1)) + //落地判断 + if (Altitude <= 0) { - if (!_hasResilienceVerticalSpeed) - { - _hasResilienceVerticalSpeed = true; - _resilienceVerticalSpeed = -VerticalSpeed * BounceStrength; - } - else - { - _resilienceVerticalSpeed = _resilienceVerticalSpeed * BounceStrength; - } - VerticalSpeed = _resilienceVerticalSpeed; - ThrowRotationDegreesSpeed = ThrowRotationDegreesSpeed * BounceStrength; - _isFallOver = false; + _altitude = 0; - OnFallToGround(); - } - else //结束 - { - VerticalSpeed = 0; - - if (_throwForce != null) + //第一次接触地面 + if (_firstFall) { - MoveController.RemoveForce(_throwForce); - _throwForce = null; + _firstFall = false; + OnFirstFallToGround(); } - - OnFallToGround(); - ThrowOver(); + + MoveController.ScaleAllForce(BounceSpeed); + //如果落地高度不够低, 再抛一次 + if (Bounce && (!_hasResilienceVerticalSpeed || _resilienceVerticalSpeed > 1)) + { + if (!_hasResilienceVerticalSpeed) + { + _hasResilienceVerticalSpeed = true; + _resilienceVerticalSpeed = -VerticalSpeed * BounceStrength; + } + else + { + _resilienceVerticalSpeed = _resilienceVerticalSpeed * BounceStrength; + } + _verticalSpeed = _resilienceVerticalSpeed; + ThrowRotationDegreesSpeed = ThrowRotationDegreesSpeed * BounceStrength; + _isFallOver = false; + + OnFallToGround(); + } + else //结束 + { + _verticalSpeed = 0; + + if (_throwForce != null) + { + MoveController.RemoveForce(_throwForce); + _throwForce = null; + } + _isFallOver = true; + + OnFallToGround(); + ThrowOver(); + } } } + //计算精灵位置 CalcThrowAnimatedPosition(); } @@ -1009,7 +1038,11 @@ CalcThrowAnimatedPosition(); //显示阴影 ShowShadowSprite(); - OnThrowStart(); + + if (EnableVerticalMotion) + { + OnThrowStart(); + } } /// <summary> diff --git a/DungeonShooting_Godot/src/game/room/RoomManager.cs b/DungeonShooting_Godot/src/game/room/RoomManager.cs index 5e26ca9..f3afe6a 100644 --- a/DungeonShooting_Godot/src/game/room/RoomManager.cs +++ b/DungeonShooting_Godot/src/game/room/RoomManager.cs @@ -91,9 +91,12 @@ Player.Position = new Vector2(30, 30); Player.Name = "Player"; Player.PutDown(RoomLayerEnum.YSortLayer); - Player.PickUpWeapon(ActivityObject.Create<Weapon>(ActivityIdPrefix.Weapon + "0001")); + // var weapon = ActivityObject.Create(ActivityIdPrefix.Test + "0001"); + // weapon.PutDown(new Vector2(200, 200), RoomLayerEnum.NormalLayer); + // //weapon.Altitude = 50; + // for (int i = 0; i < 10; i++) // { // var enemy = ActivityObject.Create<Enemy>(ActivityIdPrefix.Enemy + "0001"); diff --git a/DungeonShooting_Godot/src/test/TestActivity.cs b/DungeonShooting_Godot/src/test/TestActivity.cs index 21445ed..ef47a9e 100644 --- a/DungeonShooting_Godot/src/test/TestActivity.cs +++ b/DungeonShooting_Godot/src/test/TestActivity.cs @@ -1,11 +1,48 @@ using Godot; -[RegisterActivity(ActivityIdPrefix.Test + "1", ResourcePath.prefab_test_TestActivity_tscn)] +[RegisterActivity(ActivityIdPrefix.Test + "0001", ResourcePath.prefab_test_TestActivity_tscn)] public partial class TestActivity : ActivityObject { public override void OnInit() { - var externalForce = MoveController.AddConstantForce("move"); - externalForce.Velocity = new Vector2(0, 60); + EnableVerticalMotion = false; + } + + protected override void Process(float delta) + { + if (Input.IsActionJustPressed("fire")) + { + Altitude = 100; + } + + if (Input.IsActionJustPressed("interactive")) + { + EnableVerticalMotion = !EnableVerticalMotion; + } + } + + protected override void OnFallToGround() + { + GD.Print("OnFallToGround"); + } + + protected override void OnFirstFallToGround() + { + GD.Print("OnFirstFallToGround"); + } + + protected override void OnThrowStart() + { + GD.Print("OnThrowStart"); + } + + protected override void OnThrowMaxHeight(float height) + { + GD.Print("OnThrowMaxHeight: " + height); + } + + protected override void OnThrowOver() + { + GD.Print("OnThrowOver"); } } \ No newline at end of file