|
|
|
using UnityEngine;
|
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using Fungus;
|
|
|
|
|
|
|
|
namespace Fungus
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Button click handler class for making sprites clickable.
|
|
|
|
* When the user taps on the sprite, an Action delegate method is called
|
|
|
|
*/
|
|
|
|
[RequireComponent (typeof (SpriteRenderer))]
|
|
|
|
public class Button : MonoBehaviour
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Delegate method to call when the player clicks the button.
|
|
|
|
*/
|
|
|
|
public Action buttonAction;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Automatically hide the button when displaying story text/options or waiting.
|
|
|
|
*/
|
|
|
|
public bool autoHide;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Hide the button when a value is set.
|
|
|
|
*/
|
|
|
|
public string hideOnFlag;
|
|
|
|
|
|
|
|
float targetAlpha;
|
|
|
|
bool showButton;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set visibility of a button object and set the delegate method to call when clicked.
|
|
|
|
* If the object does not already have a Collider2D component, then a BoxCollider2D is added.
|
|
|
|
* @param _visible Setting this to true makes the button visible, unless overridden by property settings
|
|
|
|
* @param _buttonAction An Action delegate method to call when the player clicks on the button
|
|
|
|
*/
|
|
|
|
public void Show(bool _visible, Action _buttonAction)
|
|
|
|
{
|
|
|
|
SpriteRenderer spriteRenderer = renderer as SpriteRenderer;
|
|
|
|
if (spriteRenderer == null)
|
|
|
|
{
|
|
|
|
Debug.LogError("Sprite renderer must not be null");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add a BoxCollider2d if none currently exists
|
|
|
|
if (collider2D == null)
|
|
|
|
{
|
|
|
|
gameObject.AddComponent<BoxCollider2D>();
|
|
|
|
}
|
|
|
|
|
|
|
|
showButton = _visible;
|
|
|
|
buttonAction = _buttonAction;
|
|
|
|
|
|
|
|
if (_visible)
|
|
|
|
{
|
|
|
|
targetAlpha = 1f;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
targetAlpha = 0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
UpdateTargetAlpha();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetAlpha(float alpha)
|
|
|
|
{
|
|
|
|
SpriteRenderer spriteRenderer = renderer as SpriteRenderer;
|
|
|
|
Color color = spriteRenderer.color;
|
|
|
|
color.a = alpha;
|
|
|
|
spriteRenderer.color = color;
|
|
|
|
}
|
|
|
|
|
|
|
|
void UpdateTargetAlpha()
|
|
|
|
{
|
|
|
|
// Automatically display button when game is in idle state (not displaying story text/options or waiting)
|
|
|
|
if (autoHide)
|
|
|
|
{
|
|
|
|
if (showButton &&
|
|
|
|
Game.GetInstance().IsGameIdle())
|
|
|
|
{
|
|
|
|
targetAlpha = 1f;
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
targetAlpha = 0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hide the button if the specified flag has been set to true
|
|
|
|
if (hideOnFlag.Length > 0 &&
|
|
|
|
Game.GetInstance().state.GetFlag(hideOnFlag))
|
|
|
|
{
|
|
|
|
targetAlpha = 0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Update()
|
|
|
|
{
|
|
|
|
UpdateTargetAlpha();
|
|
|
|
|
|
|
|
SpriteRenderer spriteRenderer = renderer as SpriteRenderer;
|
|
|
|
Color color = spriteRenderer.color;
|
|
|
|
float fadeSpeed = (1f / Game.GetInstance().buttonFadeDuration);
|
|
|
|
color.a = Mathf.MoveTowards(color.a, targetAlpha, Time.deltaTime * fadeSpeed);
|
|
|
|
spriteRenderer.color = color;
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnMouseUpAsButton()
|
|
|
|
{
|
|
|
|
SpriteRenderer spriteRenderer = renderer as SpriteRenderer;
|
|
|
|
|
|
|
|
// Ignore button press if sprite is not fully visible
|
|
|
|
if (spriteRenderer.color.a != 1f)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Sound effect
|
|
|
|
Game.GetInstance().PlayButtonClick();
|
|
|
|
|
|
|
|
CommandQueue commandQueue = Game.GetInstance().commandQueue;
|
|
|
|
commandQueue.CallCommandMethod(buttonAction);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|