163 lines
3.4 KiB
C#
163 lines
3.4 KiB
C#
|
|
using Godot;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/Sensor.svg")]
|
|
public partial class DirectionalInputIconDefinition: InputIconDefinition
|
|
{
|
|
[Export]
|
|
public Texture2D backgroundTexture;
|
|
|
|
|
|
[ExportGroup("Directions")]
|
|
|
|
|
|
|
|
[Export]
|
|
public Texture2D directionRightTexture;
|
|
|
|
[Export]
|
|
public Texture2D directionDownTexture;
|
|
|
|
[Export]
|
|
public Texture2D directionLeftTexture;
|
|
|
|
[Export]
|
|
public Texture2D directionUpTexture;
|
|
|
|
[Export]
|
|
public float directionalOffset = 0;
|
|
|
|
|
|
[ExportGroup("Overlays")]
|
|
[Export]
|
|
public LocaleText label;
|
|
|
|
[Export]
|
|
public float fontSizeScale = 1;
|
|
|
|
[Export]
|
|
public bool isUpperCase = true;
|
|
|
|
[Export]
|
|
public Texture2D buttonPressTexture;
|
|
|
|
|
|
static int GetAngle<T>( T value, params T[] values )
|
|
{
|
|
var index = Arrays.IndexOf( values, value );
|
|
|
|
if ( index == -1 )
|
|
{
|
|
return index;
|
|
}
|
|
|
|
return index * 90;
|
|
}
|
|
|
|
public static int GetAngleOfIcon( InputIcon icon )
|
|
{
|
|
if ( icon is GamePadButtonIcon bi )
|
|
{
|
|
return GetAngle( bi.button, JoyButton.DpadRight, JoyButton.DpadDown, JoyButton.DpadLeft, JoyButton.DpadUp );
|
|
}
|
|
else if ( icon is GamePadAxisIcon ai )
|
|
{
|
|
if ( JoyAxis.LeftX == ai.axis || JoyAxis.RightX == ai.axis )
|
|
{
|
|
return GamePadAxisType.Positive == ai.type ? 0 : 180;
|
|
}
|
|
|
|
if ( JoyAxis.LeftY == ai.axis || JoyAxis.RightY == ai.axis )
|
|
{
|
|
return GamePadAxisType.Positive == ai.type ? 90 : 270;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
}
|
|
|
|
public override List<IconElement> GetIconElementsForIcon( InputIcon icon )
|
|
{
|
|
var list = new List<IconElement>();
|
|
|
|
var bg = TextureIconElement.Create( backgroundTexture, 1 );
|
|
list.Add( bg );
|
|
|
|
if ( label != null )
|
|
{
|
|
var labelText = LabelIconElement.Create( label, fontSizeScale, isUpperCase );
|
|
list.Add( labelText );
|
|
}
|
|
|
|
if ( icon is GamePadAxisIcon || icon is GamePadButtonIcon )
|
|
{
|
|
var ai = icon as GamePadAxisIcon;
|
|
var bi = icon as GamePadButtonIcon;
|
|
var angle = ai != null ? GetAngleOfIcon( ai ) : GetAngleOfIcon( bi );
|
|
var rotation = 0f;
|
|
var texture = GetDirectionTexture( angle, out rotation );
|
|
|
|
var dir = TextureIconElement.Create( texture, 1 );
|
|
dir.alignment = TextureIconOverlayAlignment.Left;
|
|
|
|
dir.rotation = rotation;
|
|
|
|
list.Add( dir );
|
|
}
|
|
|
|
|
|
return list;
|
|
}
|
|
|
|
List<Texture2D> GetAllTextures()
|
|
{
|
|
return new List<Texture2D>(){ directionRightTexture, directionDownTexture, directionLeftTexture, directionUpTexture };
|
|
}
|
|
|
|
Texture2D GetDirectionTexture( int angle, out float rotation )
|
|
{
|
|
var textures = GetAllTextures();
|
|
|
|
var nonNullIndex = -1;
|
|
rotation = 0;
|
|
|
|
for ( int i = 0; i < textures.Count; i++ )
|
|
{
|
|
if ( textures[ i ] == null )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( i * 90 == angle )
|
|
{
|
|
return textures[ i ];
|
|
}
|
|
|
|
if ( nonNullIndex != -1 )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
nonNullIndex = i;
|
|
|
|
}
|
|
|
|
if ( nonNullIndex == -1 )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
rotation = angle - nonNullIndex * 90;
|
|
return textures[ nonNullIndex ];
|
|
|
|
|
|
}
|
|
|
|
}
|
|
} |