Flashlight collider, enable YSort, bug: character is shaking while moving
This commit is contained in:
parent
a610cd0561
commit
434493578c
5 changed files with 114 additions and 51 deletions
|
@ -1,52 +1,72 @@
|
|||
using System;
|
||||
using Godot;
|
||||
|
||||
public partial class Flashlight : Node
|
||||
{
|
||||
[Export] public Player Player;
|
||||
[Export] public GameCamera Camera;
|
||||
[Export] public Player Player;
|
||||
[Export] public GameCamera Camera;
|
||||
|
||||
[Export] public Node2D Circle;
|
||||
[Export] public Node2D PlayerCircle;
|
||||
[Export] public Polygon2D Polygon;
|
||||
[Export] public Node2D Circle;
|
||||
[Export] public Node2D PlayerCircle;
|
||||
[Export] public Polygon2D Polygon;
|
||||
|
||||
private float FlashlightRadius = Constants.MaxFlashlightRadius;
|
||||
[Export] public CollisionShape2D CollisionCircle;
|
||||
[Export] public CollisionShape2D CollisionPlayerCircle;
|
||||
[Export] public CollisionPolygon2D CollisionPolygon;
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
var playerScreenCenterPosition = Player.Position - Camera.Position;
|
||||
var flashlightScreenCenterPosition = Camera.FlashlightPosition - Camera.Position;
|
||||
private float FlashlightRadius = Constants.MaxFlashlightRadius;
|
||||
|
||||
var playerScreenPosition = playerScreenCenterPosition + Constants.HalfScreenSize;
|
||||
PlayerCircle.Position = playerScreenPosition;
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
|
||||
var d = Camera.FlashlightPosition.DistanceTo(Player.Position);
|
||||
FlashlightRadius = Mathf.Lerp(Constants.MinFlashlightRadius, Constants.MaxFlashlightRadius,
|
||||
Mathf.Clamp(d - Constants.MinFlashlightDistance, 0,
|
||||
Constants.MaxFlashlightDistance - Constants.MinFlashlightDistance) / Constants.MaxFlashlightDistance);
|
||||
|
||||
var flashlightScreenPosition = flashlightScreenCenterPosition + Constants.HalfScreenSize;
|
||||
var flashlightScale = FlashlightRadius / Constants.MaxFlashlightRadius;
|
||||
Circle.Position = flashlightScreenPosition;
|
||||
Circle.Scale = new Vector2(flashlightScale, flashlightScale);
|
||||
if (CollisionCircle.Shape is not CircleShape2D)
|
||||
throw new Exception("Invalid collision shape on the circle");
|
||||
if (CollisionPlayerCircle.Shape is not CircleShape2D)
|
||||
throw new Exception("Invalid collision shape on the player circle");
|
||||
}
|
||||
|
||||
if (d <= FlashlightRadius)
|
||||
Polygon.Visible = false;
|
||||
else
|
||||
{
|
||||
Polygon.Visible = true;
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
var playerScreenCenterPosition = Player.Position - Camera.Position;
|
||||
var flashlightScreenCenterPosition = Camera.FlashlightPosition - Camera.Position;
|
||||
|
||||
var a = Mathf.Sqrt(d * d - FlashlightRadius * FlashlightRadius);
|
||||
var xy2 = Camera.FlashlightPosition - Player.Position;
|
||||
var angle = xy2.Angle();
|
||||
var playerScreenPosition = playerScreenCenterPosition + Constants.HalfScreenSize;
|
||||
PlayerCircle.Position = playerScreenPosition;
|
||||
CollisionPlayerCircle.Position = playerScreenPosition;
|
||||
|
||||
var arcsinRd = Mathf.Asin(FlashlightRadius / d);
|
||||
var dslkhjdsflkhjsdfhlkjdfsjlk = angle + arcsinRd;
|
||||
var xy3 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk));
|
||||
var dslkhjdsflkhjsdfhlkjdfsjlk2 = angle - arcsinRd;
|
||||
var xy4 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk2), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk2));
|
||||
|
||||
Polygon.Polygon = new[]
|
||||
{ playerScreenPosition, playerScreenPosition + xy3, playerScreenPosition + xy4 };
|
||||
}
|
||||
}
|
||||
}
|
||||
var d = Camera.FlashlightPosition.DistanceTo(Player.Position);
|
||||
FlashlightRadius = Mathf.Lerp(Constants.MinFlashlightRadius, Constants.MaxFlashlightRadius,
|
||||
Mathf.Clamp(d - Constants.MinFlashlightDistance, 0,
|
||||
Constants.MaxFlashlightDistance - Constants.MinFlashlightDistance) / Constants.MaxFlashlightDistance);
|
||||
|
||||
var flashlightScreenPosition = flashlightScreenCenterPosition + Constants.HalfScreenSize;
|
||||
var flashlightScale = FlashlightRadius / Constants.MaxFlashlightRadius;
|
||||
Circle.Position = flashlightScreenPosition;
|
||||
Circle.Scale = new Vector2(flashlightScale, flashlightScale);
|
||||
CollisionCircle.Position = flashlightScreenPosition;
|
||||
((CircleShape2D)CollisionCircle.Shape).Radius = FlashlightRadius;
|
||||
|
||||
if (d <= FlashlightRadius)
|
||||
Polygon.Visible = false;
|
||||
else
|
||||
{
|
||||
Polygon.Visible = true;
|
||||
|
||||
var a = Mathf.Sqrt(d * d - FlashlightRadius * FlashlightRadius);
|
||||
var xy2 = Camera.FlashlightPosition - Player.Position;
|
||||
var angle = xy2.Angle();
|
||||
|
||||
var arcsinRd = Mathf.Asin(FlashlightRadius / d);
|
||||
var dslkhjdsflkhjsdfhlkjdfsjlk = angle + arcsinRd;
|
||||
var xy3 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk));
|
||||
var dslkhjdsflkhjsdfhlkjdfsjlk2 = angle - arcsinRd;
|
||||
var xy4 = a * new Vector2(Mathf.Cos(dslkhjdsflkhjsdfhlkjdfsjlk2), Mathf.Sin(dslkhjdsflkhjsdfhlkjdfsjlk2));
|
||||
|
||||
var polygon = new[]
|
||||
{ playerScreenPosition, playerScreenPosition + xy3, playerScreenPosition + xy4 };
|
||||
Polygon.Polygon = polygon;
|
||||
CollisionPolygon.Polygon = polygon;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue