173 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class GetNumberState : IState
{
IState prevState;
const string NUMBER_KEY = "Number";
//Иерархия для панели: Панель -> 10 Image -> У каждого tmpro
GameObject entryPanel;
Color normalColor = Color.gray;
Color highlightedColor = new Color(0.7f, 0.7f, 0.7f, 1);
string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",};
int currentDigitIndex;
Image[] slots;
private int currentSlotIndex = 0;
private int length = 11;
public GetNumberState(IState prevState)
{
this.prevState = prevState;
}
public void enter()
{
//включить панель, получить доступ ко всем слотам
entryPanel = GameManager.instance.NumberPanel;
Debug.Log(entryPanel);
entryPanel.SetActive(true);
collectSlots();
//подгрузить данные если были
string currentNumber = getCurrentNumberOrNull();
if (currentNumber != null) fillNumber(currentNumber);
currentDigitIndex = getDigitIndex(text(currentSlotIndex).text);
if (currentDigitIndex == -1) currentDigitIndex = 0;
switchSlot(1); switchSlot(-1);//чтобы отобразилась подсветка
colorSlots();
}
public void update()
{
//Меняем слот
if (In.GetButtonDown(ButtonPinMapping.left1))
{
switchSlot(-1);
}
if (In.GetButtonDown(ButtonPinMapping.right1))
{
switchSlot(1);
}
//меняем букву в слоте
if (In.GetButtonDown(ButtonPinMapping.left2))
{
switchDigit(-1);
}
if (In.GetButtonDown(ButtonPinMapping.right2))
{
switchDigit(1);
}
//записываем и выходим
if (In.GetButtonDown(ButtonPinMapping.down2))
{
//GameManager.instance.stateMachine.ChangeState(new SettingsState());
GameManager.instance.stateMachine.ChangeState(prevState);
}
}
public void exit()
{
//сохранить данные закрыть панельку
string res = collectResult();
PlayerPrefs.SetString(NUMBER_KEY, res);
entryPanel.SetActive(false);
}
private void collectSlots()
{
slots = new Image[length];
for (int i = 0; i < length; i++)
{
slots[i] = entryPanel.transform.GetChild(i).GetComponent<Image>();
}
}
private TextMeshProUGUI text(int index)
{
return slots[index].transform.GetChild(0).GetComponent<TextMeshProUGUI>();
}
private string getCurrentNumberOrNull()
{
if (PlayerPrefs.HasKey(NUMBER_KEY))
{
return PlayerPrefs.GetString(NUMBER_KEY);
}
else
{
return null;
}
}
private void fillNumber(string number)
{
for (int i = 0; i < length; i++)
{
text(i).text = number[i].ToString();
}
}
private void switchSlot(int direction)
{
//старый слот не подсвечиваем
slots[currentSlotIndex].color = normalColor;
//циклично перемещаем индекс
direction = (int)Mathf.Sign(direction);
currentSlotIndex = (currentSlotIndex + direction + length) % length;
//новый слот подсвечиваем
slots[currentSlotIndex].color = highlightedColor;
currentDigitIndex = getDigitIndex(text(currentSlotIndex).text);
//??все?
}
private void switchDigit(int direction)
{
direction = (int)Mathf.Sign(direction);
currentDigitIndex = (currentDigitIndex + digits.Length + direction) % digits.Length;
text(currentSlotIndex).text = digits[currentDigitIndex];
}
private int getDigitIndex(string symbol) => Array.IndexOf(digits, symbol);
private string collectResult()
{
StringBuilder sb = new();
for (int i = 0; i < length; i++)
{
sb.Append(text(i).text);
}
return sb.ToString();
}
void colorSlots()
{
for (int i = 0; i < length; i++)
{
slots[i].color = normalColor;
}
slots[0].color = highlightedColor;
}
}