Доступ к функции класса из функции другого класса - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь получить доступ к функции обновления ключа из функции обновления MainChar. Оба класса наследуются от класса Sprite. В Main Char я получаю сообщение об ошибке:

Требуется ссылка на объект для нестатического c поля, метода или свойства Key.Update (GameTime, List). Я попытался поместить тип перед параметрами, но я получаю ошибки:

«GameTime» - это тип, который недопустим в данном контексте, «Sprite» - это тип, который недопустим в данный контекст.

Я также попытался создать новый экземпляр Key, выполнив: Key key = new Key (текстура, позиция); Я снова попытался поместить типы раньше, но только что получил: Ключ не содержит конструктор, который принимает 4 аргумента, и они недопустимы в данном контексте. Помощь будет оценена.

Этот вопрос был связан с похожим вопросом, который не решил мой вопрос, потому что я не могу выполнить обновление или определение ключа c.

  public MainChar(Texture2D texture) : base(texture)
    {
        Scale = 0.1f;
    }

    public override void Update(GameTime gameTime, List<Sprite> sprites)
    {
        Move();

        foreach (var sprite in sprites)
        {
            if (sprite == this)
            {
                continue;
            }

            if (Velocity.X > 0 && IsTouchingLeft(sprite) || Velocity.X < 0 && IsTouchingRight(sprite)) 
            {
                Velocity.X = 0;
            }

            if (Velocity.Y > 0 && IsTouchingTop(sprite) || Velocity.Y < 0 && IsTouchingBottom(sprite))
            {
                Velocity.Y = 0;
            }

            if (sprite.rectangle.Intersects(rectangle))
            {
                hasDied = true;

            }

            if (sprite is Key)
            {
                Key.Update(gameTime, sprites);
            }
        }

        Position += Velocity;
     }
     public int keyCount;

        public Key(Texture2D texture, Vector2 position) : base(texture)
        {
            Position = position;
            Scale = 0.08f;
        }

        public override void Update(GameTime gameTime, List<Sprite> sprites)
        {
            foreach (var sprite in sprites)
            {

                if (sprite is MainChar)
                {

                    if (IsTouchingLeft(sprite)  == true || IsTouchingRight(sprite) == true || IsTouchingTop(sprite) == true || IsTouchingBottom(sprite) == true)
                    {
                        Position = new Vector2(1000, 1000);
                        keyCount++;
                    }
                }
            }
        }

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

В методе Update вашего класса MainChar после проверки, является ли «sprite» объектом типа Key (if(sprite is Key)), вам также необходимо привести «sprite» (который является объектом типа Sprite). ) для ввода ключа, например: ((Key)sprite).Update(gameTime, sprites).

Класс Sprite, по-видимому, не имеет вызываемого метода Update - вот почему вы получаете ошибку. Проверка 'is' автоматически не приводит его к типу Key, поэтому, хотя вы знаете, что у 'sprite' есть фактический тип Key, его объявленный тип по-прежнему Sprite.

2 голосов
/ 12 марта 2020

cmhoequist ответ выглядит GD, попробуйте это, если вы используете версию поддержки

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is#a -nametype - type-pattern-a

if (sprite is Key k)
{
    k.Update(gameTime, sprites);
}
...