1
0
KF2-Dev-Scripts/GameFramework/Classes/MobileInputZone.uc
2020-12-13 18:01:13 +03:00

428 lines
15 KiB
Ucode

/**
* MobileInputZone
* Controls how mobile input is handled
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class MobileInputZone extends object
PerObjectConfig
editinlinenew
Config(Game)
native;
/** Describes the type of zone */
enum EZoneType
{
ZoneType_Button,
ZoneType_Joystick,
ZoneType_Trackball,
ZoneType_Slider,
ZoneType_SubClassed,
};
/**
* Describes the state of the zone.
*/
enum EZoneState
{
ZoneState_Inactive,
ZoneState_Activating,
ZoneState_Active,
ZoneState_Deactivating,
};
/**
* Defines which way the zone slides
*/
enum EZoneSlideType
{
ZoneSlide_UpDown,
ZoneSlide_LeftRight,
};
/**
* Structure to allow easy storage of UVs for a rendered image
*/
struct native TextureUVs
{
var() float U, V, UL, VL;
// defaults to see something
structdefaultproperties
{
UL=64.0f
VL=64.0f
}
};
/** What type of zone is this. */
var (Zone) config EZoneType Type;
/** Which touchpad this zone will respond to */
var (Zone) byte TouchpadIndex;
/** State of the zone */
var EZoneState State;
/** For button zones, the Caption property will be displayed in the center of the button */
var (Zone) config string Caption;
/** Input to send to input subsystem on event (vertical input for analog, can be NAME_None) */
var (Input) config name InputKey;
/** Input to send for horizontal analog input (can be NAME_None) */
var (Input) config name HorizontalInputKey;
/** Input to send for tap input (e.g. for tap-to-fire) */
var (Input) config name TapInputKey;
/** Input to send from a double tap */
var (Input) config name DoubleTapInputKey;
/** Multiplier to scale the analog vertical input by */
var (Input) config float VertMultiplier;
/** Multiplier to scale the analog horizontal input by */
var (Input) config float HorizMultiplier;
/** How much acceleration to apply to Trackball or Joystick movement (0.0 for none, no upper bounds) */
var (Input) config float Acceleration;
/** How much input smoothing to apply to Trackball or Joystick movement (0.0 for none, 1.0 for max) */
var (Input) config float Smoothing;
/** How much escape velocity to use for Trackball movement (0.0 for none, 1.0 for max) */
var (Input) config float EscapeVelocityStrength;
/** If true, this control will use it's "strength" to scale the movement of the pawn */
var (Input) config bool bScalePawnMovement;
/** Top left corner */
var (Bounds) config float X, Y;
/** Size of the zone */
var (Bounds) config float SizeX, SizeY;
/** Size of active Zone. Note if it's set to 0, then SizeX/SizeY will be copied here.
This setting is used when you have a zone that has bCenterOnEvent set and defines the size of
zone when it's active */
var (Bounds) config float ActiveSizeX, ActiveSizeY;
/** Used to resize the zone, don't touch */
var const float InitialX, InitialY;
var const float InitialSizeX, InitialSizeY;
var const float InitialActiveSizeX, InitialActiveSizeY;
/** If any of the bReleative vars are true, then the corresponding X/Y/SizeX/SizeY will be consider a percentage of the viewport */
var (Bounds) config bool bRelativeX;
var (Bounds) config bool bRelativeY;
var (Bounds) config bool bRelativeSizeX;
var (Bounds) config bool bRelativeSizeY;
/** If this is true, then ActiveSizeY is relative to ActiveSizeX */
var (Bounds) config bool bActiveSizeYFromX;
/** If this is true, then SizeX is relative to SizeY */
var (Bounds) config bool bSizeYFromSizeX;
/** This is the scale factor you are authoring for. 2.0 is useful for Retina display resolution (960x640), 1.0 for iPads and older iPhones */
var (Bounds) config float AuthoredGlobalScale;
/** If true, then the Global Scale values will be applied to the active Sizes */
var (Bounds) config bool bApplyGlobalScaleToActiveSizes;
/** if true, then this zone will be centered around the original X value. NOTE: X will be updated to reflect it's actual position */
var (bounds) config bool bCenterX;
/** if true, then this zone will be centered around the original Y value. NOTE: Y will be updated to reflect it's actual position */
var (bounds) config bool bCenterY;
/** Border is an invisible region around the zone. The border is included in hit determination. */
var (Bounds) config float Border;
/** Do we draw anything on screen for this zone? */
var (Options) config bool bIsInvisible;
/** If true, then this double tap will be considered a quick press/release, other wise it's tap and hold */
var (Options) config bool bQuickDoubleTap;
/** If true, this zone will have it's "center" set when you touch it, otherwise the center will be set to the center of the zone */
var (Options) config bool bCenterOnEvent;
/** Slider type has a track that can be clicked on and button will center on click */
var (Options) config bool bSliderHasTrack;
/** If bCenterOnEvent is enabled and this is non zero, the center position will be reset to it's initial center after this period of inactivity */
var (Options) config float ResetCenterAfterInactivityTime;
/** If true, the tilt zone will float within the SizeX/SizeY */
var (Options) config bool bFloatingTiltZone;
/** Determines what type of slide it is */
var (Options) config EZoneSlideType SlideType;
var (Options) config float TapDistanceConstraint;
/** If true, the zone will gracefully transition from Inactive to Active and vice-versus. NOTE: transitions are strickly visual. A
zone becomes active or inactive the moment a touch is applied or removed */
var (Transitions) config bool bUseGentleTransitions;
/** How fast should a zone for from active to inactive */
var (Transitions) config float ActivateTime;
/** How fast a zone should go from inactive to active */
var (Transitions) config float DeactivateTime;
/** Unless enabled, the first movement delta for a trackball zone will be ignored. This is useful for devices with inconsistent 'dead zones' for initial touch deltas, however this will reduce responsiveness of trackball drags slightly. */
var (Advanced) config bool bAllowFirstDeltaForTrackballZone;
/** Zone Rendering Parameters */
/** If true, the zone will render little guide lines for debugging */
var (Rendering) config bool bRenderGuides;
/** Holds the color to use when drawing images */
var (Rendering) config color RenderColor;
/** Holds the alpha value to use if the zone is inactive */
var (Rendering) config float InactiveAlpha;
/** This is a fixed adjustment that will be added to the zone's caption's X. It's used to align fonts correctly */
var (Rendering) config float CaptionXAdjustment;
/** This is a fixed adjustment that will be added to the zone's caption's Y. It's used to align fonts correctly */
var (Rendering) config float CaptionYAdjustment;
/** Override texture (for buttons, this is the texture when not clicked; for joystick/trackball, it's the background; for sliders, it's the slider) */
var (Rendering) Texture2D OverrideTexture1;
/** Ini-controlled string that will be looked up at runtime and hooked up to OverrideTexture1 */
var config string OverrideTexture1Name;
/** UVs for override texture 1 (in texel units) */
var (Rendering) config TextureUVs OverrideUVs1;
/** Override texture (for buttons, this is the texture when clicked; for joystick/trackball, it's the 'hat'; for sliders, it's unused) */
var (Rendering) Texture2D OverrideTexture2;
/** Ini-controlled string that will be looked up at runtime and hooked up to OverrideTexture2 */
var config string OverrideTexture2Name;
/** UVs for override texture 2 (in texel units) */
var (Rendering) config TextureUVs OverrideUVs2;
/** Holds the Initialize location where the zone was touched */
var Vector2D InitialLocation;
/** For Joystick and Trackball, this is where in the zone the user is currently holding down */
var Vector2D CurrentLocation;
/** For Joystick, this is the center of the analog zone to calculate the analog values from */
var Vector2D CurrentCenter;
/** For Joystick, the initial center position (used only when resetting the joystick back to it's center) */
var Vector2D InitialCenter;
/** For Joystick and Trackball, array of previous locations so that we can smooth input over frames */
var Vector2D PreviousLocations[6];
/** For Joystick and Trackball, array of previous movement time deltas so that we can smooth input over frames */
var float PreviousMoveDeltaTimes[6];
/** For Joystick and Trackball, how many previous locations we're currently storing */
var int PreviousLocationCount;
/** Used to calculate a double tap on this zone */
var float LastTouchTime;
/** How long since we last repeated a tap */
var float TimeSinceLastTapRepeat;
/** Fade opacity, used for certain transient effects */
var float AnimatingFadeOpacity;
/** A Reference back to the Player Input that controls this array Input zone */
var MobilePlayerInput InputOwner;
/** Holds the current transition time */
var float TransitionTime;
/** This will be true if this tap was a double tap. It's required in order to make sure we release the DoubleTapInputKey if it was a tap and hold */
var bool bIsDoubleTapAndHold;
/** For Trackball, how much escape velocity is left to apply */
var Vector2D EscapeVelocity;
/** holds an list of MobileZone Sequence events associated with this zone */
var array<SeqEvent_MobileZoneBase> MobileSeqEventHandlers;
/** Holds cached versions of the last axis values */
var Vector2D LastAxisValues;
/** Used to track the amount of time a zone is active */
var float TotalActiveTime;
/** Holds the time this zone last went active */
var float LastWentActiveTime;
cpptext
{
/**
* Processes a touch event
*
* @param DeltaTime Much time has elapsed since the last processing
* @param Handle The unique ID of this touch
* @param EventType The type of event that occurred
* @param TouchLocation Where on the device has the touch occurred.
* @param TouchDuration How long since the touch started
* @param MoveDeltaTime Time delta between the movement events the last time this touch moved
*/
void virtual ProcessTouch(FLOAT DeltaTime, UINT Handle, ETouchType EventType, FVector2D TouchLocation, FLOAT TouchTotalMoveDistance, FLOAT TouchDuration, FLOAT MoveDeltaTime);
/**
* All zones that are in the active group get 'Ticked' at the end of MobilePlayerInput::Tick
*
* @param DeltaTime Much time has elapsed since the last processing
*/
void virtual TickZone(FLOAT DeltaTime);
/**
* Applies any remaining escape velocity for this zone
*
* @param DeltaTime Much time has elapsed since the last processing
*/
void ApplyEscapeVelocity( FLOAT DeltaTime );
/**
* This function will iterate over the MobileSeqEventHandles array and cause them to be updated. It get's called once per frame that the zone is active
*/
void UpdateListeners();
protected:
/**
* Computes average location and movement time for the zone's active touch
*
* @param InTimeToAverageOver How long a duration to average over (max)
* @param OutSmoothedLocation (Out) Average location
* @param OutSmoothedMoveDeltaTime (Out) Average movement delta time
*/
void ComputeSmoothedMovement( const FLOAT InTimeToAverageOver, FVector2D& OutSmoothedLocation, FLOAT& OutSmoothedMoveDeltaTime ) const;
}
/**
* Called to activate a zone.
*/
native function ActivateZone();
/**
* Called to deactivate a zone
*/
native function DeactivateZone();
/**
* A delegate that allows script to override the process. We use delegates here
*
* @param Zone The Mobile Input zone that triggered the delegate
* @param Handle The unique ID of this touch
* @param EventType The type of event that occurred
* @param Location Where on the device has the touch occurred.
* @returns true if we need to swallow the touch
*/
delegate bool OnProcessInputDelegate(MobileInputZone Zone, float DeltaTime, int Handle, ETouchType EventType, Vector2D TouchLocation);
/**
* A delegate that allows script to manage Tap events.
*
* @param Zone The mobile Input zone that triggered the delegate
* @param Location Where on the device has the touch occurred.
* @param EventType The type of event that occurred
* @returns true if we need to swallow the tap
*/
delegate bool OnTapDelegate(MobileInputZone Zone, ETouchType EventType, Vector2D TouchLocation);
/**
* A delegate that allows script to manage Double Tap events.
*
* @param Zone The mobile Input zone that triggered the delegate
* @param Location Where on the device has the touch occurred.
* @param EventType The type of event that occurred
* @returns true if we need to swallow the double tap
*/
delegate bool OnDoubleTapDelegate(MobileInputZone Zone, ETouchType EventType, Vector2D TouchLocation);
/**
* This is a delegate that allows script to get values of a slide zone.
*
* @param Zone The mobile Input zone that triggered the delegate
* @param EventType The type of event that occurred
* @param SlideVlaue Holds the offset value of the slides in a +/- range in pixels. So 0 = Resting at normal.
* @param ViewportSize Holds the size of the current viewport.
*/
delegate bool OnProcessSlide(MobileInputZone Zone, ETouchType EventType, int SlideValue, Vector2D ViewportSize);
/**
* Allows other actors to override the drawing of this zone. Note this is called before the default drawing code
* and if it returns true, will abort the drawing sequence
*
* @param Zone The mobile Input zone that triggered the delegate
* @param Canvas The canvas to draw on
* @returns true to stop the rendering
*/
delegate bool OnPreDrawZone(MobileInputZone Zone, Canvas Canvas);
/**
* Allows other actors to supplement the drawing of this zone. Note this is called after the default drawing code
*
* @param Zone The mobile Input zone that triggered the delegate
* @param Canvas The canvas to draw on
*/
delegate OnPostDrawZone(MobileInputZone Zone, Canvas Canvas);
/**
* Adds a new MobileInput Sequence Event to the handler list
*
* @param NewHandler The handler to add
*/
function AddKismetEventHandler(SeqEvent_MobileZoneBase NewHandler)
{
local int i;
//`log("ZONE: Adding Kismet handler " @ NewHandler.Name @ "for zone" @ name);
// More sure this event handler isn't already in the array
for (i=0;i<MobileSeqEventHandlers.Length;i++)
{
if (MobileSeqEventHandlers[i] == NewHandler)
{
return; // Already Registered
}
}
// Look though the array and see if there is an empty sport. These empty sports
// can occur when a kismet sequence is streamed out.
for (i=0;i<MobileSeqEventHandlers.Length;i++)
{
if (MobileSeqEventHandlers[i] == none)
{
MobileSeqEventHandlers[i] = NewHandler;
return;
}
}
MobileSeqEventHandlers.AddItem(NewHandler);
}
defaultproperties
{
}