demo recording stuff
This commit is contained in:
20
Assets/Maps/invalid_polyhedron_TB_bug_valve.map
Normal file
20
Assets/Maps/invalid_polyhedron_TB_bug_valve.map
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// Game: Goake
|
||||||
|
// Format: Standard
|
||||||
|
// entity 0
|
||||||
|
{
|
||||||
|
"classname" "worldspawn"
|
||||||
|
"_tb_textures" "textures/common;textures/dev"
|
||||||
|
// brush 0
|
||||||
|
{
|
||||||
|
( 832 -0 -0 ) ( 832 0 -1 ) ( 832 1 -0 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 877.8181762695312 0 0 ) ( 877.8181762695312 -1 0 ) ( 877.8181762695312 0 1 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 0 -272 0 ) ( -1 -272 0 ) ( 0 -272 1 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( -0 -256 -0 ) ( 0 -256 -1 ) ( 1 -256 0 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( -0 -0 48 ) ( 0 -1 48 ) ( 1 -0 48 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 0 0 106.90908813476562 ) ( -1 0 106.90908813476562 ) ( 0 1 106.90908813476562 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 779.4157104492188 0 -179.8651580810547 ) ( 779.190850943327 0 -180.8395493030548 ) ( 779.4157104492188 0.9743912220001221 -179.8651580810547 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 132.8000030517578 -0 -265.6000061035156 ) ( 131.9055758714676 0 -266.04721969366074 ) ( 132.8000030517578 0.8944271802902222 -265.6000061035156 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 702.8965454101562 0 -301.2413635253906 ) ( 702.8965454101562 -0.9191450476646423 -301.2413635253906 ) ( 703.2904646992683 0 -300.322218477726 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
( 68.79999542236328 0 -206.39999389648438 ) ( 68.79999542236328 -0.9486833214759827 -206.39999389648438 ) ( 69.74867874383926 0 -206.08376613259315 ) dev/dev_128_gray [ 1 0 0 0 ] [ 0 1 0 0 ] 0 1 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"ID": "3c7bc3854d42f9b1b0fea9ba0d7fa8e9",
|
"ID": "3c7bc3854d42f9b1b0fea9ba0d7fa8e9",
|
||||||
"TypeName": "FlaxEditor.Content.Settings.GameSettings",
|
"TypeName": "FlaxEditor.Content.Settings.GameSettings",
|
||||||
"EngineBuild": 6225,
|
"EngineBuild": 6226,
|
||||||
"Data": {
|
"Data": {
|
||||||
"ProductName": "Goake",
|
"ProductName": "Goake",
|
||||||
"CompanyName": "GoaLitiuM",
|
"CompanyName": "GoaLitiuM",
|
||||||
"CopyrightNotice": "ddc",
|
"CopyrightNotice": "",
|
||||||
"Icon": null,
|
"Icon": null,
|
||||||
"FirstScene": "194e05f445ece24ec5448d886e1334df",
|
"FirstScene": "194e05f445ece24ec5448d886e1334df",
|
||||||
"NoSplashScreen": true,
|
"NoSplashScreen": true,
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
"XboxOnePlatform": null,
|
"XboxOnePlatform": null,
|
||||||
"XboxScarlettPlatform": null,
|
"XboxScarlettPlatform": null,
|
||||||
"AndroidPlatform": null,
|
"AndroidPlatform": null,
|
||||||
"SwitchPlatform": null
|
"SwitchPlatform": null,
|
||||||
|
"PS5Platform": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"ID": "194e05f445ece24ec5448d886e1334df",
|
"ID": "194e05f445ece24ec5448d886e1334df",
|
||||||
"TypeName": "FlaxEngine.SceneAsset",
|
"TypeName": "FlaxEngine.SceneAsset",
|
||||||
"EngineBuild": 6225,
|
"EngineBuild": 6226,
|
||||||
"Data": [
|
"Data": [
|
||||||
{
|
{
|
||||||
"ID": "194e05f445ece24ec5448d886e1334df",
|
"ID": "194e05f445ece24ec5448d886e1334df",
|
||||||
@@ -23,55 +23,6 @@
|
|||||||
"ParentID": "194e05f445ece24ec5448d886e1334df",
|
"ParentID": "194e05f445ece24ec5448d886e1334df",
|
||||||
"V": {}
|
"V": {}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ID": "6c66fa4a4a5de8998eb84388d1648317",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e",
|
|
||||||
"ParentID": "194e05f445ece24ec5448d886e1334df"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "d5c84d67417ddf09908c76b6f0582b43",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "b29a58f545071ca393afaab21faa83ad",
|
|
||||||
"ParentID": "6c66fa4a4a5de8998eb84388d1648317",
|
|
||||||
"V": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "d1a76c334a514c99f8f5b2bd81abae2c",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32",
|
|
||||||
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "357077e9405b2a7ba50198bbed8bd5f9",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74",
|
|
||||||
"ParentID": "d1a76c334a514c99f8f5b2bd81abae2c"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "905d23324e7f98c9f8287e8e49a83981",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "226bdb004e72848777178a9d1f207cbf",
|
|
||||||
"ParentID": "357077e9405b2a7ba50198bbed8bd5f9"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "89c02cd64b640185d9947ab451453c4c",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d",
|
|
||||||
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "eebdb91647732ad3dfc7528c978cd19c",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802",
|
|
||||||
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ID": "3e0f83fe407b2d9ed7c734a62fad0826",
|
|
||||||
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
|
||||||
"PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea",
|
|
||||||
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ID": "ff6b6db54b5aa08e7286ef86246149ef",
|
"ID": "ff6b6db54b5aa08e7286ef86246149ef",
|
||||||
"TypeName": "FlaxEngine.UICanvas",
|
"TypeName": "FlaxEngine.UICanvas",
|
||||||
@@ -117,13 +68,13 @@
|
|||||||
"Transform": {
|
"Transform": {
|
||||||
"Translation": {
|
"Translation": {
|
||||||
"X": 0.0,
|
"X": 0.0,
|
||||||
"Y": 248.0,
|
"Y": 254.0,
|
||||||
"Z": 0.0
|
"Z": 0.0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Control": "FlaxEngine.GUI.Label",
|
"Control": "FlaxEngine.GUI.Label",
|
||||||
"Data": {
|
"Data": {
|
||||||
"Text": "eFPS: 719\nuFPS: 650\nrFPS: 650\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 15.66632MB",
|
"Text": "eFPS: 15\nuFPS: 15\nrFPS: 15\npFPS: 30\nCon: NaNms\nDirectX11\nGC memory: 12.47396MB",
|
||||||
"TextColor": {
|
"TextColor": {
|
||||||
"R": 1.0,
|
"R": 1.0,
|
||||||
"G": 1.0,
|
"G": 1.0,
|
||||||
@@ -170,9 +121,9 @@
|
|||||||
},
|
},
|
||||||
"Offsets": {
|
"Offsets": {
|
||||||
"Left": 0.0,
|
"Left": 0.0,
|
||||||
"Right": 30948.0,
|
"Right": 143.0,
|
||||||
"Top": -562.0,
|
"Top": -562.0,
|
||||||
"Bottom": 576.0
|
"Bottom": 112.0
|
||||||
},
|
},
|
||||||
"Scale": {
|
"Scale": {
|
||||||
"X": 1.0,
|
"X": 1.0,
|
||||||
@@ -211,7 +162,7 @@
|
|||||||
"Transform": {
|
"Transform": {
|
||||||
"Translation": {
|
"Translation": {
|
||||||
"X": 45644.0,
|
"X": 45644.0,
|
||||||
"Y": -1.0,
|
"Y": 2.0,
|
||||||
"Z": 0.0
|
"Z": 0.0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -306,6 +257,55 @@
|
|||||||
},
|
},
|
||||||
"PostFxMaterials": {}
|
"PostFxMaterials": {}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "6c66fa4a4a5de8998eb84388d1648317",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "999a202c47de967d2bdfd09abcc6df4e",
|
||||||
|
"ParentID": "194e05f445ece24ec5448d886e1334df"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "d5c84d67417ddf09908c76b6f0582b43",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "b29a58f545071ca393afaab21faa83ad",
|
||||||
|
"ParentID": "6c66fa4a4a5de8998eb84388d1648317",
|
||||||
|
"V": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "d1a76c334a514c99f8f5b2bd81abae2c",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "a67383834fc3f6f1106e8099e5557e32",
|
||||||
|
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "357077e9405b2a7ba50198bbed8bd5f9",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "b8fc420f4efe96fa2b4042bd98fd3e74",
|
||||||
|
"ParentID": "d1a76c334a514c99f8f5b2bd81abae2c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "905d23324e7f98c9f8287e8e49a83981",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "226bdb004e72848777178a9d1f207cbf",
|
||||||
|
"ParentID": "357077e9405b2a7ba50198bbed8bd5f9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "89c02cd64b640185d9947ab451453c4c",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "8bd80bca49ac35da66aabaa2e473851d",
|
||||||
|
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "eebdb91647732ad3dfc7528c978cd19c",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "d9d61d314ad79d49ba08059cef50f802",
|
||||||
|
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ID": "3e0f83fe407b2d9ed7c734a62fad0826",
|
||||||
|
"PrefabID": "2d0e518b47d735c98312dd87cc42d6d7",
|
||||||
|
"PrefabObjectID": "b377cc03418270d87e8a5b92cb5374ea",
|
||||||
|
"ParentID": "6c66fa4a4a5de8998eb84388d1648317"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"ID": "a55dc3c04da4ea3744b7f1994565beac",
|
"ID": "a55dc3c04da4ea3744b7f1994565beac",
|
||||||
"TypeName": "FlaxEditor.Content.Settings.TimeSettings",
|
"TypeName": "FlaxEditor.Content.Settings.TimeSettings",
|
||||||
"EngineBuild": 6224,
|
"EngineBuild": 6226,
|
||||||
"Data": {
|
"Data": {
|
||||||
"UpdateFPS": 240.0,
|
"UpdateFPS": 120.0,
|
||||||
"PhysicsFPS": 120.0,
|
"PhysicsFPS": 120.0,
|
||||||
"DrawFPS": 240.0,
|
"DrawFPS": 120.0,
|
||||||
"TimeScale": 1.0,
|
"TimeScale": 1.0,
|
||||||
"MaxUpdateDeltaTime": 0.1
|
"MaxUpdateDeltaTime": 0.1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"ID": "4a5eec97484253fed72934860ae62c40",
|
"ID": "4a5eec97484253fed72934860ae62c40",
|
||||||
"TypeName": "FlaxEditor.Content.Settings.WindowsPlatformSettings",
|
"TypeName": "FlaxEditor.Content.Settings.WindowsPlatformSettings",
|
||||||
"EngineBuild": 6225,
|
"EngineBuild": 6226,
|
||||||
"Data": {
|
"Data": {
|
||||||
"WindowMode": 0,
|
"WindowMode": 0,
|
||||||
"ScreenWidth": 1280,
|
"ScreenWidth": 1280,
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ namespace Cabrito
|
|||||||
sb.Append("\nGC memory: " + (GC.GetTotalMemory(false) / 1000000.0f).ToString() + "MB");
|
sb.Append("\nGC memory: " + (GC.GetTotalMemory(false) / 1000000.0f).ToString() + "MB");
|
||||||
//sb.Append("\nUpdate profiler: " + updateProfTime.ToString() + "ms");
|
//sb.Append("\nUpdate profiler: " + updateProfTime.ToString() + "ms");
|
||||||
|
|
||||||
|
#if false
|
||||||
#if BUILD_DEVELOPMENT
|
#if BUILD_DEVELOPMENT
|
||||||
var nameOffset = Marshal.OffsetOf(typeof(ProfilerCPU.Event), "Name0");
|
var nameOffset = Marshal.OffsetOf(typeof(ProfilerCPU.Event), "Name0");
|
||||||
foreach (var eventsCpu in FlaxEngine.ProfilingTools.EventsCPU)
|
foreach (var eventsCpu in FlaxEngine.ProfilingTools.EventsCPU)
|
||||||
@@ -119,6 +120,7 @@ namespace Cabrito
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
((Label) control.Control).Text = sb.ToString();
|
((Label) control.Control).Text = sb.ToString();
|
||||||
|
|||||||
189
Source/Game/PlayerInput.cs
Normal file
189
Source/Game/PlayerInput.cs
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using FlaxEngine;
|
||||||
|
|
||||||
|
namespace Game
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct PlayerInputState
|
||||||
|
{
|
||||||
|
public float viewDeltaX, viewDeltaY;
|
||||||
|
public float moveForward;
|
||||||
|
public float moveRight;
|
||||||
|
public bool attacking;
|
||||||
|
public bool jumping;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct PlayerActorState
|
||||||
|
{
|
||||||
|
public Vector3 position;
|
||||||
|
public Vector3 velocity;
|
||||||
|
public Quaternion orientation;
|
||||||
|
public float viewYaw, viewPitch, viewRoll;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct PlayerState
|
||||||
|
{
|
||||||
|
public PlayerInputState input;
|
||||||
|
public PlayerActorState actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PlayerInput
|
||||||
|
{
|
||||||
|
public PlayerState lastState;
|
||||||
|
public PlayerState currentState;
|
||||||
|
public int frame;
|
||||||
|
|
||||||
|
private const byte DemoVer = 1;
|
||||||
|
|
||||||
|
private List<PlayerInputState> buffer = new List<PlayerInputState>();
|
||||||
|
|
||||||
|
private bool demoPlayback = false;
|
||||||
|
private bool demoRecording = true;
|
||||||
|
|
||||||
|
private string demoPath = @"C:\dev\GoakeFlax\testdemo.gdem";
|
||||||
|
|
||||||
|
public void OpenDemo()
|
||||||
|
{
|
||||||
|
if (!File.Exists(demoPath))
|
||||||
|
return;
|
||||||
|
|
||||||
|
T RawDeserialize<T>(byte[] rawData, int position)
|
||||||
|
{
|
||||||
|
int rawsize = Marshal.SizeOf(typeof(T));
|
||||||
|
if (rawsize > rawData.Length - position)
|
||||||
|
throw new ArgumentException("Not enough data to fill struct. Array length from position: "+(rawData.Length-position) + ", Struct length: "+rawsize);
|
||||||
|
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
|
||||||
|
Marshal.Copy(rawData, position, buffer, rawsize);
|
||||||
|
T retobj = (T)Marshal.PtrToStructure(buffer, typeof(T));
|
||||||
|
Marshal.FreeHGlobal(buffer);
|
||||||
|
return retobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
var stream = File.OpenRead(demoPath);
|
||||||
|
var ver = (int)stream.ReadByte();
|
||||||
|
if (ver != DemoVer)
|
||||||
|
{
|
||||||
|
Console.WriteLine("demover doesn't match: " + ver + " != " + DemoVer);
|
||||||
|
stream.Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var expectedSize = Marshal.SizeOf(typeof(PlayerInputState));
|
||||||
|
byte[] b = new byte[expectedSize];
|
||||||
|
var readBytes = stream.Read(b, 0, b.Length);
|
||||||
|
if (readBytes < expectedSize)
|
||||||
|
break;
|
||||||
|
|
||||||
|
buffer.Add(RawDeserialize<PlayerInputState>(b, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("demo numstates: " + buffer.Count);
|
||||||
|
|
||||||
|
demoPlayback = true;
|
||||||
|
demoRecording = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUpdate()
|
||||||
|
{
|
||||||
|
lastState = currentState;
|
||||||
|
|
||||||
|
// Record camera angles here?
|
||||||
|
if (!demoPlayback)
|
||||||
|
{
|
||||||
|
currentState.input.viewDeltaX = InputManager.GetAxisRaw("Mouse X");
|
||||||
|
currentState.input.viewDeltaY = InputManager.GetAxisRaw("Mouse Y");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnFixedUpdate()
|
||||||
|
{
|
||||||
|
// Record intent here
|
||||||
|
|
||||||
|
if (!demoPlayback)
|
||||||
|
{
|
||||||
|
currentState.input.moveForward = InputManager.GetAxis("Vertical");
|
||||||
|
currentState.input.moveRight = InputManager.GetAxis("Horizontal");
|
||||||
|
currentState.input.attacking = InputManager.GetAction("Attack");
|
||||||
|
currentState.input.jumping = InputManager.GetAction("Jump");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnEndFrame()
|
||||||
|
{
|
||||||
|
if (demoRecording)
|
||||||
|
buffer.Add(currentState.input);
|
||||||
|
|
||||||
|
frame++;
|
||||||
|
|
||||||
|
if (demoPlayback)
|
||||||
|
{
|
||||||
|
if (frame < buffer.Count)
|
||||||
|
{
|
||||||
|
//var actorState = currentState.actor;
|
||||||
|
currentState.input = buffer[frame];
|
||||||
|
//currentState.actor = actorState;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("demo ended");
|
||||||
|
demoPlayback = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecordCurrentActorState(PlayerActorState actorState)
|
||||||
|
{
|
||||||
|
currentState.actor = actorState;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerInputState GetCurrentInputState()
|
||||||
|
{
|
||||||
|
return currentState.input;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerActorState GetCurrentActorState()
|
||||||
|
{
|
||||||
|
return currentState.actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Flush()
|
||||||
|
{
|
||||||
|
if (!demoRecording)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var stream = File.Open(demoPath, FileMode.Create, FileAccess.Write);
|
||||||
|
//stream.Position = 0;
|
||||||
|
//stream.SetLength(0);
|
||||||
|
stream.WriteByte(DemoVer);
|
||||||
|
|
||||||
|
byte[] RawSerialize(object anything)
|
||||||
|
{
|
||||||
|
int rawSize = Marshal.SizeOf(anything);
|
||||||
|
IntPtr buffer = Marshal.AllocHGlobal(rawSize);
|
||||||
|
Marshal.StructureToPtr(anything, buffer, false);
|
||||||
|
byte[] rawDatas = new byte[rawSize];
|
||||||
|
Marshal.Copy(buffer, rawDatas, 0, rawSize);
|
||||||
|
Marshal.FreeHGlobal(buffer);
|
||||||
|
return rawDatas;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var state in buffer)
|
||||||
|
{
|
||||||
|
var bytes = RawSerialize(state);
|
||||||
|
stream.Write(bytes, 0, bytes.Length * sizeof(byte));
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.Close();
|
||||||
|
|
||||||
|
Debug.Write(LogType.Info, "demo, wrote states: " + buffer.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ using System.Diagnostics;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FlaxEngine.Assertions;
|
using FlaxEngine.Assertions;
|
||||||
using Console = Cabrito.Console;
|
using Console = Cabrito.Console;
|
||||||
|
using Debug = FlaxEngine.Debug;
|
||||||
using Object = FlaxEngine.Object;
|
using Object = FlaxEngine.Object;
|
||||||
|
|
||||||
namespace Game
|
namespace Game
|
||||||
@@ -45,11 +46,14 @@ namespace Game
|
|||||||
|
|
||||||
private Actor rootActor;
|
private Actor rootActor;
|
||||||
private RigidBody rigidBody;
|
private RigidBody rigidBody;
|
||||||
|
private PlayerInput input;
|
||||||
|
|
||||||
public override void OnAwake()
|
public override void OnAwake()
|
||||||
{
|
{
|
||||||
base.OnAwake();
|
base.OnAwake();
|
||||||
|
|
||||||
|
input = new PlayerInput();
|
||||||
|
|
||||||
onExit.Triggered += () =>
|
onExit.Triggered += () =>
|
||||||
{
|
{
|
||||||
if (Console.IsSafeToQuit)
|
if (Console.IsSafeToQuit)
|
||||||
@@ -62,6 +66,16 @@ namespace Game
|
|||||||
//rigidBody.CollisionEnter += OnCollisionEnter;
|
//rigidBody.CollisionEnter += OnCollisionEnter;
|
||||||
//rigidBody.TriggerEnter += OnTriggerEnter;
|
//rigidBody.TriggerEnter += OnTriggerEnter;
|
||||||
//rigidBody.TriggerExit += OnTriggerExit;
|
//rigidBody.TriggerExit += OnTriggerExit;
|
||||||
|
|
||||||
|
input.OpenDemo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnDisable()
|
||||||
|
{
|
||||||
|
base.OnDisable();
|
||||||
|
|
||||||
|
if (input != null)
|
||||||
|
input.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<PhysicsColliderActor> touchingActors = new List<PhysicsColliderActor>();
|
private List<PhysicsColliderActor> touchingActors = new List<PhysicsColliderActor>();
|
||||||
@@ -103,6 +117,68 @@ namespace Game
|
|||||||
viewRoll = initialEulerAngles.Z;
|
viewRoll = initialEulerAngles.Z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnUpdate()
|
||||||
|
{
|
||||||
|
input.OnUpdate();
|
||||||
|
|
||||||
|
if (input.frame > 0)
|
||||||
|
{
|
||||||
|
PlayerActorState actorState = input.GetCurrentActorState();
|
||||||
|
Actor.Position = actorState.position;
|
||||||
|
currentVelocity = actorState.velocity;
|
||||||
|
viewYaw = actorState.viewYaw;
|
||||||
|
viewPitch = actorState.viewPitch;
|
||||||
|
viewRoll = actorState.viewRoll;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerInputState inputState = input.GetCurrentInputState();
|
||||||
|
|
||||||
|
// Update camera view
|
||||||
|
float xAxis = inputState.viewDeltaX;
|
||||||
|
float yAxis = inputState.viewDeltaY;
|
||||||
|
if (xAxis != 0.0f || yAxis != 0.0f)
|
||||||
|
{
|
||||||
|
var camera = rootActor.GetChild<Camera>();
|
||||||
|
|
||||||
|
viewPitch = Mathf.Clamp(viewPitch + yAxis, -90.0f, 90.0f);
|
||||||
|
viewYaw += xAxis;
|
||||||
|
|
||||||
|
|
||||||
|
// root orientation must be set first
|
||||||
|
rootActor.Orientation = Quaternion.Euler(0, viewYaw, 0);
|
||||||
|
camera.Orientation = Quaternion.Euler(viewPitch, viewYaw, viewRoll);
|
||||||
|
}
|
||||||
|
|
||||||
|
input.RecordCurrentActorState(new PlayerActorState()
|
||||||
|
{
|
||||||
|
position = Actor.Position,
|
||||||
|
velocity = currentVelocity,
|
||||||
|
viewYaw = viewYaw,
|
||||||
|
viewPitch = viewPitch,
|
||||||
|
viewRoll = viewRoll
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnFixedUpdate()
|
||||||
|
{
|
||||||
|
input.OnFixedUpdate();
|
||||||
|
PlayerInputState inputState = input.GetCurrentInputState();
|
||||||
|
|
||||||
|
SimulatePlayerMovement(inputState);
|
||||||
|
|
||||||
|
input.RecordCurrentActorState(new PlayerActorState()
|
||||||
|
{
|
||||||
|
position = Actor.Position,
|
||||||
|
velocity = currentVelocity,
|
||||||
|
viewYaw = viewYaw,
|
||||||
|
viewPitch = viewPitch,
|
||||||
|
viewRoll = viewRoll
|
||||||
|
});
|
||||||
|
input.OnEndFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private bool SweepPlayerCollider(Vector3 start, Vector3 end, out RayCastHit[] hits)
|
private bool SweepPlayerCollider(Vector3 start, Vector3 end, out RayCastHit[] hits)
|
||||||
{
|
{
|
||||||
Vector3 delta = end - start;
|
Vector3 delta = end - start;
|
||||||
@@ -560,25 +636,6 @@ namespace Game
|
|||||||
return slideMoveHit;
|
return slideMoveHit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnUpdate()
|
|
||||||
{
|
|
||||||
float xAxis = InputManager.GetAxisRaw("Mouse X");
|
|
||||||
float yAxis = InputManager.GetAxisRaw("Mouse Y");
|
|
||||||
if (xAxis != 0.0f || yAxis != 0.0f)
|
|
||||||
{
|
|
||||||
var camera = rootActor.GetChild<Camera>();
|
|
||||||
|
|
||||||
viewPitch += yAxis;
|
|
||||||
viewYaw += xAxis;
|
|
||||||
|
|
||||||
viewPitch = Mathf.Clamp(viewPitch, -90.0f, 90.0f);
|
|
||||||
|
|
||||||
// root orientation must be set first
|
|
||||||
rootActor.Orientation = Quaternion.Euler(0, viewYaw, 0);
|
|
||||||
camera.Orientation = Quaternion.Euler(viewPitch, viewYaw, viewRoll);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[ReadOnly] public bool onGround = false;
|
[ReadOnly] public bool onGround = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -643,12 +700,12 @@ namespace Game
|
|||||||
|
|
||||||
private Vector3 currentVelocity;
|
private Vector3 currentVelocity;
|
||||||
|
|
||||||
public override void OnFixedUpdate()
|
public void SimulatePlayerMovement(PlayerInputState inputState)
|
||||||
{
|
{
|
||||||
Transform rootTrans = rootActor.Transform;
|
Transform rootTrans = rootActor.Transform;
|
||||||
|
|
||||||
Vector3 inputDirection =
|
Vector3 inputDirection =
|
||||||
new Vector3(InputManager.GetAxis("Horizontal"), 0.0f, InputManager.GetAxis("Vertical"));
|
new Vector3(inputState.moveRight, 0.0f, inputState.moveForward);
|
||||||
Vector3 moveDirection = rootTrans.TransformDirection(inputDirection);
|
Vector3 moveDirection = rootTrans.TransformDirection(inputDirection);
|
||||||
|
|
||||||
Vector3 position = rigidBody.Position;
|
Vector3 position = rigidBody.Position;
|
||||||
@@ -698,7 +755,7 @@ namespace Game
|
|||||||
|
|
||||||
// TODO: snap to ground here
|
// TODO: snap to ground here
|
||||||
|
|
||||||
bool jumpAction = InputManager.GetAction("Jump");
|
bool jumpAction = inputState.jumping;
|
||||||
|
|
||||||
if (jumped && !jumpAction)
|
if (jumped && !jumpAction)
|
||||||
jumped = false; // jump released
|
jumped = false; // jump released
|
||||||
|
|||||||
Reference in New Issue
Block a user