nickmattinson / ZXYZ

Top-Down 2D Dungeon Crawler
1 stars 0 forks source link

Leaderboard #23

Closed nickmattinson closed 2 months ago

nickmattinson commented 2 months ago
git fetch origin
git checkout 23-leaderboard

image

MikeMMattinson commented 2 months ago

https://www.youtube.com/watch?v=-O7zeq7xMLw

MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using Dan.Main;
public class Leaderboard : MonoBehaviour
{
    [SerializeField] List<TextMeshProUGUI> names;
    [SerializeField] List<TextMeshProUGUI> scores;

    //[SerializeField] private Player player;

    private string publicLeaderboardKey = "e3ba01794dd0b95ea3dd5b187b2ec726b9ce525067840c327b0a780e8261344f";

    private void Start(){
        GetLeaderboard();
    }

    public void GetLeaderboard()
    {
        LeaderboardCreator.GetLeaderboard(publicLeaderboardKey, ((msg) =>
        {
            int loopLength = (msg.Length < names.Count) ? msg.Length : names.Count;
            for (int i = 0; i < loopLength; ++i)
            {
                names[i].text = msg[i].Username;
                scores[i].text = msg[i].Score.ToString();
            }
        }));
    }

    public void SetLeaderboardEntry(string username, int score)
    {

        LeaderboardCreator.UploadNewEntry(publicLeaderboardKey, username, score, ((msg) =>
        {
            // limit username length...

            // check for and remove bad words

            // update leader board
            GetLeaderboard();
        }));
    }

}
MikeMMattinson commented 2 months ago
using UnityEngine;
using TMPro;
using UnityEngine.Events;

public class ScoreManager : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI inputScore;
    [SerializeField] private TMP_InputField inputName;
    public UnityEvent<string, int> submitScoreEvent;

    public void SubmitScore(){

        submitScoreEvent.Invoke(inputName.text, int.Parse(inputScore.text));
    }

}
MikeMMattinson commented 2 months ago
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UIElements;

public class StateManager : MonoBehaviour
{
    public bool gameEnded;
    [SerializeField] GameObject mainMenuCanvas;
    [SerializeField] GameObject settingsCanvas;
    [SerializeField] GameObject gameOverCanvas;
    [SerializeField] GameObject gameCanvas;
    [SerializeField] GameObject leaderboardCanvas;
    [SerializeField] private Player player;

    public UnityEvent<string, int> submitScoreEvent;

    //[SerializeField] private TextMeshProUGUI scoreValue;

    [SerializeField] private TMP_InputField usernameInput;
    [SerializeField] private TextMeshProUGUI usernameIngame; // display
    //[SerializeField] private TextMeshProUGUI playerprefText;

    // Start is called before the first frame update
    void Start()
    {
        // Check if PlayerPrefs has a stored username
        player = FindObjectOfType<Player>();
        string storedUsername = PlayerPrefs.GetString("PlayerUserName");
        if (!string.IsNullOrEmpty(storedUsername))
        {
            // Set usernameInput and usernameIngame
            usernameInput.text = storedUsername;
            usernameIngame.text = storedUsername;
        }

        // setup the canvas
        gameEnded = false;
        Time.timeScale = 0f;
        mainMenuCanvas.SetActive(true);
        settingsCanvas.SetActive(false);
        gameOverCanvas.SetActive(false);
        gameCanvas.SetActive(false);
        leaderboardCanvas.SetActive(false);
    }

    public void loadGame()
    {

        //Check if input is provided in usernameInput
        if (!string.IsNullOrEmpty(usernameInput.text))
        {
            // Set player.username using usernameInput
            player.username = usernameInput.text;
            PlayerPrefs.SetString("PlayerUserName", player.username);
        }
        else
        {
            // Set a default username
            player.username = "Player";
            PlayerPrefs.SetString("PlayerUserName", player.username);
        }

        // Update usernameIngame
        usernameIngame.text = player.username;

        // Debug logs to check values
        Debug.Log("Player Username to save: " + player.username);
        Debug.Log("Player Username saved in PlayerPrefs: " + PlayerPrefs.GetString("PlayerUserName"));

        // Rest of your code...
        Time.timeScale = 1f;
        gameCanvas.SetActive(true);
        mainMenuCanvas.SetActive(false);
        settingsCanvas.SetActive(false);
        gameOverCanvas.SetActive(false);
        leaderboardCanvas.SetActive(false);

    }

    public void loadGameOver()
    {
        gameEnded = true;
        Time.timeScale = 0f;
        gameOverCanvas.SetActive(true);
        mainMenuCanvas.SetActive(false);
        settingsCanvas.SetActive(false);
        gameCanvas.SetActive(false);
        leaderboardCanvas.SetActive(false);

    }

    public void loadSettings()
    {
        Time.timeScale = 0f;
        settingsCanvas.SetActive(true);
        gameOverCanvas.SetActive(false);
        mainMenuCanvas.SetActive(false);
        gameCanvas.SetActive(false);
        leaderboardCanvas.SetActive(false);

    }

public void loadLeaderboard()
{
    //Check if input is provided in usernameInput
    if (!string.IsNullOrEmpty(usernameInput.text))
    {
        // Set player.username using usernameInput
        player.username = usernameInput.text;
        PlayerPrefs.SetString("PlayerUserName", player.username);
    }
    else
    {
        // Set a default username
        player.username = "Player";
        PlayerPrefs.SetString("PlayerUserName", player.username);
    }

    if (!string.IsNullOrEmpty(player.username))
    {
        // Update high score
        submitScoreEvent.Invoke(player.username, player.score);
        Debug.Log($"Loading leaderboard - Player: {player.username}, Score: {player.score}");

        leaderboardCanvas.SetActive(true);
        settingsCanvas.SetActive(false);
        gameOverCanvas.SetActive(false);
        mainMenuCanvas.SetActive(false);
        gameCanvas.SetActive(false);
    }
    else
    {
        Debug.LogError("Player username is null or empty when loading leaderboard!");
    }
}

    public void quitGame()
    {
        Application.Quit();
    }
}
MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago

image

MikeMMattinson commented 2 months ago

This is working but for some reason didn't get a pull request.