using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class DrawingController : ActController { [Header("Prefabs")] public GameObject drawableFramePrefab; public GameObject paletteButtonPrefab; public GameObject radiusSliderPrefab; public GameObject actNamePrefab; public GameObject actDescriptionPrefab; public GameObject actTimerPrefab; [Header("Objects")] protected PencilTool pencil; protected DrawableFrame drawableFrame; protected List paletteButtons; protected RadiusSlider radiusSlider; protected Text actName; protected Text actDescription; protected Timer actTimer; [Serializable] public class DrawingSettings : ActSettings { public Color startingColor = Color.white; public List palette = new List(); public float timeLimit = 99f; public string actName = "Untitled"; public string actDescription = "This Act is missing a description."; public DrawingSettings(Color startingColor, List palette, float timeLimit, string actName, string actDescription) { this.type = "Drawing"; this.startingColor = startingColor; this.palette = palette; this.timeLimit = timeLimit; this.actName = actName; this.actDescription = actDescription; } } [Serializable] public class DrawingResults : ActResults { public readonly byte[] pngBytes; public DrawingResults(byte[] pngBytes) { this.pngBytes = pngBytes; } } protected override void Start() { base.Start(); } public override void ActInit() { base.ActInit(); //Load settings DrawingSettings drawingSettings = settings as DrawingSettings; //Create drawable frame drawableFrame = Instantiate(drawableFramePrefab, transform).GetComponent(); drawableFrame.startingColor = drawingSettings.startingColor; //Init PencilTool pencil = drawableFrame.GetComponent(); try { pencil.selectedColor = drawingSettings.palette[0]; } catch(ArgumentOutOfRangeException) { pencil.selectedColor = drawingSettings.startingColor; } //Init PaletteButtons paletteButtons = new List(); for(int i = 0; i < drawingSettings.palette.Count; i++) { PaletteButton button = Instantiate(paletteButtonPrefab, canvas.transform).GetComponent(); RectTransform btnTransform = button.GetComponent(); Image btnImage = button.GetComponent(); button.pencil = pencil; btnImage.color = drawingSettings.palette[i]; btnTransform.anchoredPosition = new Vector2(-420 + i * 110, 150); paletteButtons.Add(button); } //Init RadiusSlider radiusSlider = Instantiate(radiusSliderPrefab, canvas.transform).GetComponent(); radiusSlider.pencil = pencil; //Init actName Text actName = Instantiate(actNamePrefab, canvas.transform).GetComponent(); actName.text = drawingSettings.actName; //Init actDescription Text actDescription = Instantiate(actDescriptionPrefab, canvas.transform).GetComponent(); actDescription.text = drawingSettings.actDescription; //Init actTimer actTimer = Instantiate(actTimerPrefab, canvas.transform).GetComponent(); actTimer.TimerSet(drawingSettings.timeLimit); } public override void ActStart() { base.ActStart(); //Unlock frame drawableFrame.locked = false; //Start timer actTimer.OnTimeOut += new Action(ActEnd); actTimer.TimerStart(); } public override void ActEnd() { base.ActEnd(); //Lock frame drawableFrame.locked = true; //Generate results results = new DrawingResults(drawableFrame.ToPNG()); } public override void ActCleanup() { base.ActCleanup(); Destroy(drawableFrame.gameObject); foreach(PaletteButton button in paletteButtons) { Destroy(button.gameObject); } Destroy(radiusSlider.gameObject); Destroy(actName.gameObject); Destroy(actDescription.gameObject); Destroy(actTimer.gameObject); } }