[RESOLU][DB-AL] Un bouton reset positions

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
Répondre
Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

[RESOLU][DB-AL] Un bouton reset positions

Message par DJ-OMZ » 06 Juil 2017 15:01

Bonjour,

En fait ce n'est pas vraiment une question Algo mais il s'agirait surtout d'avoir des conseils sur la direction a prendre.

Je souhaite faire quelque chose, mais je ne sais pas du tout comment le faire :

J'ai un jeu avec un personnage, une grille sur laquelle je me déplace, et des objets disposés sur cette grille.
J'ai une méthode qui crée une liste pour ma grille, une autre qui crée une liste pour mes objets, et ensuite une qui crée les objets de ces listes.

Les déplacements peuvent créer des situations impossible a résoudre si on déplace les objets de la mauvaise manière, du coup, je souhaite mettre un bouton reset, qui va remettre les objets et le personnage a leur position initiale.
Et la je ne sais pas comment m'y prendre. Dois-je tout détruire et reconstruire ?
Dois-je modifier les listes afin de sauvegarder pour chaque objet sa position initiale, et déplacer tous les objets au moment du click sur le reset ?

Comment auriez vous fait ? Je lance un appel a la chasse aux idées :lol:

Merci a vous,
Dernière édition par DJ-OMZ le 07 Juil 2017 12:20, édité 1 fois.

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

Re: [DB-AL] Un bouton reset positions

Message par boubouk50 » 06 Juil 2017 15:09

Je ne sais pas comment est géré ton système, mais tu dois bien avoir une initialisation quelque part. Il te suffit de la stocker pour la réinjecter. Ou bien de réinitialiser avec les mêmes conditions. Relancer le niveau est un peu lourd, généralement, tu réinitialises les transforms des objets.
"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

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: [DB-AL] Un bouton reset positions

Message par DJ-OMZ » 06 Juil 2017 15:21

Code : Tout sélectionner

foreach (int key in objects.Keys)
        {
            //Object

            Dictionary<string, int> attributs = objects[key];
            ObjectType obj = objectTypes[attributs["Type"]];
            int x = attributs["x"];
            int y = attributs["y"];
            int z = attributs["z"];
            //Ma rotation
            Quaternion rotationObject = Quaternion.identity;
            if (attributs.ContainsKey("Rotation"))
            {
                float valRotation = attributs["Rotation"];
                rotationObject = Quaternion.Euler(0, valRotation, 0);
            }
            GameObject goObject = (GameObject)Instantiate(obj.tileVisualPrefab, new Vector3(x, y, z), rotationObject);
            ClickableObject co = goObject.GetComponent<ClickableObject>();
            co.tileX = x;
            co.tileY = y;
            co.tileZ = z;
            co.map = this;
        }
Au départ j'ai ceci qui crée mes objets.

Maintenant, comment je fais pour les récupérer et dire "toi tu vas la-bas" ? Les objets sont ClickableObject.

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

Re: [DB-AL] Un bouton reset positions

Message par boubouk50 » 06 Juil 2017 17:41

