des variables qui ne s'updatent pas ?

..je suis un nouveau en C#

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir, je n'ai pas vraiment l'habitude de demander de l'aide sur un probleme qui me semble aussi "simple" mais comme je n'arrive pas a trouver la solution et que je viens de commencer le C#, je me dis que c'est simplement parce que j'ai encore un peu de mal en C#: alors voila, j'ai commencé hier un zelda nes - like avec monogame et je souhaite afficher le nombre de bombes et de clefs recupérées par le joueur, et je modifie les valeurs dans cette classe :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using Microsoft.Xna.Framework;
using RogueLikeZelda.menu;
using Microsoft.Xna.Framework.Input;
using System;
using Microsoft.Xna.Framework.Graphics;
using RogueLikeZelda.resources;

namespace RogueLikeZelda
{

    public class EntityPlayer
        : LivingEntity
    {
        //FIELDS 
        private int bombsCount;
        private int keysCount;

        //CONSTRUCTOR
        public EntityPlayer(int x = 0 , int y = 0) 
           : base(new Sprite("link", x, y, 4, 2),16 ,1 , x, y)
        {
            this.currentLife = 1;
            this.keysCount = 0;
            this.bombsCount = 0;
        }

        //PROPERTIES
        public int GetKeys { get { return this.bombsCount; } }
        public int GetBombs { get { return this.keysCount;  } }

        //METHODS
        public override bool OnCollision(Entity other)
        {
            if (other is EntityItem)
            {
                EntityItem item = (EntityItem)other;
                item.PickupItem(this);
            }
            return false;
        }

        public void AddKey(int amount)
        {
            this.keysCount += amount;
            Console.WriteLine("key added");
        }

        public void AddBombs(int amount)
        {
            this.bombsCount += amount;
            Console.WriteLine("bombs added");
        }
        //UPDATE & DRAW
        public override void UpdateChildren(GameTime gameTime, Input input)
        {
            this.bombsCount += 1;
            if (input.IsKeyDown(Keys.Z))
                this.Move(0, -this.moveSpeed);
            if (input.IsKeyDown(Keys.S))
                this.Move(0, this.moveSpeed);
            if (input.IsKeyDown(Keys.Q))
                this.Move(-this.moveSpeed, 0);
            if (input.IsKeyDown(Keys.D))
                this.Move(this.moveSpeed, 0);

            this.UpdateSpriteAnimation();
        }

    }
}

EntityPlayer.cs

et ensuite j'affiche mon Gui dans mon instance en cours:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using RogueLikeZelda.menu;
using RogueLikeZelda.resources;
using System;

namespace RogueLikeZelda
{
    class MenuGame : MenuBase
    {

        //FIELDS
        private Room currentRoom;
        private EntityPlayer player;
        private Sprite gui;

        //CONSTRUCTOR
        public MenuGame()
            : base()
        {
            this.currentRoom = new Room();
            this.player = new EntityPlayer();
            this.gui = new Sprite("gui", 0, 0);
            this.currentRoom.Spawn(new EntityPlayer(), 1, 1);

            this.currentRoom.PlaceItem(new ItemKey(), 5, 4);
            this.currentRoom.PlaceItem(new ItemBomb(), 5, 2);
        }
        //UPDATE & DRAW

        public override void Update(GameTime gameTime, Input input)
        {
            this.currentRoom.Update(gameTime, input);

        }
        public override void Draw(SpriteBatch spriteBatch)
        {
            this.currentRoom.Draw(spriteBatch);
            this.gui.Draw(spriteBatch );

            spriteBatch.DrawString(Resources.fonts["font"], this.player.GetKeys.ToString(), new Vector2(104, 32), Color.White);
            spriteBatch.DrawString(Resources.fonts["font"], this.player.GetBombs.ToString(), new Vector2(104, 40), Color.White);

            int i = 0;
            int offsetY = 0;
            for (; i < this.player.CurrentLife; ++i)
            {

                spriteBatch.Draw(Resources.images["heart"], new Vector2(176 + ((i % 8) * 8), 40 + offsetY), Color.Red);
                if (i == 7) offsetY = -8;
            }
            for (; i < this.player.MaxLife; ++i)
            {

                spriteBatch.Draw(Resources.images["heart"], new Vector2(176 + ((i % 8) * 8), 40 + offsetY), Color.Aquamarine);
                if (i == 7) offsetY = -8;
            }

        }


    }
}

MenuGame.cs

Le soucis, c'est que quand je tente d'acceder a ces valeurs dans ma classe EntityPlayer.cs pas de soucis, mais par contre depuis MenuGame.cs je n'arrive à avoir les changements (a afficher tout le temps 0 même quand

1
2
3
4
5
public void AddBombs(int amount)
        {
            this.bombsCount += amount;
            Console.WriteLine("bombs added");
        }

est appelé par exemple). Est-ce que mon code est faux, un problème d'algo ou une étourderie car même avec l'outil debug de VS je n'ai rien trouvé mais c'est peut être parce que je débute en C#?

+0 -0

Rajoute un setter dans ta property et utilise ce setter pour changer ta variable à la place de this.variable.

Si tu veux que la variable soit utilisée seulement dans la classe tu peux mettre le setter en private.

Un petit raccourci fort utilisé c'est : NumberOfBomb {get;set;}

Il va auto-créer le private field derrière.

Édité par gegko

+1 -0
Auteur du sujet

Je crois bien qu'elles se reset parce que même avec ce changement rien ne change :(

1
2
public int Bombs { get { return this.bombsCount; } set { this.bombsCount = value; } }
public int Key { get { return this.keysCount;  } set { this.keysCount = value;  } }
1
  this.Key +=  amount;
1
this.player.Key.ToString()

je continue a chercher mais c'est très étrange O.o

+0 -0

De plus quand je l'appelle dans MenuGame, elle s'update bien mais pas quand je l'appelle dans les Item …

GouleFutée

Le soucis, c'est que quand je tente d'acceder a ces valeurs dans ma classe EntityPlayer.cs pas de soucis, mais par contre depuis MenuGame.cs je n'arrive à avoir les changements (a afficher tout le temps 0 même quand

??

+0 -0
Auteur du sujet

Et j'ai essayé depuis MenuGame d'ajouter un item et ça affichait bien la bonne valeur. Je suppose donc que cela vient des items: j'ai une classe BombItem et KeyItem qui contient une method pickup qui prend un player en argument et qui fait player.ajouteItem() mais ce qui est etrange c'est que les Console.Write qui sont dans AddBomb et AddKey s'affichent bien. Cela pourrait venir de this? un exemple d'une classe item:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    public class ItemBomb
        : Item
    {
        public ItemBomb() 
            : base(9 , ItemType.BOMB)
        {
        }

        public override void OnPickupItem(EntityPlayer player)
        {

            player.AddBomb(1);
        }
    }
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte