From 722ea9bc01a17d3de3314853ecc1858b604af94b Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Sat, 29 Feb 2020 22:28:58 -0500 Subject: [PATCH] 2.5D Demo Project for Mono C# Co-authored-by: Stephen Agbete (Steph155) --- mono/2.5d/2.5D Demo (Mono C#).csproj | 66 ++ mono/2.5d/2.5D Demo (Mono C#).sln | 19 + mono/2.5d/Properties/AssemblyInfo.cs | 25 + mono/2.5d/README.md | 19 + mono/2.5d/addons/node25d-cs/Basis25D.cs | 207 ++++++ mono/2.5d/addons/node25d-cs/Node25D.cs | 151 +++++ mono/2.5d/addons/node25d-cs/ShadowMath25D.cs | 54 ++ mono/2.5d/addons/node25d-cs/Transform25D.cs | 131 ++++ mono/2.5d/addons/node25d-cs/YSort25D.cs | 60 ++ .../node25d-cs/icons/kinematic_body_25d.png | Bin 0 -> 1682 bytes .../icons/kinematic_body_25d.png.import | 34 + .../2.5d/addons/node25d-cs/icons/node_25d.png | Bin 0 -> 1818 bytes .../node25d-cs/icons/node_25d.png.import | 34 + .../addons/node25d-cs/icons/node_25d_icon.png | Bin 0 -> 293 bytes .../node25d-cs/icons/node_25d_icon.png.import | 34 + .../node25d-cs/icons/shadow_math_25d.png | Bin 0 -> 2118 bytes .../icons/shadow_math_25d.png.import | 34 + .../node25d-cs/icons/shadow_math_25d_icon.png | Bin 0 -> 473 bytes .../icons/shadow_math_25d_icon.png.import | 34 + .../addons/node25d-cs/icons/y_sort_25d.png | Bin 0 -> 366 bytes .../node25d-cs/icons/y_sort_25d.png.import | 34 + .../node25d-cs/icons/y_sort_25d_icon.png | Bin 0 -> 241 bytes .../icons/y_sort_25d_icon.png.import | 34 + mono/2.5d/addons/node25d-cs/node25d_plugin.gd | 14 + mono/2.5d/addons/node25d-cs/plugin.cfg | 7 + mono/2.5d/assets/cube/CubeMath.cs | 72 ++ mono/2.5d/assets/cube/cube.tscn | 18 + mono/2.5d/assets/cube/cube_point.tscn | 17 + mono/2.5d/assets/cube/godot.png | Bin 0 -> 2135 bytes mono/2.5d/assets/cube/godot.png.import | 34 + mono/2.5d/assets/demo_scene.tscn | 614 ++++++++++++++++++ mono/2.5d/assets/platform/platform.tscn | 32 + mono/2.5d/assets/platform/platform_sprite.gd | 39 ++ .../assets/platform/textures/forty_five.png | Bin 0 -> 2276 bytes .../platform/textures/forty_five.png.import | 34 + .../assets/platform/textures/front_side.png | Bin 0 -> 441 bytes .../platform/textures/front_side.png.import | 34 + .../assets/platform/textures/isometric.png | Bin 0 -> 41122 bytes .../platform/textures/isometric.png.import | 34 + .../assets/platform/textures/oblique_y.png | Bin 0 -> 3148 bytes .../platform/textures/oblique_y.png.import | 34 + .../assets/platform/textures/oblique_z.png | Bin 0 -> 8917 bytes .../platform/textures/oblique_z.png.import | 34 + .../assets/platform/textures/top_down.png | Bin 0 -> 2686 bytes .../platform/textures/top_down.png.import | 34 + mono/2.5d/assets/player/PlayerMath25D.cs | 96 +++ mono/2.5d/assets/player/PlayerSprite.cs | 229 +++++++ mono/2.5d/assets/player/player_25d.tscn | 39 ++ mono/2.5d/assets/player/textures/jump.png | Bin 0 -> 3744 bytes .../assets/player/textures/jump.png.import | 34 + mono/2.5d/assets/player/textures/run.png | Bin 0 -> 8034 bytes .../assets/player/textures/run.png.import | 34 + mono/2.5d/assets/player/textures/stand.png | Bin 0 -> 1844 bytes .../assets/player/textures/stand.png.import | 34 + mono/2.5d/assets/shadow/shadow_25d.tscn | 39 ++ mono/2.5d/assets/shadow/shadow_sprite.gd | 39 ++ .../assets/shadow/textures/forty_five.png | Bin 0 -> 396 bytes .../shadow/textures/forty_five.png.import | 34 + .../assets/shadow/textures/front_side.png | Bin 0 -> 84 bytes .../shadow/textures/front_side.png.import | 34 + .../2.5d/assets/shadow/textures/isometric.png | Bin 0 -> 266 bytes .../shadow/textures/isometric.png.import | 34 + .../2.5d/assets/shadow/textures/oblique_y.png | Bin 0 -> 353 bytes .../shadow/textures/oblique_y.png.import | 34 + .../2.5d/assets/shadow/textures/oblique_z.png | Bin 0 -> 805 bytes .../shadow/textures/oblique_z.png.import | 34 + mono/2.5d/assets/shadow/textures/top_down.png | Bin 0 -> 87 bytes .../shadow/textures/top_down.png.import | 34 + mono/2.5d/assets/ui/control_hints.gd | 5 + mono/2.5d/assets/ui/overlay.tscn | 28 + mono/2.5d/assets/ui/overlay_cube.tscn | 28 + mono/2.5d/default_env.tres | 7 + mono/2.5d/icon.png | Bin 0 -> 262 bytes mono/2.5d/icon.png.import | 34 + mono/2.5d/project.godot | 169 +++++ 75 files changed, 3040 insertions(+) create mode 100644 mono/2.5d/2.5D Demo (Mono C#).csproj create mode 100644 mono/2.5d/2.5D Demo (Mono C#).sln create mode 100644 mono/2.5d/Properties/AssemblyInfo.cs create mode 100644 mono/2.5d/README.md create mode 100644 mono/2.5d/addons/node25d-cs/Basis25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/Node25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/ShadowMath25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/Transform25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/YSort25D.cs create mode 100644 mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/node_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/shadow_math_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png create mode 100644 mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import create mode 100644 mono/2.5d/addons/node25d-cs/node25d_plugin.gd create mode 100644 mono/2.5d/addons/node25d-cs/plugin.cfg create mode 100644 mono/2.5d/assets/cube/CubeMath.cs create mode 100644 mono/2.5d/assets/cube/cube.tscn create mode 100644 mono/2.5d/assets/cube/cube_point.tscn create mode 100644 mono/2.5d/assets/cube/godot.png create mode 100644 mono/2.5d/assets/cube/godot.png.import create mode 100644 mono/2.5d/assets/demo_scene.tscn create mode 100644 mono/2.5d/assets/platform/platform.tscn create mode 100644 mono/2.5d/assets/platform/platform_sprite.gd create mode 100644 mono/2.5d/assets/platform/textures/forty_five.png create mode 100644 mono/2.5d/assets/platform/textures/forty_five.png.import create mode 100644 mono/2.5d/assets/platform/textures/front_side.png create mode 100644 mono/2.5d/assets/platform/textures/front_side.png.import create mode 100644 mono/2.5d/assets/platform/textures/isometric.png create mode 100644 mono/2.5d/assets/platform/textures/isometric.png.import create mode 100644 mono/2.5d/assets/platform/textures/oblique_y.png create mode 100644 mono/2.5d/assets/platform/textures/oblique_y.png.import create mode 100644 mono/2.5d/assets/platform/textures/oblique_z.png create mode 100644 mono/2.5d/assets/platform/textures/oblique_z.png.import create mode 100644 mono/2.5d/assets/platform/textures/top_down.png create mode 100644 mono/2.5d/assets/platform/textures/top_down.png.import create mode 100644 mono/2.5d/assets/player/PlayerMath25D.cs create mode 100644 mono/2.5d/assets/player/PlayerSprite.cs create mode 100644 mono/2.5d/assets/player/player_25d.tscn create mode 100755 mono/2.5d/assets/player/textures/jump.png create mode 100644 mono/2.5d/assets/player/textures/jump.png.import create mode 100644 mono/2.5d/assets/player/textures/run.png create mode 100644 mono/2.5d/assets/player/textures/run.png.import create mode 100644 mono/2.5d/assets/player/textures/stand.png create mode 100644 mono/2.5d/assets/player/textures/stand.png.import create mode 100644 mono/2.5d/assets/shadow/shadow_25d.tscn create mode 100644 mono/2.5d/assets/shadow/shadow_sprite.gd create mode 100644 mono/2.5d/assets/shadow/textures/forty_five.png create mode 100644 mono/2.5d/assets/shadow/textures/forty_five.png.import create mode 100644 mono/2.5d/assets/shadow/textures/front_side.png create mode 100644 mono/2.5d/assets/shadow/textures/front_side.png.import create mode 100644 mono/2.5d/assets/shadow/textures/isometric.png create mode 100644 mono/2.5d/assets/shadow/textures/isometric.png.import create mode 100644 mono/2.5d/assets/shadow/textures/oblique_y.png create mode 100644 mono/2.5d/assets/shadow/textures/oblique_y.png.import create mode 100644 mono/2.5d/assets/shadow/textures/oblique_z.png create mode 100644 mono/2.5d/assets/shadow/textures/oblique_z.png.import create mode 100644 mono/2.5d/assets/shadow/textures/top_down.png create mode 100644 mono/2.5d/assets/shadow/textures/top_down.png.import create mode 100644 mono/2.5d/assets/ui/control_hints.gd create mode 100644 mono/2.5d/assets/ui/overlay.tscn create mode 100644 mono/2.5d/assets/ui/overlay_cube.tscn create mode 100644 mono/2.5d/default_env.tres create mode 100644 mono/2.5d/icon.png create mode 100644 mono/2.5d/icon.png.import create mode 100644 mono/2.5d/project.godot diff --git a/mono/2.5d/2.5D Demo (Mono C#).csproj b/mono/2.5d/2.5D Demo (Mono C#).csproj new file mode 100644 index 00000000..7282c23c --- /dev/null +++ b/mono/2.5d/2.5D Demo (Mono C#).csproj @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + {5CA791DB-5050-44D0-989B-41D559AB1D50} + Library + .mono/temp/bin/$(Configuration) + Empty.DMono + 2.5D Demo (Mono C#) + v4.5 + .mono/temp/obj + $(BaseIntermediateOutputPath)/$(Configuration) + Debug + Release + + + true + portable + false + $(GodotDefineConstants);GODOT;DEBUG; + prompt + 4 + false + + + portable + true + $(GodotDefineConstants);GODOT; + prompt + 4 + false + + + true + portable + false + $(GodotDefineConstants);GODOT;DEBUG;TOOLS; + prompt + 4 + false + + + + False + $(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/GodotSharp.dll + + + False + $(ProjectDir)/.mono/assemblies/$(ApiConfiguration)/GodotSharpEditor.dll + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mono/2.5d/2.5D Demo (Mono C#).sln b/mono/2.5d/2.5D Demo (Mono C#).sln new file mode 100644 index 00000000..d979d457 --- /dev/null +++ b/mono/2.5d/2.5D Demo (Mono C#).sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "2.5D Demo (Mono C#)", "2.5D Demo (Mono C#).csproj", "{5CA791DB-5050-44D0-989B-41D559AB1D50}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Tools|Any CPU = Tools|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Release|Any CPU.Build.0 = Release|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Tools|Any CPU.ActiveCfg = Tools|Any CPU + {5CA791DB-5050-44D0-989B-41D559AB1D50}.Tools|Any CPU.Build.0 = Tools|Any CPU + EndGlobalSection +EndGlobal diff --git a/mono/2.5d/Properties/AssemblyInfo.cs b/mono/2.5d/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c562b722 --- /dev/null +++ b/mono/2.5d/Properties/AssemblyInfo.cs @@ -0,0 +1,25 @@ +using System.Reflection; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("2.5D Demo (Mono C#)")] +[assembly: AssemblyDescription("2.5D demo project for Godot, Mono C# version.")] +[assembly: AssemblyConfiguration("Debug")] +[assembly: AssemblyCompany("Godot")] +[assembly: AssemblyProduct("Godot Demo Projects")] +[assembly: AssemblyCopyright("Copyright © 2020 Aaron Franke, Godot Engine contributors")] +[assembly: AssemblyTrademark("Godot Engine")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/mono/2.5d/README.md b/mono/2.5d/README.md new file mode 100644 index 00000000..b7767f71 --- /dev/null +++ b/mono/2.5d/README.md @@ -0,0 +1,19 @@ +# 2.5D Demo Project (Mono C#) + +This demo project is an example of how a 2.5D game could be created in Godot. + +Controls: WASD to move, Space to jump, R to reset, and UIOPKL to change view modes. + +Note: There is a GDScript version available [here](https://github.com/godotengine/godot-demo-projects/tree/master/misc/2.5d). + +## How does it work? + +Custom node types are added in a Godot plugin to allow 2.5D objects. Node25D serves as the base for all 2.5D objects; its first child must be a Spatial, which is used to calculate its position. It also adds YSort25D to sort Node25D nodes, and ShadowMath25D for calculating a shadow. + +It uses structs called Basis25D and Transform25D to calculate 2D positions from 3D ones. For getting a 3D position, this project uses KinematicBody and StaticBody (3D), but these only exist for math - the camera is 2D and all sprites are 2D. You are able to use any Spatial node for math. + +To display the objects, add a Sprite or any other Node2D-derived children to your Node25D objects. Some nodes are unsuitable, such as 2D physics nodes. Keep in mind that the first child must be Spatial-derived for math purposes. + +Several view modes are implemented, including top down, front side, 45 degree, isometric, and two oblique modes. To implement a different view angle, all you need to do is create a new Basis25D, use it in all your Node25D transforms, and of course create textures to display that object in 2D. + +## Screenshots diff --git a/mono/2.5d/addons/node25d-cs/Basis25D.cs b/mono/2.5d/addons/node25d-cs/Basis25D.cs new file mode 100644 index 00000000..d5f82b06 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Basis25D.cs @@ -0,0 +1,207 @@ +using Godot; +using System; +using System.Runtime.InteropServices; + +#if GODOT_REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Basis25D structure for performing 2.5D transform math. +/// Note: All code assumes that Y is UP in 3D, and DOWN in 2D. +/// A top-down view has a Y axis component of (0, 0), with a Z axis component of (0, 1). +/// For a front side view, Y is (0, -1) and Z is (0, 0). +/// Remember that Godot's 2D mode has the Y axis pointing DOWN on the screen. +/// +[Serializable] +[StructLayout(LayoutKind.Sequential)] +public struct Basis25D : IEquatable +{ + // Also matrix columns, the directions to move on screen for each unit change in 3D. + public Vector2 x; + public Vector2 y; + public Vector2 z; + + // Also matrix rows, the parts of each vector that contribute to moving in a screen direction. + // Setting a row to zero means no movement in that direction. + public Vector3 Row0 + { + get { return new Vector3(x.x, y.x, z.x); } + set + { + x.x = value.x; + y.x = value.y; + z.x = value.z; + } + } + + public Vector3 Row1 + { + get { return new Vector3(x.y, y.y, z.y); } + set + { + x.y = value.x; + y.y = value.y; + z.y = value.z; + } + } + + public Vector2 this[int columnIndex] + { + get + { + switch (columnIndex) + { + case 0: return x; + case 1: return y; + case 2: return z; + default: throw new IndexOutOfRangeException(); + } + } + set + { + switch (columnIndex) + { + case 0: x = value; return; + case 1: y = value; return; + case 2: z = value; return; + default: throw new IndexOutOfRangeException(); + } + } + } + + public real_t this[int columnIndex, int rowIndex] + { + get + { + return this[columnIndex][rowIndex]; + } + set + { + Vector2 v = this[columnIndex]; + v[rowIndex] = value; + this[columnIndex] = v; + } + } + + private static readonly Basis25D _topDown = new Basis25D(1, 0, 0, 0, 0, 1); + private static readonly Basis25D _frontSide = new Basis25D(1, 0, 0, -1, 0, 0); + private static readonly Basis25D _fortyFive = new Basis25D(1, 0, 0, -0.70710678118f, 0, 0.70710678118f); + private static readonly Basis25D _isometric = new Basis25D(0.86602540378f, 0.5f, 0, -1, -0.86602540378f, 0.5f); + private static readonly Basis25D _obliqueY = new Basis25D(1, 0, -0.70710678118f, -0.70710678118f, 0, 1); + private static readonly Basis25D _obliqueZ = new Basis25D(1, 0, 0, -1, -0.70710678118f, 0.70710678118f); + + public static Basis25D TopDown { get { return _topDown; } } + public static Basis25D FrontSide { get { return _frontSide; } } + public static Basis25D FortyFive { get { return _fortyFive; } } + public static Basis25D Isometric { get { return _isometric; } } + public static Basis25D ObliqueY { get { return _obliqueY; } } + public static Basis25D ObliqueZ { get { return _obliqueZ; } } + + /// + /// Creates a Dimetric Basis25D from the angle between the Y axis and the others. + /// Dimetric(Tau/3) or Dimetric(2.09439510239) is the same as Isometric. + /// Try to keep this number away from a multiple of Tau/4 (or Pi/2) radians. + /// + /// The angle, in radians, between the Y axis and the X/Z axes. + public static Basis25D Dimetric(real_t angle) + { + real_t sin = Mathf.Sin(angle); + real_t cos = Mathf.Cos(angle); + return new Basis25D(sin, -cos, 0, -1, -sin, -cos); + } + + // Constructors + public Basis25D(Basis25D b) + { + x = b.x; + y = b.y; + z = b.z; + } + public Basis25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis) + { + x = xAxis; + y = yAxis; + z = zAxis; + } + public Basis25D(real_t xx, real_t xy, real_t yx, real_t yy, real_t zx, real_t zy) + { + x = new Vector2(xx, xy); + y = new Vector2(yx, yy); + z = new Vector2(zx, zy); + } + + public static Basis25D operator *(Basis25D b, real_t s) + { + b.x *= s; + b.y *= s; + b.z *= s; + return b; + } + + public static Basis25D operator /(Basis25D b, real_t s) + { + b.x /= s; + b.y /= s; + b.z /= s; + return b; + } + + public static bool operator ==(Basis25D left, Basis25D right) + { + return left.Equals(right); + } + + public static bool operator !=(Basis25D left, Basis25D right) + { + return !left.Equals(right); + } + + public override bool Equals(object obj) + { + if (obj is Basis25D) + { + return Equals((Basis25D)obj); + } + return false; + } + + public bool Equals(Basis25D other) + { + return x.Equals(other.x) && y.Equals(other.y) && z.Equals(other.z); + } + + public bool IsEqualApprox(Basis25D other) + { + return x.IsEqualApprox(other.x) && y.IsEqualApprox(other.y) && z.IsEqualApprox(other.z); + } + + public override int GetHashCode() + { + return y.GetHashCode() ^ x.GetHashCode() ^ z.GetHashCode(); + } + + public override string ToString() + { + string s = String.Format("({0}, {1}, {2})", new object[] + { + x.ToString(), + y.ToString(), + z.ToString() + }); + return s; + } + + public string ToString(string format) + { + string s = String.Format("({0}, {1}, {2})", new object[] + { + x.ToString(format), + y.ToString(format), + z.ToString(format) + }); + return s; + } +} diff --git a/mono/2.5d/addons/node25d-cs/Node25D.cs b/mono/2.5d/addons/node25d-cs/Node25D.cs new file mode 100644 index 00000000..99afb8b6 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Node25D.cs @@ -0,0 +1,151 @@ +using Godot; +using System; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// This node converts a 3D position to 2D using a 2.5D transformation matrix. +/// The transformation of its 2D form is controlled by its 3D child. +/// +[Tool] +public class Node25D : Node2D, IComparable +{ + /// + /// The number of 2D units in one 3D unit. Ideally, but not necessarily, an integer. + /// + public const int SCALE = 32; + + [Export] public Vector3 spatialPosition + { + get + { + if (spatialNode == null) + { + spatialNode = GetChild(0); + } + return spatialNode.Translation; + } + set + { + transform25D.spatialPosition = value; + if (spatialNode != null) + { + spatialNode.Translation = value; + } + else if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + } + } + + private Spatial spatialNode; + private Transform25D transform25D; + + public Basis25D Basis25D + { + get { return transform25D.basis; } + } + + public Transform25D Transform25D + { + get { return transform25D; } + } + + public override void _Ready() + { + Node25DReady(); + } + + public override void _Process(real_t delta) + { + Node25DProcess(); + } + + /// + /// Call this method in _Ready, or before Node25DProcess is run. + /// + protected void Node25DReady() + { + if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + // Changing the basis here will change the default for all Node25D instances. + transform25D = new Transform25D(Basis25D.FortyFive * SCALE); + } + + /// + /// Call this method in _Process, or whenever the position of this object changes. + /// + protected void Node25DProcess() + { + CheckViewMode(); + if (spatialNode != null) + { + transform25D.spatialPosition = spatialNode.Translation; + } + else if (GetChildCount() > 0) + { + spatialNode = GetChild(0); + } + GlobalPosition = transform25D.FlatPosition; + } + + private void CheckViewMode() + { + if (Input.IsActionJustPressed("top_down_mode")) + { + transform25D.basis = Basis25D.TopDown * SCALE; + } + else if (Input.IsActionJustPressed("front_side_mode")) + { + transform25D.basis = Basis25D.FrontSide * SCALE; + } + else if (Input.IsActionJustPressed("forty_five_mode")) + { + transform25D.basis = Basis25D.FortyFive * SCALE; + } + else if (Input.IsActionJustPressed("isometric_mode")) + { + transform25D.basis = Basis25D.Isometric * SCALE; + } + else if (Input.IsActionJustPressed("oblique_y_mode")) + { + transform25D.basis = Basis25D.ObliqueY * SCALE; + } + else if (Input.IsActionJustPressed("oblique_z_mode")) + { + transform25D.basis = Basis25D.ObliqueZ * SCALE; + } + } + + public int CompareTo(object obj) + { + if (obj is Node25D) + { + return CompareTo((Node25D)obj); + } + return 1; + } + + public int CompareTo(Node25D other) + { + real_t thisIndex = transform25D.spatialPosition.y + 0.001f * (transform25D.spatialPosition.x + transform25D.spatialPosition.z); + real_t otherIndex = other.transform25D.spatialPosition.y + 0.001f * (other.transform25D.spatialPosition.x + other.transform25D.spatialPosition.z); + real_t diff = thisIndex - otherIndex; + if (diff > 0) + { + return 1; + } + if (diff < 0) + { + return -1; + } + return 0; + } + +} diff --git a/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs b/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs new file mode 100644 index 00000000..64b8061f --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/ShadowMath25D.cs @@ -0,0 +1,54 @@ +using Godot; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Adds a simple shadow below an object. +/// Place this ShadowMath25D node as a child of a Shadow25D, which +/// is below the target object in the scene tree (not as a child). +/// +[Tool] +public class ShadowMath25D : KinematicBody +{ + /// + /// The maximum distance below objects that shadows will appear. + /// + public real_t shadowLength = 1000; + private Node25D shadowRoot; + private Spatial targetMath; + + public override void _Ready() + { + shadowRoot = GetParent(); + int index = shadowRoot.GetPositionInParent(); + targetMath = shadowRoot.GetParent().GetChild(index - 1).GetChild(0); + } + + public override void _Process(real_t delta) + { + if (targetMath == null) + { + if (shadowRoot != null) + { + shadowRoot.Visible = false; + } + return; // Shadow is not in a valid place. + } + + Translation = targetMath.Translation; + var k = MoveAndCollide(Vector3.Down * shadowLength); + if (k == null) + { + shadowRoot.Visible = false; + } + else + { + shadowRoot.Visible = true; + GlobalTransform = Transform; + } + } + +} diff --git a/mono/2.5d/addons/node25d-cs/Transform25D.cs b/mono/2.5d/addons/node25d-cs/Transform25D.cs new file mode 100644 index 00000000..2c41e2c3 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/Transform25D.cs @@ -0,0 +1,131 @@ +using Godot; +using System; +using System.Runtime.InteropServices; + +/// +/// Calculates the 2D transformation from a 3D position and a Basis25D. +/// +[Serializable] +[StructLayout(LayoutKind.Sequential)] +public struct Transform25D : IEquatable +{ + // Public fields store information that is used to calculate the properties. + + /// + /// Controls how the 3D position is transformed into 2D. + /// + public Basis25D basis; + + /// + /// The 3D position of the object. Should be updated on every frame before everything else. + /// + public Vector3 spatialPosition; + + // Public properties calculate on-the-fly. + + /// + /// The 2D transformation of this object. Slower than FlatPosition. + /// + public Transform2D FlatTransform + { + get + { + return new Transform2D(0, FlatPosition); + } + } + + /// + /// The 2D position of this object. + /// + public Vector2 FlatPosition + { + get + { + Vector2 pos = spatialPosition.x * basis.x; + pos += spatialPosition.y * basis.y; + pos += spatialPosition.z * basis.z; + return pos; + } + } + + // Constructors + public Transform25D(Transform25D transform25D) + { + basis = transform25D.basis; + spatialPosition = transform25D.spatialPosition; + } + public Transform25D(Basis25D basis25D) + { + basis = basis25D; + spatialPosition = Vector3.Zero; + } + public Transform25D(Basis25D basis25D, Vector3 position3D) + { + basis = basis25D; + spatialPosition = position3D; + } + public Transform25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis) + { + basis = new Basis25D(xAxis, yAxis, zAxis); + spatialPosition = Vector3.Zero; + } + public Transform25D(Vector2 xAxis, Vector2 yAxis, Vector2 zAxis, Vector3 position3D) + { + basis = new Basis25D(xAxis, yAxis, zAxis); + spatialPosition = position3D; + } + + public static bool operator ==(Transform25D left, Transform25D right) + { + return left.Equals(right); + } + + public static bool operator !=(Transform25D left, Transform25D right) + { + return !left.Equals(right); + } + + public override bool Equals(object obj) + { + if (obj is Transform25D) + { + return Equals((Transform25D)obj); + } + return false; + } + + public bool Equals(Transform25D other) + { + return basis.Equals(other.basis) && spatialPosition.Equals(other.spatialPosition); + } + + public bool IsEqualApprox(Transform25D other) + { + return basis.IsEqualApprox(other.basis) && spatialPosition.IsEqualApprox(other.spatialPosition); + } + + public override int GetHashCode() + { + return basis.GetHashCode() ^ spatialPosition.GetHashCode(); + } + + public override string ToString() + { + string s = String.Format("({0}, {1})", new object[] + { + basis.ToString(), + spatialPosition.ToString() + }); + return s; + } + + public string ToString(string format) + { + string s = String.Format("({0}, {1})", new object[] + { + basis.ToString(format), + spatialPosition.ToString(format) + }); + return s; + } +} diff --git a/mono/2.5d/addons/node25d-cs/YSort25D.cs b/mono/2.5d/addons/node25d-cs/YSort25D.cs new file mode 100644 index 00000000..9b1506c0 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/YSort25D.cs @@ -0,0 +1,60 @@ +using Godot; +using System.Collections.Generic; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +/// +/// Assigns Z-index values to Node25D children. +/// +[Tool] // Commented out because it sometimes crashes the editor when running the game... +public class YSort25D : Node // Note: NOT Node2D, Node25D, or YSort +{ + /// + /// Whether or not to automatically call Sort() in _Process(). + /// + [Export] + public bool sortEnabled = true; + + public override void _Process(real_t delta) + { + if (sortEnabled) + { + Sort(); + } + } + + /// + /// Call this method in _Process, or whenever you want to sort children. + /// + public void Sort() + { + var children = GetParent().GetChildren(); + if (children.Count > 4000) + { + GD.PrintErr("Sorting failed: Max number of YSort25D nodes is 4000."); + } + List node25dChildren = new List(); + + foreach (Node n in children) + { + if (n is Node25D node25d) + { + node25dChildren.Add(node25d); + } + } + + node25dChildren.Sort(); + + int zIndex = -4000; + for (int i = 0; i < node25dChildren.Count; i++) + { + node25dChildren[i].ZIndex = zIndex; + // Increment by 2 each time, to allow for shadows in-between. + // This does mean that we have a limit of 4000 total sorted Node25Ds. + zIndex += 2; + } + } +} diff --git a/mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png b/mono/2.5d/addons/node25d-cs/icons/kinematic_body_25d.png new file mode 100644 index 0000000000000000000000000000000000000000..2780a094fb5cbf7460f1ea14d47bcb2d666e2e1c GIT binary patch literal 1682 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 O!{F)a=d#Wzp$PyD`g{lg literal 0 HcmV?d00001 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import new file mode 100644 index 00000000..53087b1a --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d.png-d7ffa1c0d05a9139ab514ec27ad8da9d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d-cs/icons/y_sort_25d.png" +dest_files=[ "res://.import/y_sort_25d.png-d7ffa1c0d05a9139ab514ec27ad8da9d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e362220e25527cc9680522afcfc8cefd2c9a255 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Wq?nJE08`n;T;g2?SBg=(HKA} zG<3D&kDC6@CZJ}ak|4iehNfo5y8rckzb7y-^!C-(H8vS^AF%|=hI+a06| zlcBb|o2$Wqhq7zceeU;bJqpzHr)^Se><1Upifw9)&u+ z(AxZCE=%a5Y2WuJ9aGaSv-tF3&z~bt4)cCo!+81Dn?G$p3m80I{an^LB{Ts5F+pt! literal 0 HcmV?d00001 diff --git a/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import new file mode 100644 index 00000000..db9724c0 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/icons/y_sort_25d_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/y_sort_25d_icon.png-852bb2b2c54661e1957a46372d9a6d8f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/node25d-cs/icons/y_sort_25d_icon.png" +dest_files=[ "res://.import/y_sort_25d_icon.png-852bb2b2c54661e1957a46372d9a6d8f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/addons/node25d-cs/node25d_plugin.gd b/mono/2.5d/addons/node25d-cs/node25d_plugin.gd new file mode 100644 index 00000000..7559cd63 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/node25d_plugin.gd @@ -0,0 +1,14 @@ +tool +extends EditorPlugin + +func _enter_tree(): + # When this plugin node enters tree, add the custom types + add_custom_type("Node25D", "Node2D", preload("Node25D.cs"), preload("icons/node_25d_icon.png")) + add_custom_type("YSort25D", "Node", preload("YSort25D.cs"), preload("icons/y_sort_25d_icon.png")) + add_custom_type("ShadowMath25D", "KinematicBody", preload("ShadowMath25D.cs"), preload("icons/shadow_math_25d_icon.png")) + +func _exit_tree(): + # When the plugin node exits the tree, remove the custom types + remove_custom_type("ShadowMath25D") + remove_custom_type("YSort25D") + remove_custom_type("Node25D") diff --git a/mono/2.5d/addons/node25d-cs/plugin.cfg b/mono/2.5d/addons/node25d-cs/plugin.cfg new file mode 100644 index 00000000..74b293d3 --- /dev/null +++ b/mono/2.5d/addons/node25d-cs/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Node25D (C#)" +description="Adds Node25D" +author="Aaron Franke" +version="1.0" +script="node25d_plugin.gd" diff --git a/mono/2.5d/assets/cube/CubeMath.cs b/mono/2.5d/assets/cube/CubeMath.cs new file mode 100644 index 00000000..f6c1d1e2 --- /dev/null +++ b/mono/2.5d/assets/cube/CubeMath.cs @@ -0,0 +1,72 @@ +using Godot; + +public class CubeMath : Spatial +{ + private static PackedScene cubePointScene = ResourceLoader.Load("res://assets/cube/cube_point.tscn"); + + private bool _isParentReady = false; + private Node2D _parent; + private Spatial[] _cubePointsMath = new Spatial[27]; // The math node of each 2.5D cube point + private Spatial[] _cubeMathSpatials = new Spatial[27]; // The CubeMath children that find position. + + public override void _Ready() + { + _parent = GetParent(); + + // Initialize the cube + for (int i = 0; i < 27; i++) + { + int a = (i / 9) - 1; + int b = (i / 3) % 3 - 1; + int c = (i % 3) - 1; + Vector3 spatialPosition = 5 * (a * Vector3.Right + b * Vector3.Up + c * Vector3.Back); + + _cubeMathSpatials[i] = new Spatial(); + _cubeMathSpatials[i].Translation = spatialPosition; + _cubeMathSpatials[i].Name = "CubeMath #" + i + ", " + a + " " + b + " " + c; + AddChild(_cubeMathSpatials[i]); + } + } + + public override void _Process(float delta) + { + if (Input.IsActionPressed("exit")) + { + GetTree().Quit(); + } + + if (Input.IsActionJustPressed("view_cube_demo")) + { + GetTree().ChangeScene("res://assets/demo_scene.tscn"); + return; + } + + if (_isParentReady) + { + RotateX(delta * (Input.GetActionStrength("move_back") - Input.GetActionStrength("move_forward"))); + RotateY(delta * (Input.GetActionStrength("move_right") - Input.GetActionStrength("move_left"))); + RotateZ(delta * (Input.GetActionStrength("move_counterclockwise") - Input.GetActionStrength("move_clockwise"))); + if (Input.IsActionJustPressed("reset_position")) + { + Transform = Transform.Identity; + } + for (int i = 0; i < 27; i++) + { + _cubePointsMath[i].GlobalTransform = _cubeMathSpatials[i].GlobalTransform; + } + } + else + { + // This code block will be run only once. It's not in _Ready() because the parent isn't set up there. + for (int i = 0; i < 27; i++) + { + PackedScene myCubePointScene = cubePointScene.Duplicate(true) as PackedScene; + Node25D cubePoint = myCubePointScene.Instance() as Node25D; + cubePoint.Name = "CubePoint #" + i; + _cubePointsMath[i] = cubePoint.GetChild(0); + _parent.AddChild(cubePoint); + } + _isParentReady = true; + } + } +} diff --git a/mono/2.5d/assets/cube/cube.tscn b/mono/2.5d/assets/cube/cube.tscn new file mode 100644 index 00000000..236e87c0 --- /dev/null +++ b/mono/2.5d/assets/cube/cube.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/node25d-cs/YSort25D.cs" type="Script" id=1] +[ext_resource path="res://assets/ui/overlay_cube.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/cube/CubeMath.cs" type="Script" id=4] + +[node name="Cube" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 3 )] + +[node name="Camera2D" type="Camera2D" parent="."] +current = true + +[node name="CubeMath" type="Spatial" parent="."] +script = ExtResource( 4 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 1 ) diff --git a/mono/2.5d/assets/cube/cube_point.tscn b/mono/2.5d/assets/cube/cube_point.tscn new file mode 100644 index 00000000..f7087b7e --- /dev/null +++ b/mono/2.5d/assets/cube/cube_point.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/cube/godot.png" type="Texture" id=3] + +[node name="CubePoint" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 0, 0 ) + +[node name="CubePointMath" type="Spatial" parent="."] + +[node name="CubePointSprite" type="Sprite" parent="."] +texture = ExtResource( 3 ) diff --git a/mono/2.5d/assets/cube/godot.png b/mono/2.5d/assets/cube/godot.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc37bb0031ab4089337c1d62ed5b8ed2736e1a2 GIT binary patch literal 2135 zcmV-d2&ngoP)#|Wb?K9*8dOoo}O-pi9h`PRL6-oK1^J2!p)CtJnPn{3(vacsV*Zl!J~^>sEOJfR`}~# z*Ac%v{_2PQjf5c*f2A=*jnwKe@u%~yCw_az%}+%#$>^5Ozx!of{NUTV)b2RvhG)I$$ocoY!h}f?)Jo0N?l2AtjNo%JX&OMS)J*L(pwkHR3vW^cwNf*+ z(*O~k6ukANMVh~1haQ`;@?dj~IjfjUjz>M2b$hG%NiIB-BF-u*h- zWzKtF$H)XZqgI%waA$J#@n{Fqf4#b{R)n+(6jz=x_#XbKgNR_qtxCzps3{R z5xG$*Ico12Fy=)5JO>WA;Dj3u`!--zK$yT2TVpV989|XH0`DyI(c?2$iQpJ8<|+?P zfQD@wuyo@dffobgT^4e`ccgeVhl6vBxypkRpkdnvOk3e6Fm-PVrd`IO_cFBUn*uHW zB%9!vbED?K3DB@@172L{C9v2m#*G0dKx14RaP2d5_0ZJimSamc?iN`6d9K?V04G4h zN*hmj^JoJ;_$F2+B9pWA(3EB3{B_UH)o0;}0%eU|dUbn(+ZzBU+yE^!&BF0w0*@YP zz?OZV3haq3lYe-zy88z;FgU2)AAhgH@)`~Oe+|FeD;&d~2!lI9yA6G`(A@LM55fap z@Ps#jSGP7`-umrglk#0oz3%wgvh-zEtvKJ=JE#R=>6{;nKnqQ@@n9~yc*7&-@$8-k z-23Lg)YaXqoa#2+;}tQ&%#_{9dMPNL<1r01(H?dlk9fs1-jA*UmpwK^37G}z?sw`r zb602oz$>2dP7O!ifMq_x0$yL`Lp-4Z&wv_^xBJmC|g>Xsgv=y?*Z)r~jYq`U9BN1-91V&6V}Uy5bk z^8s;$z&_D~IJ?;&d6`U%No}MwnEU{wwN@Z8KjmQg(D3%G1hmDg%t|eziMuq^|usS z&F8s?-2igPh2!U(XrP6rZN3Dj?M;z$=zv;UTC`%tNKxJ;md7UQ;R zfEf>LjMU3P2frpraXX_+362joA5OSACT!IJ8-(W@aI66XgHC~t-T{?2bt$c)Mc?Jt zD=eu}e&NMh^=Xb?2=x55K{U`p6Ky=;1y6Vb9%;a!)2Wh%P9>Bysi?j~&0YN(27a)N zYJS%KR4!|e7R(uy1C8Op3!d;++R%wt&op3ve7WVthqsJx<&4T!4LFBJHP7085HM#{ z4m8k0)8Zlx9zD|lE--{8R=PCySw@Y3tABX!+7QnAt(c-lJ?R@`8H_Q9xvu_M257nR zfyW-htJ@n;*Vv+Oa_U?Pha^-8%n3=O7~Qdc>(98)_eB~GuFW@e^r^7EgAlOV7MsBsFz1sC$8ezKile5rN8yQ? z?r*?y-(Z26F21B5@Q&ni6!-Sg&{oCc2`up1;n^D`e1kt1U;}cu*Z4O94_rF{KKnl#n_FZy?)mt~HG6(o`nVO3 zHXgvn-5-zbJwj7g_^Gn4K_IrcQH$Qq7?Y0$8r)EYCa9=w(3EAq<8zbL)lbdV*8QKV zwY^h-Ws5a>q0tO;L*$Nt3r@Jv04;_lcY<7Hco_G)#IAgDmgcV8rs$L$Ih{iS?C4m_ zzsjo9wx|+*z-Y$4R5m$mYV_FF=pPH@m~)IVhq>gC3kO_)EiQMIqJ^d{?-gdbeCIzt z3JCjBiJ1jzXlc`tqM^Bsn;hgH`X!uj+y7>1tGLEkmmitFLQ|IeYO(h&t?&!c>cB7x zBRJ+9W6WVLIb(IZ{ILfn3Mca;Gdwc4ak4%%b^NvWZFHP?&7&9a2-(?_=&?C!rRI~a zf8czF@hB+~FxeiQq-F>B+d0<|zdiGoN%ZLKEl)>M^Rb7g!DN4Y{(m~~D#mf1ZleGI N002ovPDHLkV1g5yGWh@i literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/cube/godot.png.import b/mono/2.5d/assets/cube/godot.png.import new file mode 100644 index 00000000..0cc11e6b --- /dev/null +++ b/mono/2.5d/assets/cube/godot.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/cube/godot.png" +dest_files=[ "res://.import/godot.png-a942b208c71d1b44958f34d302d011ec.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/demo_scene.tscn b/mono/2.5d/assets/demo_scene.tscn new file mode 100644 index 00000000..aaba9103 --- /dev/null +++ b/mono/2.5d/assets/demo_scene.tscn @@ -0,0 +1,614 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://addons/node25d-cs/YSort25D.cs" type="Script" id=1] +[ext_resource path="res://assets/ui/overlay.tscn" type="PackedScene" id=3] +[ext_resource path="res://assets/player/player_25d.tscn" type="PackedScene" id=4] +[ext_resource path="res://assets/shadow/shadow_25d.tscn" type="PackedScene" id=5] +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=6] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=7] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=8] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=9] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=3] +extents = Vector3( 5, 0.5, 5 ) + +[sub_resource type="BoxShape" id=4] +extents = Vector3( 5, 0.5, 5 ) + +[node name="DemoScene" type="Node2D"] + +[node name="Overlay" parent="." instance=ExtResource( 3 )] + +[node name="Player25D" parent="." instance=ExtResource( 4 )] +position = Vector2( 0, -226.274 ) +z_index = -3952 + +[node name="Shadow25D" parent="." instance=ExtResource( 5 )] +visible = true +position = Vector2( 1.00261e-06, 11.2685 ) +z_index = -3958 +spatialPosition = Vector3( 3.13315e-08, -0.498, 3.13315e-08 ) + +[node name="Platform0" type="Node2D" parent="."] +position = Vector2( -256, -113.137 ) +z_index = -3954 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -8, 5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform0"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform0/PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform0"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform1" type="Node2D" parent="."] +position = Vector2( -256, -339.411 ) +z_index = -3956 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -8, 5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform1"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -8, 5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform1/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform1"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform2" type="Node2D" parent="."] +position = Vector2( 0, 22.6274 ) +z_index = -3962 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 0, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform2"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform2/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform2"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform3" type="Node2D" parent="."] +position = Vector2( 320, 22.6274 ) +z_index = -3960 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform3"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform3/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform3"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform4" type="Node2D" parent="."] +position = Vector2( 0, -203.647 ) +z_index = -3966 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 0, -1, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform4"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform4/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform4"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform5" type="Node2D" parent="."] +position = Vector2( 320, -113.137 ) +z_index = -3984 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, -10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform5"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, -10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform5/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform5"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform6" type="Node2D" parent="."] +position = Vector2( 320, 113.137 ) +z_index = -3980 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform6"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform6/PlatformMath"] +shape = SubResource( 2 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform6"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform7" type="Node2D" parent="."] +position = Vector2( 320, 339.411 ) +z_index = -3978 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform7"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform7/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform7"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform8" type="Node2D" parent="."] +position = Vector2( 320, 565.685 ) +z_index = -3976 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform8"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform8/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform8"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform21" type="Node2D" parent="."] +position = Vector2( 320, 791.96 ) +z_index = -3972 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 30 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform21"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 30 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform21/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform21"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform22" type="Node2D" parent="."] +position = Vector2( 320, 1018.23 ) +z_index = -3970 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 10, -5, 40 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform22"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 10, -5, 40 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform22/PlatformMath"] +shape = SubResource( 3 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform22"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform9" type="Node2D" parent="."] +position = Vector2( 640, 339.411 ) +z_index = -3974 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 20, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform9"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform9/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform9"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform10" type="Node2D" parent="."] +position = Vector2( 896, 294.156 ) +z_index = -3994 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 3 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform10"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 3 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform10/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform10"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform11" type="Node2D" parent="."] +position = Vector2( 896, 520.431 ) +z_index = -3990 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 13 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform11"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 13 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform11/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform11"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform12" type="Node2D" parent="."] +position = Vector2( 896, 746.705 ) +z_index = -3988 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 28, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform12"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 28, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform12/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform12"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform13" type="Node2D" parent="."] +position = Vector2( 576, 746.705 ) +z_index = -3992 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 18, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform13"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 18, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform13/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform13"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform14" type="Node2D" parent="."] +position = Vector2( 256, 746.705 ) +z_index = -3996 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( 8, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform14"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 8, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform14/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform14"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform15" type="Node2D" parent="."] +position = Vector2( -64, 746.705 ) +z_index = -3998 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -2, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform15"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform15/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform15"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform23" type="Node2D" parent="."] +position = Vector2( -384, 746.705 ) +z_index = -4000 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -12, -10, 23 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform23"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12, -10, 23 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform23/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform23"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform16" type="Node2D" parent="."] +position = Vector2( -320, 565.685 ) +z_index = -3982 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -10, -5, 20 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform16"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 20 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform16/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform16"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform19" type="Node2D" parent="."] +position = Vector2( -320, 339.411 ) +z_index = -3986 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -10, -5, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform19"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -10, -5, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform19/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform19"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform17" type="Node2D" parent="."] +position = Vector2( -480, 248.902 ) +z_index = -3964 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -15, -1, 10 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform17"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 10 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform17/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform17"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="Platform18" type="Node2D" parent="."] +position = Vector2( -480, 22.6274 ) +z_index = -3968 +script = ExtResource( 6 ) +__meta__ = { +"_editor_icon": ExtResource( 7 ) +} +spatialPosition = Vector3( -15, -1, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="Platform18"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -15, -1, 0 ) +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="Platform18/PlatformMath"] +shape = SubResource( 4 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="Platform18"] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 8 ) +script = ExtResource( 9 ) + +[node name="YSort25D" type="Node" parent="."] +script = ExtResource( 1 ) diff --git a/mono/2.5d/assets/platform/platform.tscn b/mono/2.5d/assets/platform/platform.tscn new file mode 100644 index 00000000..e9bbaeff --- /dev/null +++ b/mono/2.5d/assets/platform/platform.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/platform/textures/forty_five.png" type="Texture" id=3] +[ext_resource path="res://assets/platform/platform_sprite.gd" type="Script" id=4] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 5, 0.5, 5 ) + +[node name="Platform" type="Node2D"] +z_index = -3954 +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 0, 0 ) + +[node name="PlatformMath" type="StaticBody" parent="."] +collision_layer = 1048575 +collision_mask = 1048575 + +[node name="CollisionShape" type="CollisionShape" parent="PlatformMath"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlatformSprite" type="Sprite" parent="."] +scale = Vector2( 0.5, 0.5 ) +texture = ExtResource( 3 ) +script = ExtResource( 4 ) diff --git a/mono/2.5d/assets/platform/platform_sprite.gd b/mono/2.5d/assets/platform/platform_sprite.gd new file mode 100644 index 00000000..4b6dcb43 --- /dev/null +++ b/mono/2.5d/assets/platform/platform_sprite.gd @@ -0,0 +1,39 @@ +tool +extends Sprite + +onready var _forty_five = preload("res://assets/platform/textures/forty_five.png") +onready var _isometric = preload("res://assets/platform/textures/isometric.png") +onready var _top_down = preload("res://assets/platform/textures/top_down.png") +onready var _front_side = preload("res://assets/platform/textures/front_side.png") +onready var _oblique_y = preload("res://assets/platform/textures/oblique_y.png") +onready var _oblique_z = preload("res://assets/platform/textures/oblique_z.png") + +func _process(_delta): + if Input.is_action_pressed("forty_five_mode"): + set_view_mode(0) + elif Input.is_action_pressed("isometric_mode"): + set_view_mode(1) + elif Input.is_action_pressed("top_down_mode"): + set_view_mode(2) + elif Input.is_action_pressed("front_side_mode"): + set_view_mode(3) + elif Input.is_action_pressed("oblique_y_mode"): + set_view_mode(4) + elif Input.is_action_pressed("oblique_z_mode"): + set_view_mode(5) + + +func set_view_mode(view_mode_index): + match view_mode_index: + 0: # 45 Degrees + texture = _forty_five; + 1: # Isometric + texture = _isometric + 2: # Top Down + texture = _top_down + 3: # Front Side + texture = _front_side + 4: # Oblique Y + texture = _oblique_y + 5: # Oblique Z + texture = _oblique_z diff --git a/mono/2.5d/assets/platform/textures/forty_five.png b/mono/2.5d/assets/platform/textures/forty_five.png new file mode 100644 index 0000000000000000000000000000000000000000..e4422bb3d1a0973be7236aa00bbb6ba7bfbadb49 GIT binary patch literal 2276 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sVEn_u1{85TD#rq(*pj^6T^JG=<}f6#J9{Ss zD8gCb5n0T@z%2~Ij105pNB{-dOFVsD*`F}UaBwnq-k2o9z`#-H>EaktaqI0Z!z?C8 ziMEG6GZtv(v~Xx%suYiYKdE@x6)i@?1p)_;Ik}#!U|t8GO;=}N5NH6J<-oweq5yQB0ML0H3=Iq{3=RxT3Sb z`m$m}xWm-yskID!_wDwSE)bpl^->&T=)2Hwj5C5hU29ajp}io#hM5DG6?j~L$6-{} zg~u>FVMK;5!U2xWP=rB;2}e!=>3T2`m|OT9 ztC>5-?4w6Yl% zU!?28l6+x?;Yr4%>r!Bt%Yd(T!C@&5VFFba9$gLYU9q+nEf0P<2)+?jV36K)|L-nv zuH!h+Hm8sMIxVtDkzlxe{5l4P0Kxsh>UA*35k|$|u;(trgfOT5hnyvhfb9_mPgg&e IbxsLQ0NEf6_W%F@ literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/forty_five.png.import b/mono/2.5d/assets/platform/textures/forty_five.png.import new file mode 100644 index 00000000..3fbd8972 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/forty_five.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/forty_five.png" +dest_files=[ "res://.import/forty_five.png-d90cd8ed1241c4a5270d87a83aafe24d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/front_side.png b/mono/2.5d/assets/platform/textures/front_side.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3bdd78588f8f7bb99891c2a8e0a64efbc038a8 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xeZ8+F~Fdh=gh_@|-P~t+$}|QBMmJ9v$B>F!Z*L#ub#M@H z2y_wV;|l0p9e3sB8wJQG!5Xuh$E`JYhEGtq!s{L8cx z7#dQLRq{k10IHgx%kVw75a`Ly9ZYNt0u2ld91aW&Ky?gE0zhYSz)e6zDVO1}dJGJ~h9pUXO@geCwGiCUxp literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/front_side.png.import b/mono/2.5d/assets/platform/textures/front_side.png.import new file mode 100644 index 00000000..eb4230ff --- /dev/null +++ b/mono/2.5d/assets/platform/textures/front_side.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/front_side.png" +dest_files=[ "res://.import/front_side.png-057b43bb7270572907c729580068368b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/isometric.png b/mono/2.5d/assets/platform/textures/isometric.png new file mode 100644 index 0000000000000000000000000000000000000000..7045d86bf7d78bac2f791e12f0bc4b78431dfe8e GIT binary patch literal 41122 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/isometric.png.import b/mono/2.5d/assets/platform/textures/isometric.png.import new file mode 100644 index 00000000..e722a8d6 --- /dev/null +++ b/mono/2.5d/assets/platform/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-364f65b60f600b10cfb048c20ea82124.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/oblique_y.png b/mono/2.5d/assets/platform/textures/oblique_y.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0b0d24bfdec9ff4b91f86463bf07ba64654cd4 GIT binary patch literal 3148 zcmeAS@N?(olHy`uVBq!ia0y~yU|I#j9Be?5PpvgsK#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJUmtIx{)azMG8o-U3d6}R5r*ywxML82kh z`jn8!6%E%i5BJl0XAbIZDY>cWI>pNM7>Bfj)SL4^_FkLzu0;Lsuad{FZ~v}kU`Pnv zXJ>!xmz?=JPKJcqxNq%$l9vXsG6<}85@lf6s1?G<5K*#*E0lp@5}4z0Y!y&eK@ue0 zkTQ5AUX`6YYiIlZj>HG`yz84QS=SWB=_-clFMs^w#Qr#-CuZ1$wQ4aiboYiXW7%pgdN(1!z7<9+~C<1{{cwjTTr15ywU=0G$jH$3}x3 z4iZPEv3UgML2Mp@d5~z2z&wV{BQOtQ^9V>iDIS4&Y|wfLTa3Uwh#Vs@kHBbBJ%lx8 zU`Y=-iNRt9Mq`bkRmu#b37({!i#Ir-IT}5|&p1|g?r8q?&C(2F2lp_|m?uuf+#j*= z?VN6VU7DB=F9gNim->O-doZ)(I5eCQrP=acFok_$d^vlqyru!0Vqre=9TRS#h; zC-B4!%wwc_h}41)Z`HK$6$gFl6Y3Vfc!HJG;KWy-P&IwP3cx>E*3Tbpe|?jep*tat z(dT?O&@(VObefuJ3OToLsCaC^bNKYXf^rcC2A`KjR(bCs+)d1BuAX!gWKbLh* G2~7Yy_G*s+ literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/oblique_y.png.import b/mono/2.5d/assets/platform/textures/oblique_y.png.import new file mode 100644 index 00000000..d7c1330f --- /dev/null +++ b/mono/2.5d/assets/platform/textures/oblique_y.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_y.png" +dest_files=[ "res://.import/oblique_y.png-ed89b3ef35707993300443a84f7ebbd1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/oblique_z.png b/mono/2.5d/assets/platform/textures/oblique_z.png new file mode 100644 index 0000000000000000000000000000000000000000..a859ccb6e140b3dfd7da2d7ce6841139420b1553 GIT binary patch literal 8917 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/platform/textures/oblique_z.png.import b/mono/2.5d/assets/platform/textures/oblique_z.png.import new file mode 100644 index 00000000..044a1c0f --- /dev/null +++ b/mono/2.5d/assets/platform/textures/oblique_z.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/platform/textures/oblique_z.png" +dest_files=[ "res://.import/oblique_z.png-270f041a55370c5ba68850a072597e97.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/platform/textures/top_down.png b/mono/2.5d/assets/platform/textures/top_down.png new file mode 100644 index 0000000000000000000000000000000000000000..53f9b83ee7cbc98099c95f02d2be444d1fc3e8e8 GIT binary patch literal 2686 zcmeAS@N?(olHy`uVBq!ia0y~yU}^wi4mO|&&)Jj8K#DEN+uemBfng3q;<~eUGJqnS z1s;*b3=G`DAk4@xYmNj^kiEpy*OmPVlMJT@)7+jtRSXPV+@3CuAr-gY-f-k?FyL_r zR4_is$f)tKOZRBh>i3)s*+xrw~wm=Ux-Hx1?i1#rbUD!N=r}W0-ef+xcI008p0kn&5y2!4TNOU3o zK*CjTlCFzofhbY6F +/// Handles Player-specific behavior like moving. We calculate such things with KinematicBody. +/// +public class PlayerMath25D : KinematicBody +{ + private Node25D _parent; + public real_t verticalSpeed = 0; + public bool isometricControls = true; + + public override void _Ready() + { + _parent = GetParent(); + } + + public override void _Process(real_t delta) + { + if (Input.IsActionPressed("exit")) + { + GetTree().Quit(); + } + + if (Input.IsActionJustPressed("view_cube_demo")) + { + GetTree().ChangeScene("res://assets/cube/cube.tscn"); + return; + } + + if (Input.IsActionJustPressed("toggle_isometric_controls")) + { + isometricControls = !isometricControls; + } + + if (Input.IsActionPressed("reset_position")) + { + Transform = new Transform(Basis.Identity, Vector3.Up * 10); + verticalSpeed = 0; + } + else + { + HorizontalMovement(delta); + VerticalMovement(delta); + } + } + + /// + /// Checks WASD and Shift for horizontal movement via MoveAndSlide. + /// + private void HorizontalMovement(real_t delta) + { + Vector3 localX = Vector3.Right; + Vector3 localZ = Vector3.Back; + + if (isometricControls && _parent.Basis25D.x.IsEqualApprox(Basis25D.Isometric.x * Node25D.SCALE)) + { + localX = new Vector3(0.70710678118f, 0, -0.70710678118f); + localZ = new Vector3(0.70710678118f, 0, 0.70710678118f); + } + + // Gather player input and add directional movement to force Vector3 variables + Vector3 moveDir = Vector3.Zero; + moveDir += localX * (Input.GetActionStrength("move_right") - Input.GetActionStrength("move_left")); + moveDir += localZ * (Input.GetActionStrength("move_back") - Input.GetActionStrength("move_forward")); + + moveDir = moveDir.Normalized() * delta * 600; + if (Input.IsActionPressed("movement_modifier")) + { + moveDir /= 2; + } + MoveAndSlide(moveDir); + } + + /// + /// Checks Jump and applies gravity and vertical speed via MoveAndCollide. + /// + /// Time delta since last call + private void VerticalMovement(real_t delta) + { + if (Input.IsActionJustPressed("jump")) + { + verticalSpeed = 1.25f; + } + verticalSpeed -= delta * 5; // Gravity + var k = MoveAndCollide(Vector3.Up * verticalSpeed); + if (k != null) + { + verticalSpeed = 0; + } + } +} diff --git a/mono/2.5d/assets/player/PlayerSprite.cs b/mono/2.5d/assets/player/PlayerSprite.cs new file mode 100644 index 00000000..70e338ad --- /dev/null +++ b/mono/2.5d/assets/player/PlayerSprite.cs @@ -0,0 +1,229 @@ +using Godot; +#if REAL_T_IS_DOUBLE +using real_t = System.Double; +#else +using real_t = System.Single; +#endif + +public class PlayerSprite : Sprite +{ + private static Texture _stand = ResourceLoader.Load("res://assets/player/textures/stand.png"); + private static Texture _jump = ResourceLoader.Load("res://assets/player/textures/jump.png"); + private static Texture _run = ResourceLoader.Load("res://assets/player/textures/run.png"); + private const int FRAMERATE = 15; + + private int _direction; + private float _progress; + private Node25D _parent; + private PlayerMath25D _parentMath; + + public override void _Ready() + { + _parent = GetParent(); + _parentMath = _parent.GetChild(0); + } + + public override void _Process(real_t delta) + { + SpriteBasis(); + bool movement = CheckMovement(); // Always run to get direction, but don't always use return bool. + + // Test-only move and collide, check if the player is on the ground. + var k = _parentMath.MoveAndCollide(Vector3.Down * 10 * delta, true, true, true); + if (k != null) + { + if (movement) + { + // TODO: https://github.com/godotengine/godot/issues/28748 + Hframes = 6; + Texture = _run; + if (Input.IsActionPressed("movement_modifier")) + { + delta /= 2; + } + _progress = (_progress + FRAMERATE * delta) % 6; + Frame = _direction * 6 + (int)_progress; + } + else + { + Hframes = 1; + Texture = _stand; + _progress = 0; + Frame = _direction; + } + } + else + { + Hframes = 2; + Texture = _jump; + _progress = 0; + int jumping = _parentMath.verticalSpeed < 0 ? 1 : 0; + Frame = _direction * 2 + jumping; + } + } + + public void SetViewMode(int viewModeIndex) + { + Transform2D t = Transform; + switch (viewModeIndex) + { + case 0: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 0.75f); + break; + case 1: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 1); + break; + case 2: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 0.5f); + break; + case 3: + t.x = new Vector2(1, 0); + t.y = new Vector2(0, 1); + break; + case 4: + t.x = new Vector2(1, 0); + t.y = new Vector2(0.75f, 0.75f); + break; + case 5: + t.x = new Vector2(1, 0.25f); + t.y = new Vector2(0, 1); + break; + } + Transform = t; + } + + /// + /// Change the basis of the sprite to try and make it fit multiple view modes. + /// + private void SpriteBasis() + { + if (Input.IsActionPressed("forty_five_mode")) + { + SetViewMode(0); + } + else if (Input.IsActionPressed("isometric_mode")) + { + SetViewMode(1); + } + else if (Input.IsActionPressed("top_down_mode")) + { + SetViewMode(2); + } + else if (Input.IsActionPressed("front_side_mode")) + { + SetViewMode(3); + } + else if (Input.IsActionPressed("oblique_y_mode")) + { + SetViewMode(4); + } + else if (Input.IsActionPressed("oblique_z_mode")) + { + SetViewMode(5); + } + } + + // There might be a more efficient way to do this, but I can't think of it. + private bool CheckMovement() + { + // Gather player input and store movement to these int variables. Note: These indeed have to be integers. + int x = 0; + int z = 0; + + if (Input.IsActionPressed("move_right")) + { + x++; + } + if (Input.IsActionPressed("move_left")) + { + x--; + } + if (Input.IsActionPressed("move_forward")) + { + z--; + } + if (Input.IsActionPressed("move_back")) + { + z++; + } + + // Check for isometric controls and add more to movement accordingly. + // For efficiency, only check the X axis since this X axis value isn't used anywhere else. + if (!_parentMath.isometricControls && _parent.Basis25D.x.IsEqualApprox(Basis25D.Isometric.x * Node25D.SCALE)) + { + if (Input.IsActionPressed("move_right")) + { + z++; + } + if (Input.IsActionPressed("move_left")) + { + z--; + } + if (Input.IsActionPressed("move_forward")) + { + x++; + } + if (Input.IsActionPressed("move_back")) + { + x--; + } + } + + // Set the direction based on which inputs were pressed. + if (x == 0) + { + if (z == 0) + { + return false; // No movement + } + else if (z > 0) + { + _direction = 0; + } + else + { + _direction = 4; + } + } + else if (x > 0) + { + if (z == 0) + { + _direction = 2; + FlipH = true; + } + else if (z > 0) + { + _direction = 1; + FlipH = true; + } + else + { + _direction = 3; + FlipH = true; + } + } + else + { + if (z == 0) + { + _direction = 2; + FlipH = false; + } + else if (z > 0) + { + _direction = 1; + FlipH = false; + } + else + { + _direction = 3; + FlipH = false; + } + } + return true; // There is movement + } +} diff --git a/mono/2.5d/assets/player/player_25d.tscn b/mono/2.5d/assets/player/player_25d.tscn new file mode 100644 index 00000000..8827fa27 --- /dev/null +++ b/mono/2.5d/assets/player/player_25d.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/node25d-cs/Node25D.cs" type="Script" id=1] +[ext_resource path="res://addons/node25d-cs/icons/node_25d_icon.png" type="Texture" id=2] +[ext_resource path="res://assets/player/PlayerMath25D.cs" type="Script" id=3] +[ext_resource path="res://assets/player/textures/stand.png" type="Texture" id=4] +[ext_resource path="res://assets/player/PlayerSprite.cs" type="Script" id=5] + +[sub_resource type="BoxShape" id=1] +extents = Vector3( 0.5, 1, 0.5 ) + +[node name="Player25D" type="Node2D"] +position = Vector2( 0, -226.274 ) +z_index = 100 +script = ExtResource( 1 ) +__meta__ = { +"_editor_icon": ExtResource( 2 ) +} +spatialPosition = Vector3( 0, 10, 0 ) + +[node name="PlayerMath25D" type="KinematicBody" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0 ) +script = ExtResource( 3 ) + +[node name="CollisionShape" type="CollisionShape" parent="PlayerMath25D"] +shape = SubResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="PlayerSprite" type="Sprite" parent="."] +scale = Vector2( 1, 0.75 ) +z_index = 1 +texture = ExtResource( 4 ) +vframes = 5 +script = ExtResource( 5 ) + +[node name="PlayerCamera" type="Camera2D" parent="PlayerSprite"] +current = true diff --git a/mono/2.5d/assets/player/textures/jump.png b/mono/2.5d/assets/player/textures/jump.png new file mode 100755 index 0000000000000000000000000000000000000000..340d72b8ba12eecd862a95d1639746a58983c27e GIT binary patch literal 3744 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 S+Y?v5Mc};8-M(TEJ@J3yPrQc! literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/player/textures/jump.png.import b/mono/2.5d/assets/player/textures/jump.png.import new file mode 100644 index 00000000..bdbb55e4 --- /dev/null +++ b/mono/2.5d/assets/player/textures/jump.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/jump.png-ee91d86ec39d8c1dde239a382e843e86.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/player/textures/jump.png" +dest_files=[ "res://.import/jump.png-ee91d86ec39d8c1dde239a382e843e86.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/player/textures/run.png b/mono/2.5d/assets/player/textures/run.png new file mode 100644 index 0000000000000000000000000000000000000000..900742aea3dbddd893d976d8779c737a2efb4ddf GIT binary patch literal 8034 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 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/player/textures/run.png.import b/mono/2.5d/assets/player/textures/run.png.import new file mode 100644 index 00000000..90a63b51 --- /dev/null +++ b/mono/2.5d/assets/player/textures/run.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/player/textures/run.png" +dest_files=[ "res://.import/run.png-6110949046e0632be1a9b1c8ac504217.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/player/textures/stand.png b/mono/2.5d/assets/player/textures/stand.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbc364fda0199448087c36b0ff09634035f95eb GIT binary patch literal 1844 zcmV-42g~@0P)oJPz48Z0p+QFMopxgIb!DOi7RSXH@;Y>aMaIa)E100001 zbW%=J06^y0W&i*NvPnciRCwCm+5v2xGWp}R}0vzH zo9@%=s2veNA~pdL+DMIdj(sT0!-N_I-G{Gz3Z700@cvy6pZx@q#gYOh$LBAQ2Dfv$ z_vqPPI=!dBFJud`n>OyLLzsx~BEAug_4a)od`~YHtTmgqRvL7vd8FIJQ*+ zV_QA}T-!P}=E}Ar5;PrS{5A($HWaKstbKP7vwGV0EBppVE>y!{OXXK zN8`VV0Bi<0w&im`1-2C{1|Zty#sF|r8Nm+V?{%QL0qy@D>?=$qDtag%6~j~>70*a8 zfKDn0;L!u=$Ege)a>bC~^n@7sK!GMeC`3k|#y&WS5V;T3Y2+%fg^;l#CsM@p;d^^& z{qVg*y%YH%c7V?hz5{%I_%Wy>77XJTBNjk0aCrd00qY>*L9?BMn+Uq{kH(l}2PqA@ zPxbj#zipGC$`2v9T?)uDKVT9e2}Bbx^5TF7{a*q=K1xWCfA%TB8~r^J{QCKi0N*T@ zB>2r&NBCDw1Nn#KWbc5^4B=J90>aFQ=6b{8sX zva?(ZlO`N;yTD{$bvfWBEvx}eZVs|401S}&^_T;)55+TJK&Bw(fb_w~t_o-nLx3km z5t0BEY6&o=XDHMnQ*Owdr4W4x(wcQK=7G=u!zMhim17NHZuxg8Kg6}~AD|{blz`6< zjtY7#_(oBTSkM{3PWhq!AO&Kg`THd~zhQwsH`gf#UYl3^X`<5yn*-oEs?C5e54->m zIWVdPm?`!c6efDf088(kEjS>uLd|~90_;xj`A74d2k)81YHc&%e6e2rvCV+T=GEBe zKr3=X;6M{%9<)$}5eG6n8Y2fT)x`}9es^YWu*-qD(JExX?dtAPG3J4eJRaO|K>lF0 zzR@WIlGS=H*n9G~3m)jR8lcAKD;C6kPuBpq%Y#g*lmS|0$N`PR9FPXGQv>=iQY^@D zsQN5WDvUTFwblVLpfbg%$AS~+@be`2E^?p`4i9qQ!6O#LL97LPvDl}k5;_(C5BcHi zJHLMjcFPZ=T7X!j9OxBARJZ!W&cHpf**FOavtG!PQ0r4Vd0S2Ii7{6>30e_k#|FDJ zKsQH>+9?U*pzlV|UQ!_MB~X@kPXT#)5tSghXO@#70!-FR1|Xt+OM>ZqRD$$7e_}ym zeTxAF;#iW;r*$#8)OtdL=EY=c%%wyUbS94%cdrg&65z|&nBf~7Qy@OUSoxomvlPT9 z5deH%5WsS~76Q1f5edS^HA3fSNC1gp!ysN<76iz9q&zSdpU+Y zIE~ZBdRczx^@Imi{YSvmfK&651(OWgHGs`oAD9~OxB_e#G&elxJE00VkVjrE7zSew zU{Vww3(8%1HOGJq&{%uC%DSu;g|&y>s~HoyT5&S zN8Uf|oF6KXa$pG1tIH3g+SPw|uv7oTRfw29`QP?G;L~el`yX7yi0gmIp{#`If5@wG zNSOYI49f~)FkMM=?F2Ni+nq1DSLKf0OMCfK<_LJl^dlM*2R7eMGF1jq`+5?~Qh;AjJe6p*SYQdtx#CBfz&NFcHeU_y*i iX|-{$AHI0|!#@EBKxsdV&|Pr=0000^ttsS|C1Qh#q*iUI9l3C)@oM_LPySm0~NHvE&!rc+^nr#5B&s@9nb1DxvA{wQ(gQ5f)}Gl}0w?F%E^moh6> z2_vnUI3}P_9 zBg>xlMqCXRRj0000$)mS!;JSYUV)S{{q9@d+)j4YUnDI zrWUsL4oy#4l!|#b$meMaz}G={Sp)JL|X`i-gARb|Rsj zyGkTf<$pl_FUVhn`P(r6Aj&$5^Dm?P>o|WP$sft`htmA9JpW;m|1^911eq0s%gEld Q?f?J)07*qoM6N<$g5P;`umAu6 literal 0 HcmV?d00001 diff --git a/mono/2.5d/assets/shadow/textures/isometric.png.import b/mono/2.5d/assets/shadow/textures/isometric.png.import new file mode 100644 index 00000000..9c56cf1f --- /dev/null +++ b/mono/2.5d/assets/shadow/textures/isometric.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/shadow/textures/isometric.png" +dest_files=[ "res://.import/isometric.png-1a91c869806816b66a8fb886d4801f31.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/mono/2.5d/assets/shadow/textures/oblique_y.png b/mono/2.5d/assets/shadow/textures/oblique_y.png new file mode 100644 index 0000000000000000000000000000000000000000..f48cf507ec98a6085512de5b6f4976655022ab9c GIT binary patch literal 353 zcmV-n0iOPeP)wJy5m1AGqoIY28f6x4_C%dLxzT|-I(VrE z33Zlu@aGa5AWgjdievorn&-Hn!4~S_$Y`*Pqgp@{1S)wniRZ^6nj}`wZ+QnhnrP=+ z4o&9x(uyWqtp->bq6}1CfXPePkb#X-Kn4P(gbXA~Co*tS%E&;bbRh%RKl%XUUtm8% z`)Byko*fhb0Kgy!?BALg_hBKXf_+5(75gyqaqJ6;uVlQG@>=ePiJxYEocek00fk32 z9#VNs=Ru`MwH{V`Tj00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliruQ8)X#7@z0ZNE))_dSjwe>7%xR-wAFER#y{P+j`~9BbZluwQOiv%G+asu37hpr z%1|x=LiW7beeulm-E+?GTsBC$d>*6d4qf#sCkG3Ks!49E*I=guS&ExZ2q)Uw9SU`1nQOu4OJR*+nJOXA3y zUo5IeU11`FCd_zOStPuHge!ubGa+_h>H4s&+deX5RKIMOv51VR*o>~JwjmYwP0HUW z&q2XmgV8k(mQ>6dck2QXTpu@}99^lpd**y#pr;~fmr4F|*oaxPMnyfBeWIn+`I@|Y z9;hhx=+m*)z3v1nnDfwR*ShQES3|WEY}jYMFqD!{ZNJv-L>I_>+?PJqmm;cZ%cf>@ zPBl}$H7%baDi-_8>RDLEwC~LHI1SEcY{i0_Gol{%wW(A=WbB!@(|&zh77x6ilKxJb zLd`QP;&zKXwz98$BA+TMX!*muz2km-{QS_YKIvNQv7c<7H2=1ZnNv#Dr^JCj{b>E| zNdvchY9iHa1$%z?gIA}=8o{KBT#Bf?sz>HequQ{d_Y9_5SF0XdIE!k-223clm#tJp zvEh3gY8Pz>L0KskR90-$hM%pq>*_o#qhvUh@;&g6=bqZ{y!S{+8m~ODVEM8bMW~B! zJotmGLrsgG__y5wFN4LZ4sKY`SuI=s^P44gM^~?pY*}%?t6m?_61=o()w8QSIvvJe zjT-49a7_)no?Er$Wq035?kLMkB!VDF zBoY}}vDetKVN=zzJ)!&B45xmDCQO?&q=*p3t4lno}ET3|f ep}_{kV`yMjaA08Us+(U9;(5CIxvXiWR}k0J>)@%+m2K;1E;{LE z?Uax^$L;igDIG(Vz>@#}|Gz1+js_}XED7=pW^j0RBMr!z?CIhdQgQ3(IY&`vMIM)n zQ5~%t1-O$Lxg!oRi4{aITgWb=l7Dg16TN@W&-%UB6MoSUydbBbU;HU^xy{aS2HkuI zRt49FAF7`nv+w+Eytno#^ZkcQ%2{93_WZE