[RESOLU][DB-AL] Ajouter un evenement via le score

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
Jonathanbtq
Messages : 6
Inscription : 05 Oct 2020 15:47

[RESOLU][DB-AL] Ajouter un evenement via le score

Message par Jonathanbtq » 03 Déc 2020 15:15

Bonjour,

Je viens vous demandez de l'aide car je suis bloqué :|
Je fais un jeu vidéo 2D mobile (C#) et je suis a la recherche de la façon d'ajouté un événement
(ex: activation d'une porte a partir de score >= 15 && score <=20)

le problème c'est que je n'arrive pas a créer de boucles, tout les temps de scores la porte s'active...

Je vous montre le code en entier pour mieux comprendre haha :)
si quelqu'un a une solution sil vous plait, ça serait super :-D
Merci

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScoreScript : MonoBehaviour
{
    public static ScoreScript instance;

    public static int score, highScore;
    public Text scoreText, highScoreText, gameOverScoreText;

    public GameObject Porte;
    public GameObject FireBlast;
    public GameObject Shark;
    public GameObject Bag;

    public GameObject MonsterSpawn4;
    public GameObject SkullAlert;


    private void Awake()
    {
        instance = this;

        if (PlayerPrefs.HasKey("HighScore"))
        { 
            highScore = PlayerPrefs.GetInt("HighScore");
            highScoreText.text = highScore.ToString();
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        Porte.SetActive(false);
        FireBlast.SetActive(false);
        MonsterSpawn4.SetActive(false);
        SkullAlert.SetActive(false);
    }

    public void AddScore()
    {
        score++;

        UpdateHighScore();

        scoreText.text = score.ToString();
        gameOverScoreText.text = score.ToString();
    }


    public void UpdateHighScore()
    {
        if (score > highScore)
        {
            highScore = score;

            highScoreText.text = highScore.ToString();

            PlayerPrefs.SetInt("HighScore", highScore);
        }
    }

    public void ResetScore()
    {
        score = 0;
        scoreText.text = score.ToString();
        gameOverScoreText.text = score.ToString();

    }
    
    public void ClearHighScore()
    {
        PlayerPrefs.DeleteKey("HighScore");

        highScore = 0;
        highScoreText.text = highScore.ToString();
    }

    void Update()
    {
        if (score >= 15f && score <= 40f || score >= 60f && score <= 80f || score >= 100f && score <= 110f || score >= 200f && score <= 210f || score >= 500f && score <= 520f)
        {
            Porte.SetActive(true);
        }

        if (score >= 15f && score <= 30f || score >= 40f && score <= 55f || score >= 70f && score <= 90f || score >= 110f && score <= 120f || score >= 150f && score <= 170f)
        {
            FireBlast.SetActive(true);
            if(score > 30f && score < 40f || score > 55f && score < 70)
            {
                FireBlast.SetActive(false);
            }
        }

        //MONSTER SPAWNER 4
        if (score >= 15f && score <= 35f || score >= 50f && score <= 100f || score >= 120f && score <= 1000f)
        {
             Shark.SetActive(true);
             MonsterSpawn4.SetActive(true);
        }

        if (score >= 12f && score <= 40f || score >= 60f && score <= 100f || score >= 120f && score <= 1000f)
        {
            Bag.SetActive(true);
            MonsterSpawn4.SetActive(true);
        }
        //MONSTER SPAWNER FIN

        if (score >= 12f && score <= 25f)
        {
            SkullAlert.SetActive(true);
            if (score > 17f)
            {
                SkullAlert.SetActive(false);
            }
        }
        
    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Ajouter un evenement via le score

Message par boubouk50 » 03 Déc 2020 15:54

Salut,

déjà, tu n'as pas besoin de passer par l'Update puisque tu sais quand le score change donc quand une porte doit s'activer ou non. Tu fais un UpdateHighScore, tu pourrais à ce moment là, définir les conditions.

Pour le reste, j'ai pas compris ce que tu veux faire. Tu veux faire des boucles de condition plutôt qu'une suite?
Si c'est ça, comme tu possèdes un min et un max à chaque fois, tu pourrais les stocker pour les inclure dans la boucle.

Code : Tout sélectionner

List <int> min;	//à remplir
List <int> max;	//à remplir en concordance avec la list min

private bool IsBetweenMinMax (int _value)
{
	for (int i=0 ; i<min.Count ; i++)
	{
		if (min[i] <= _value && _value <= max[i])
			return true;
	}
	return false;
}
Par exemple, voici l'exemple d'une fonction (peut contenir des erreurs, je l'ai fait à main levée) qui prend en paramètre la valeur à tester et qui renvoie vrai ou faux si cette valeur est comprise au moins une fois entre un min et un max. Ce résultat peut ainsi être interprété pour l'activation de la porte.

Code : Tout sélectionner

Porte.SetActive (IsBetweenMinMax (score));
activera ou pas la porte en fonction du score.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jonathanbtq
Messages : 6
Inscription : 05 Oct 2020 15:47

Re: [DB-AL] Ajouter un evenement via le score

Message par Jonathanbtq » 04 Déc 2020 13:59

Hey,
Merci pour la réponse, je vais tester ça tout de suite et je donnerais des nouvelles :)

Jonathanbtq
Messages : 6
Inscription : 05 Oct 2020 15:47

Re: [DB-AL] Ajouter un evenement via le score

Message par Jonathanbtq » 04 Déc 2020 16:19

J'ai essayer d’intégré ce que tu m'as proposé et j’avoue être largué, je n'ai jamais été confronté a ça ^^
Je pense que j'ai du faire un peu n’importe quoi haha

Code : Tout sélectionner


    List<int> min;
    List<int> max;

    private bool IsBetweenMinMax(int _value)
    {
        for(int i=0; i<min.Count; i++)
        {
            if (min[i] <= 12 && 30 <= max[i])
                return true;

        }
        return false;
    }

Et par contre je ne sais pas où mettre le Porte.SetActive.

J'ai une question pour les autres événements (ex: Un pouvoir qui s'active a 25 de score, la fonction IsBetween ne pourras pas être utilisé pour celui ci, je devrais en refaire une pour le nouvelle événement?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Ajouter un evenement via le score

Message par boubouk50 » 04 Déc 2020 16:37

Alors,

Code : Tout sélectionner

List<int> min;
    List<int> max;
sont des variables de classe que tu pré-rempliras avec les min et max que tu as défini dans l'Update.
En gros:

Code : Tout sélectionner

public class ScoreScript : MonoBehaviour
{
	//Tes variables de classe
	private List<int> porteMin = new List<int> () {15, 30, 60, etc }; //ici tu renseignes tous tes Min de porte
	private List<int> porteMax = new List<int> () {30, 50, 90, etc }; //ici tu renseignes RESPECTIVEMENT tous tes Max de porte
	private List<int> fireMin = new List<int> () {15, 40, 55, etc }; //ici tu renseignes tous tes Min de FireBlast
	private List<int> fireMax = new List<int> () {30, 55, 70, etc }; //ici tu renseignes tous tes Max de FireBlast
	
	//Tes fonctions
	private bool IsBetweenMinMax (List <int> min, list <int> max, int _value)
	{
		for (int i=0 ; i<min.Count ; i++)
		{
			if (min[i] <= _value && _value <= max[i])
				return true;
		}
		return false;
	}
	
	//Ta fonction doit être appelée  A CHAQUE FOIS que le score est modifié
	public void AddScore()
	{
       		score++;
       		//Doit être appelé dès que le score est modifié  -> Utiliser un accesseur qui peut le faire automatiquement
		Porte.SetActive (IsBetweenMinMax (porteMin, porteMax, score));
		if (IsBetweenMinMax (fireMin, fireMax, score))
		{
			FireBlast.SetActive (!IsBetweenMinMax (31, 39) || IsBetweenMinMax (56, 69))
		}
		
        	UpdateHighScore();

        	scoreText.text = score.ToString();
        	gameOverScoreText.text = score.ToString();
	}
}
Je n'ai pas tout fait mais typiquement, c'est ce que tu peux faire. Tu n'es pas obligé de définir les min max dans la classe, mais les redéfinir localement dans la fonction (ça t'éviterait d'avoir deux listes par objet à tester).
D'un point de vue conception, chaque objet à tester pourrait avoir ces propres listes (ou tableau) définis dans un autre component. Ici, tu récupérerais le component et donc les min et max accessibles pour les définir par objet et pas directement dans le script.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jonathanbtq
Messages : 6
Inscription : 05 Oct 2020 15:47

Re: [DB-AL] Ajouter un evenement via le score

Message par Jonathanbtq » 04 Déc 2020 17:33

J'ai repris ton exemple et Je voulais vraiment te remercier pour ton aide, c'est parfaitement ce qu'il me fallait :)
Ça faisait trop longtemps que je cherchais une solutions en vain haha
Merci beaucoup, tu sauves mon projet :super:

Ça active super bien mes événements en fonctions du score, les désactives et réactive a la suite :)
Passe une bonne journée !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Ajouter un evenement via le score

Message par boubouk50 » 07 Déc 2020 17:51

Je t'en prie, on est là pour ça :super:
Si ton problème est résolu, édite le premier message, et ajoute [RESOLU] en début du titre de celui-ci pour avertir les autres membres que la solution est trouvée.
Je m'en occupe cette fois-ci ;)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »