[RESOLU][DB-AL] Un bouton reset positions
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
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
[RESOLU][DB-AL] Un bouton reset positions
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
Merci a vous,
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
Merci a vous,
Dernière édition par DJ-OMZ le 07 Juil 2017 12:20, édité 1 fois.
- boubouk50
- ModoGenereux
- Messages : 6221
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Un bouton reset positions
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Un bouton reset positions
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;
}
Maintenant, comment je fais pour les récupérer et dire "toi tu vas la-bas" ? Les objets sont ClickableObject.
- boubouk50
- ModoGenereux
- Messages : 6221
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Un bouton reset positions
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.
- 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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Un bouton reset positions
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 ?
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 ?
Re: [DB-AL] Un bouton reset positions
Salut,
Pour reset la position, il suffit juste de retenir la précédente position à chaque déplacement.
Par contre tu devrais utiliser + de classes et/ou structure
en rajoutant une structure Tile
le code deviendra + lisible
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
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;
}
}
en rajoutant une structure Tile
Code : Tout sélectionner
[System.Serializable]
public struct Tile {
public int tileX;
public int tileY;
public int tileZ;
}
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;
}
}
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 !”
- boubouk50
- ModoGenereux
- Messages : 6221
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Un bouton reset positions
Comment ça tu as une liste? Je ne comprends pas.DJ-OMZ a écrit :Mais j'ai une liste d'objets du coup dans mon TileMap.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Un bouton reset positions
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 : Pour reset la position, il suffit juste de retenir la précédente position à chaque déplacement.
Oui je sais que malheureusement mon code est assez crade, il va falloir cleaner ça quand je pourrais.evereal a écrit : Par contre tu devrais utiliser + de classes et/ou structure (...)
Oui voila. En fait quand je les crées je les gardes dans une liste :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.
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
}
}
- boubouk50
- ModoGenereux
- Messages : 6221
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL] Un bouton reset positions
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL] Un bouton reset positions
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 pas au sens POO."
En tout cas j'ai quelque chose qui fonctionne et je vous remercie, encore
"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 pas au sens POO."
En tout cas j'ai quelque chose qui fonctionne et je vous remercie, encore