Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
OrbitCamera.cs
浏览该文件的文档.
1using Engine;
2
3namespace Game {
6
7 public Vector2 m_angles = new(0f, MathUtils.DegToRad(30f));
8
9 public float m_distance = 6f;
10
11 public override bool UsesMovementControls => true;
12
13 public override bool IsEntityControlEnabled => true;
14
15 public OrbitCamera(GameWidget gameWidget) : base(gameWidget) { }
16
17 public override void Activate(Camera previousCamera) {
18 SetupPerspectiveCamera(previousCamera.ViewPosition, previousCamera.ViewDirection, previousCamera.ViewUp);
19 }
20
21 public override void Update(float dt) {
22 ComponentPlayer componentPlayer = GameWidget.PlayerData.ComponentPlayer;
23 if (componentPlayer == null
24 || GameWidget.Target == null) {
25 return;
26 }
27 ComponentInput componentInput = componentPlayer.ComponentInput;
28 Vector3 cameraSneakMove = componentInput.PlayerInput.CameraCrouchMove;
29 Vector2 cameraLook = componentInput.PlayerInput.CameraLook;
30 m_angles.X = MathUtils.NormalizeAngle(m_angles.X + 4f * cameraLook.X * dt + 0.5f * cameraSneakMove.X * dt);
31 m_angles.Y = Math.Clamp(MathUtils.NormalizeAngle(m_angles.Y + 4f * cameraLook.Y * dt), MathUtils.DegToRad(-20f), MathUtils.DegToRad(70f));
32 m_distance = Math.Clamp(m_distance - 10f * cameraSneakMove.Z * dt, 2f, 16f);
34 Vector3 vector = GameWidget.Target.ComponentBody.Position + 0.9f * GameWidget.Target.ComponentBody.BoxSize.Y * Vector3.UnitY;
35 Vector3 vector2 = vector + v;
36 if (Vector3.Distance(vector2, m_position) < 10f) {
37 Vector3 v2 = vector2 - m_position;
38 float s = MathUtils.Saturate(10f * dt);
39 m_position += s * v2;
40 }
41 else {
42 m_position = vector2;
43 }
44 Vector3 vector3 = m_position - vector;
45 float? num = null;
46 Vector3 vector4 = Vector3.Normalize(Vector3.Cross(vector3, Vector3.UnitY));
47 Vector3 v3 = Vector3.Normalize(Vector3.Cross(vector3, vector4));
48 SubsystemTerrain subsystemTerrain = GameWidget.SubsystemGameWidgets.SubsystemTerrain;
49 for (int i = 0; i <= 0; i++) {
50 for (int j = 0; j <= 0; j++) {
51 Vector3 v4 = 0.6f * (vector4 * i + v3 * j);
52 Vector3 vector5 = vector + v4;
53 Vector3 end = vector5 + vector3 + Vector3.Normalize(vector3) * 0.6f;
54 TerrainRaycastResult? terrainRaycastResult = subsystemTerrain.Raycast(
55 vector5,
56 end,
57 false,
58 true,
59 delegate(int value, float _) {
61 for (int k = 0; k < 6; k++) {
62 if (!block.IsFaceTransparent(subsystemTerrain, k, value)) {
63 return true;
64 }
65 }
66 return false;
67 }
68 );
69 if (terrainRaycastResult.HasValue) {
70 num = num.HasValue ? MathUtils.Min(num.Value, terrainRaycastResult.Value.Distance) : terrainRaycastResult.Value.Distance;
71 }
72 }
73 }
74 Vector3 vector6 = !num.HasValue ? vector + vector3 : vector + Vector3.Normalize(vector3) * MathUtils.Max(num.Value - 0.5f, 0.2f);
75 SetupPerspectiveCamera(vector6, vector - vector6, Vector3.UnitY);
76 }
77 }
78}
Engine.Vector3 Vector3
static int Min(int x1, int x2)
static float NormalizeAngle(float angle)
static float Saturate(float x)
static int Max(int x1, int x2)
static float DegToRad(float degrees)
BasePerspectiveCamera(GameWidget gameWidget)
void SetupPerspectiveCamera(Vector3 position, Vector3 direction, Vector3 up)
virtual bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value)
Vector3 ViewPosition
GameWidget GameWidget
Vector3 ViewUp
Vector3 ViewDirection
OrbitCamera(GameWidget gameWidget)
override bool UsesMovementControls
override bool IsEntityControlEnabled
override void Update(float dt)
override void Activate(Camera previousCamera)
virtual ? TerrainRaycastResult Raycast(Vector3 start, Vector3 end, bool useInteractionBoxes, bool skipAirBlocks, Func< int, float, bool > action)
static int ExtractContents(int value)
static Matrix CreateFromYawPitchRoll(float yaw, float pitch, float roll)
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Cross(Vector3 v1, Vector3 v2)
static Vector3 Normalize(Vector3 v)
static float Distance(Vector3 v1, Vector3 v2)
static readonly Vector3 UnitY