Meilleurs Temps Voiture

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Meilleurs Temps Voiture

Message par mike_muse » 09 Avr 2015 18:33

Bonjour à tous,

voilà je viens à vous car j'ai un petit souci. Je cherche à enregistrer les 5 meilleurs temps de mon jeu de voiture.
J'ai donc fais le code suivant:

Code : Tout sélectionner

var time1: float = 0;
var time2: float = 0;
var time3: float = 0;
var time4: float = 0;
var time5: float = 0;

var minutes1: int;
var seconds1: int;
var centieme1: int;

var minutes2: int;
var seconds2: int;
var centieme2: int;

var minutes3: int;
var seconds3: int;
var centieme3: int;

var minutes4: int;
var seconds4: int;
var centieme4: int;

var minutes5: int;
var seconds5: int;
var centieme5: int;

var time1Text: TextMesh;
var time2Text: TextMesh;
var time3Text: TextMesh;
var time4Text: TextMesh;
var time5Text: TextMesh;

time1Text = GetComponentInChildren(TextMesh);
time2Text = GetComponentInChildren(TextMesh);
time3Text = GetComponentInChildren(TextMesh);
time4Text = GetComponentInChildren(TextMesh);
time5Text = GetComponentInChildren(TextMesh);

static var newTime: float;

function Awake()
{
	time1 = PlayerPrefs.GetFloat("time1", time1);
	time2 = PlayerPrefs.GetFloat("time2", time2);
	time3 = PlayerPrefs.GetFloat("time3", time3);
	time4 = PlayerPrefs.GetFloat("time4", time4);
	time5 = PlayerPrefs.GetFloat("time5", time5);
	//DontDestroyOnLoad(this);
	AfficheTime();
}

function Update()
{
	if(newTime > time1)
	{
		PlayerPrefs.SetFloat("time5", time4);
		time5 = time4;
		PlayerPrefs.SetFloat("time4", time3);
		time4 = time3;
		PlayerPrefs.SetFloat("time3", time2);
		time3 = time2;
		PlayerPrefs.SetFloat("time2", time1);
		time2 = time1;
		PlayerPrefs.SetFloat("time1", newTime);
		time1 = newTime;
	}
	else if(newTime > time2)
	{
		PlayerPrefs.SetFloat("time5", time4);
		time5 = time4;
		PlayerPrefs.SetFloat("time4", time3);
		time4 = time3;
		PlayerPrefs.SetFloat("time3", time2);
		time3 = time2;
		PlayerPrefs.SetFloat("time2", newTime);
		time2 = newTime;
	}
	else if(newTime > time3)
	{
		PlayerPrefs.SetFloat("time5", time4);
		time5 = time4;
		PlayerPrefs.SetFloat("time4", time3);
		time4 = time3;
		PlayerPrefs.SetFloat("time3", newTime);
		time3 = newTime;
	}
	else if(newTime > time4)
	{
		PlayerPrefs.SetFloat("time5", time4);
		time5 = time4;
		PlayerPrefs.SetFloat("time4", newTime);
		time4 = newTime;
	}
	else if(newTime > time5)
	{
		PlayerPrefs.SetFloat("time5", newTime);
		time5 = newTime;
	}
}

function AfficheTime()
{
	// time 1
	
	minutes1 = time1 / 60;
    seconds1 = time1 % 60;
    centieme1 = (time1 * 100) % 100;
    time1Text.text = "1. " + String.Format("{0:00}:{1:00}:{2:00}", minutes1, seconds1, centieme1);
    
    // time 2
    
    minutes2 = time2 / 60;
    seconds2 = time2 % 60;
    centieme2 = (time2 * 100) % 100;
    time2Text.text = "2. " + String.Format("{0:00}:{1:00}:{2:00}", minutes2, seconds2, centieme2);
    
    // time 3
    
    minutes3 = time3 / 60;
    seconds3 = time3 % 60;
    centieme3 = (time3 * 100) % 100;
    time3Text.text = "3. " + String.Format("{0:00}:{1:00}:{2:00}", minutes3, seconds3, centieme3);
    
    // time 4
    
    minutes4 = time4 / 60;
    seconds4 = time4 % 60;
    centieme4 = (time4 * 100) % 100;
    time4Text.text = "4. " + String.Format("{0:00}:{1:00}:{2:00}", minutes4, seconds4, centieme4);
    
    // time 5 
        
    minutes5 = time5 / 60;
    seconds5 = time5 % 60;
    centieme5 = (time5 * 100) % 100;
    time5Text.text = "5. " + String.Format("{0:00}:{1:00}:{2:00}", minutes5, seconds5, centieme5);        
}

Seulement voilà, il m'enregistre un seul temps et unity ne m'a enregistrer que le premier temps que j'ai fais. Les autres temps ne sont pas enregistrer et je ne comprend pas vraiment pourquoi.