Plusieurs voies en fonction des affectations.
- Conserver la liste des gameObjects créés dans l'ordre puis de refaire cette affectation lors d'un Reset. Au lieu de créer un GameObject du coup, tu affectes les données récupérées.
- Créer une classe/structure qui enregistre les données importantes: GameObject/Transformation/TileXYZ (vu qu'a priori le ObjectType est déjà attribué à la création ainsi que le Component ClickableObject) puis réinitialiser cette structure.
- Tout supprimer pour recommencer, c'est le plus simple à mettre en place, mais le plus long à l'exécution.
"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

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: [DB-AL] Un bouton reset positions

Message par DJ-OMZ » 07 Juil 2017 09:55

Voila comment je m'y suis pris finalement :

Dans ma classe ClickableObject, dans le start, j'attribue TileXY et Z a sa position (tileX = transform.position.x) car ils ont été positionnés au préalable comme vu plus haut.
J'ai ajouté un vector3 qui sauvegarde la position originelle.

Dans TileMap (le bout de code que tu as vu plus haut), j'ai créé une liste de ClickableObject.

Lorsque je clique sur mon bouton, je dis : Pour chaque objet de la liste, je remet TileXY et Z a la position originelle sauvegardée.

De cette manière je ne détruis rien, je conserve mes objets et les repositionnes. Mais j'ai une liste d'objets du coup dans mon TileMap.

Y vois-tu quelque chose de choquant ?

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: [DB-AL] Un bouton reset positions

Message par evereal » 07 Juil 2017 10:40

Salut,

Pour reset la position, il suffit juste de retenir la précédente position à chaque déplacement.

Code : Tout sélectionner

public class ClickableObject : MonoBehaviour {
	
	int lastTileX, lastTileY, lastTileZ;
	int tileX, tileY, tileZ;
	
	void Start() {
		lastTileX = tileX;
		lastTileY = tileY;
		lastTileZ = tileZ;
	}
	
	public void deplacement(int aTileX, int aTileY, int aTileZ) {		
		lastTileX = tileX;
		lastTileY = tileY;
		lastTileZ = tileZ;
		
		tileX = aTileX;
		tileY = aTileY;
		tileZ = aTileZ;
	}
	
	public void reverseDeplacement() {
		tileX = lastTileX;
		tileY = lastTileY;
		tileZ = lastTileZ;
	}
}
Par contre tu devrais utiliser + de classes et/ou structure
en rajoutant une structure Tile

Code : Tout sélectionner

[System.Serializable]
public struct Tile {
	public int tileX;
	public int tileY;
	public int tileZ;
}
le code deviendra + lisible

Code : Tout sélectionner

public class ClickableObject : MonoBehaviour {
	
	Tile lastTile;
	Tile actualTile;
	
	void Start() {
		lastTile = actualTile;
	}
	
	public void deplacement(Tile aTile) {		
		lastTile = actualTile;
		actualTile = aTile;
	}
	
	public void reverseDeplacement() {
		actualTile = lastTile;
	}
}
De même qu'avec une structure pour tes pièces, tu px éviter de te prendre la tête avec des dictionnaires de dictionnaires et ta méthode d'initialisation devient

Code : Tout sélectionner

public struct PieceDeMonJeu {
	public Transform monTransform;
	public prefabClickableObject;	
}

List<PieceDeMonJeu> pieces;
foreach (PieceDeMonJeu maPiece in pieces) {
	GameObject goObject = (GameObject)Instantiate(mePiece.prefabClickableObject, new Vector3(x, y, z), rotationObject);
	ClickableObject co = goObject.GetComponent<ClickableObject>();
	co.actualTile = myTile;
	co.map = this;
}
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

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

Re: [DB-AL] Un bouton reset positions

Message par boubouk50 » 07 Juil 2017 10:41

DJ-OMZ a écrit :Mais j'ai une liste d'objets du coup dans mon TileMap.
Comment ça tu as une liste? Je ne comprends pas.
Si c'est juste les données sauvegardées, il faut bien les avoir quelque part donc non c’est ce qu'il faut faire. Ce ne sont que des données pas des objets.
"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

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: [DB-AL] Un bouton reset positions

Message par DJ-OMZ » 07 Juil 2017 11:59

evereal a écrit : Pour reset la position, il suffit juste de retenir la précédente position à chaque déplacement.
Presque, c'est la position de départ que je voulais en fait. Mais bon j'ai effectivement fait comme tu as montré.
evereal a écrit : Par contre tu devrais utiliser + de classes et/ou structure (...)
Oui je sais que malheureusement mon code est assez crade, il va falloir cleaner ça quand je pourrais.
boubouk50 a écrit : Comment ça tu as une liste? Je ne comprends pas.
Si c'est juste les données sauvegardées, il faut bien les avoir quelque part donc non c’est ce qu'il faut faire. Ce ne sont que des données pas des objets.
Oui voila. En fait quand je les crées je les gardes dans une liste :

Code : Tout sélectionner

List<ClickableObject> clickableObjects;

void GenerateMapVisual()
    {
        foreach (int key in objects.Keys)
        {
            //Object

            Dictionary<string, int> attributs = objects[key];
            ObjectType obj = objectTypes[attributs["Type"]];
            int x = attributs["x"];
            int y = attributs["y"];
            int z = attributs["z"];
            //Ma rotation
            Quaternion rotationObject = Quaternion.identity;
            if (attributs.ContainsKey("Rotation"))
            {
                float valRotation = attributs["Rotation"];
                rotationObject = Quaternion.Euler(0, valRotation, 0);
            }
            GameObject goObject = (GameObject)Instantiate(obj.tileVisualPrefab, new Vector3(x, y, z), rotationObject);
            ClickableObject co = goObject.GetComponent<ClickableObject>();
            co.tileX = x;
            co.tileY = y;
            co.tileZ = z;
            co.map = this;
            clickableObjects.Add(co); // Ici je gardes mes objets dans une liste
        }

    }
C'est un abus de langage quand je dis objet, c'est parce que j'ai des tuiles et des objets, les tuiles sont en gros le sol, et les objets sont... bah les objets ::d pas au sens POO.

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

Re: [DB-AL] Un bouton reset positions

Message par boubouk50 » 07 Juil 2017 12:16

Ok. Donc ta liste contient des ClickableObjects, mais en soi elle contient les données de ces objets, pas l'objet en lui-même. Je en sais pas si je suis clair, mais genre tu n'as pas une copie complète en mémoire de tous les objets, ils ne sont pas dupliqués. Donc oui, garde la, ii c'était ça ta question.
"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

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: [DB-AL] Un bouton reset positions

Message par DJ-OMZ » 07 Juil 2017 12:19

Oui je l'ai bien compris :
"C'est un abus de langage quand je dis objet, c'est parce que j'ai des tuiles et des objets, les tuiles sont en gros le sol, et les objets sont... bah les objets ::d pas au sens POO."

En tout cas j'ai quelque chose qui fonctionne et je vous remercie, encore :lol:

Répondre

Revenir vers « (C#) CSharp »