Merci à tous.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Meilleurs Temps Voiture

Message par giyomuSan » 10 Avr 2015 00:27

Oula..

Tableau , tableau ! ou list lol.

pour t'aiguiller:

- tu n'as besoin que d enregistrer le temps en secondes ( genre 156,xxx )
- a chaque tour tu enregistre et stock le temps du laps dans une List ou un tableau ( si tu sais exactement le nombre de temps que tu va enregsitrer.
- des que tu as un nouveau temps qui s enregistre , tu n 'as qu'a faire un tri de ta liste de tes valeures secondes ( du plus court au plus long ), y a des fct deja en C#.Net pour ca genre List.Sort()
- Une fois le sorting / tri de fait t as juste a aller chopper les 5 premieres valeures ds ta liste.
- Pour afficher et formatter le temps tu peu avoir une fonction qui s occupe de ca tout simplement via les valeures en secondes

Code : Tout sélectionner

String FormatTime(float timeInSeconds)
{
    // ton code ici
}

La serieux ta liste de variable comme ca ca pique les yeux :D

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Meilleurs Temps Voiture

Message par mike_muse » 10 Avr 2015 00:31

Ok mais moi c'est pas le temps du tour. C'est le temps sur 3 tours. Desolé je ne l'ai pas préciser. Et les meilleurs temps sont affichés dans une scène dans le menu.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Meilleurs Temps Voiture

Message par giyomuSan » 10 Avr 2015 01:48

bah peu importe, ds ce cas il suffit juste que tu additionne les 3 tours pour chacun des concurrents, la manip reste la meme.

apres la ou tu affiches tes temps , pas trop le problem non plus , a toi de faire en sorte de les stocker de maniere a y a voir acces la ou tu en as besoin.

tiens au cas ou pour te donner une idee ( c par tour, mais le principe reste le meme sur XX tours )

Code : Tout sélectionner

using UnityEngine;
using System.Collections.Generic;
using System.Linq;

public class BestLapsTime : MonoBehaviour
{

	#region fields
	[SerializeField]
	private List<float> lapsTime;
	[SerializeField]
	private List<string> formattedLapsTime;
	#endregion fields

	// Use this for initialization
	void Start ()
	{
		// create random time for test purpose
		for(int i = 0; i < 20; i++)
		{
			var t = Random.Range(20f, 120f);
			lapsTime.Add(t);
		}

		lapsTime = SortByValue(lapsTime);
		formattedLapsTime = FormatTime(lapsTime, 5);
	}

	private List<float> SortByValue(List<float> values)
	{
		var sorted = from f in values orderby f ascending select f;
		return sorted.ToList();
	}

	private List<string> FormatTime(List<float> values, int number)
	{
		var tempArray = new string[number];

		for(int i = 0; i < number; i++)
		{
			var v = values[i];

			var minutes = Mathf.Floor(v/60);
			var seconds = Mathf.RoundToInt(v%60);
			var milliseconds = (v * 100) % 100;


			var str = string.Format("{0:00}:{1:00}:{2:000}", minutes, seconds, milliseconds);
			tempArray[i] = str;
		}

		return tempArray.ToList();
	}
}
Pièces jointes
Screen Shot 2015-04-10 at 8.47.24 AM.png
Screen Shot 2015-04-10 at 8.47.24 AM.png (44.36 Kio) Consulté 5546 fois

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Meilleurs Temps Voiture

Message par mike_muse » 10 Avr 2015 14:14

Ok mais dans le cas que tu dis, je n'ai qu'a mettre des variables static et y avoir acces ailleurs... mais les temps seront-ils sauvegarder meme en quittant le jeu et en y retournant ?
En plus je code en js moi ^^

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Meilleurs Temps Voiture

Message par giyomuSan » 10 Avr 2015 16:02

Si tu veux sauvegarder les temps de facon persitante, tu peu toujours utiliser le playerPrefs.

Si tu utilise ces temps ds une autre scene, il te suffit de sauvegarder les temps ds le player pref qd tu quitte ta scene de jeu, et de les reloader dans ta scene de menu par example.

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Meilleurs Temps Voiture

Message par mike_muse » 10 Avr 2015 16:03

Oui c'est ce que j'ai fais avec mon premier code. Mais avec un tableau franchement je suis un peu perdu.

mike_muse
Messages : 46
Inscription : 29 Mars 2015 17:07

Re: Meilleurs Temps Voiture

Message par mike_muse » 10 Avr 2015 16:11

giyomuSan a écrit :bah peu importe, ds ce cas il suffit juste que tu additionne les 3 tours pour chacun des concurrents, la manip reste la meme.

apres la ou tu affiches tes temps , pas trop le problem non plus , a toi de faire en sorte de les stocker de maniere a y a voir acces la ou tu en as besoin.

tiens au cas ou pour te donner une idee ( c par tour, mais le principe reste le meme sur XX tours )

Code : Tout sélectionner

using UnityEngine;
using System.Collections.Generic;
using System.Linq;

public class BestLapsTime : MonoBehaviour
{

	#region fields
	[SerializeField]
	private List<float> lapsTime;
	[SerializeField]
	private List<string> formattedLapsTime;
	#endregion fields

	// Use this for initialization
	void Start ()
	{
		// create random time for test purpose
		for(int i = 0; i < 20; i++)
		{
			var t = Random.Range(20f, 120f);
			lapsTime.Add(t);
		}

		lapsTime = SortByValue(lapsTime);
		formattedLapsTime = FormatTime(lapsTime, 5);
	}

	private List<float> SortByValue(List<float> values)
	{
		var sorted = from f in values orderby f ascending select f;
		return sorted.ToList();
	}

	private List<string> FormatTime(List<float> values, int number)
	{
		var tempArray = new string[number];

		for(int i = 0; i < number; i++)
		{
			var v = values[i];

			var minutes = Mathf.Floor(v/60);
			var seconds = Mathf.RoundToInt(v%60);
			var milliseconds = (v * 100) % 100;


			var str = string.Format("{0:00}:{1:00}:{2:000}", minutes, seconds, milliseconds);
			tempArray[i] = str;
		}

		return tempArray.ToList();
	}
}
Et un souci dans ton code, c'est que ton tableau est limité à 20... mais si je considère un jeu tel que je le souhaite, je suis censé pouvoir jouer à l'infini et que le temps à la unième course peut etre meilleur que l'un des meilleurs temps. Or il n'y a aucun élément comparateur dans ton code. Certes ton code est bien fait pour un nombre limité de courses mais dans mon cas il manque quelques chose et ce quelque chose est plutôt important ^^

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Meilleurs Temps Voiture

Message par giyomuSan » 10 Avr 2015 16:12

Le ta leau change pas vraiment la manip,

Tu as juste a looper sur tes 5 valeures de temps, et de les sauvegarder avec l index de ton choix et ta valeur.
Tu peu par example utiliser la valeur de l index du tableau pour le key du playerPref > i.ToString()

pour le relire via une loop , tu fais l inverse et tu parse la valeur du string key en int

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Meilleurs Temps Voiture

Message par giyomuSan » 10 Avr 2015 16:17

mike_muse a écrit :
giyomuSan a écrit :bah peu importe, ds ce cas il suffit juste que tu additionne les 3 tours pour chacun des concurrents, la manip reste la meme.

apres la ou tu affiches tes temps , pas trop le problem non plus , a toi de faire en sorte de les stocker de maniere a y a voir acces la ou tu en as besoin.

tiens au cas ou pour te donner une idee ( c par tour, mais le principe reste le meme sur XX tours )

Code : Tout sélectionner

using UnityEngine;
using System.Collections.Generic;
using System.Linq;

public class BestLapsTime : MonoBehaviour
{

	#region fields
	[SerializeField]
	private List<float> lapsTime;
	[SerializeField]
	private List<string> formattedLapsTime;
	#endregion fields

	// Use this for initialization
	void Start ()
	{
		// create random time for test purpose
		for(int i = 0; i < 20; i++)
		{
			var t = Random.Range(20f, 120f);
			lapsTime.Add(t);
		}

		lapsTime = SortByValue(lapsTime);
		formattedLapsTime = FormatTime(lapsTime, 5);
	}

	private List<float> SortByValue(List<float> values)
	{
		var sorted = from f in values orderby f ascending select f;
		return sorted.ToList();
	}

	private List<string> FormatTime(List<float> values, int number)
	{
		var tempArray = new string[number];

		for(int i = 0; i < number; i++)
		{
			var v = values[i];

			var minutes = Mathf.Floor(v/60);
			var seconds = Mathf.RoundToInt(v%60);
			var milliseconds = (v * 100) % 100;


			var str = string.Format("{0:00}:{1:00}:{2:000}", minutes, seconds, milliseconds);
			tempArray[i] = str;
		}

		return tempArray.ToList();
	}
}
Et un souci dans ton code, c'est que ton tableau est limité à 20... mais si je considère un jeu tel que je le souhaite, je suis censé pouvoir jouer à l'infini et que le temps à la unième course peut etre meilleur que l'un des meilleurs temps. Or il n'y a aucun élément comparateur dans ton code. Certes ton code est bien fait pour un nombre limité de courses mais dans mon cas il manque quelques chose et ce quelque chose est plutôt important ^^
C'est une liste, j ai mis 20 pour l exemple, j aurais pu mettre 10 000 , ca change rien ..sauf que le sorting va etre plus long a effectuer.

Répondre

Revenir vers « (C#) CSharp »