Как мне нарисовать два объекта из одного класса в C # / Csharp и XNA?

#c# #xna

#c# #xna

Вопрос:

Вот моя проблема. У меня есть класс paddle и класс ball. Оба имеют методы update, initialize и draw . Проблема в моем классе paddle. Я хочу нарисовать на экране две области (каждая разного цвета), но имеющийся у меня в настоящее время код работает некорректно. В результате получается 4 элемента управления вместо двух (по сути, два элемента управления, а под ними еще два).

Вот код — http://paste2.org/p/1390842

И вот скриншот проблемы — http://img651.imageshack.us/img651/9092/pongshot.png

Я не уверен, что я делаю неправильно. Возможно, это тот случай, когда невозможно нарисовать два разных элемента управления? Должен ли я вместо этого создать второй класс paddle?

И вот мой файл Game1.cs — http://paste2.org/p/1390854

И мой класс Ball — http://paste2.org/p/1390856

Комментарии:

1. У вас должен быть класс Paddle для представления paddles и создания двух таких объектов.

2. У меня есть один класс Paddle. Это первый код, на который я ссылался. Я пытался нарисовать два объекта, но, похоже, это работает некорректно. Я впервые пытаюсь нарисовать несколько объектов из одного класса, так что да.

3. Не рисуйте несколько объектов в одном объекте. Сделайте каждый элемент управления отдельным объектом.

4. 1 по этому вопросу за предоставление кода и скриншота, чтобы помочь всем понять вопрос. Это всегда приятно.

Ответ №1:

Внутри ваших методов инициализации / рисования вы рисуете два элемента управления для одного объекта. Измените их на это:

        public void Initialize(Texture2D texture, Vector2 position)
       {
            pongPaddle1 = texture;

            //Set Paddle position
            paddle1Position = position;
       }


        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(pongPaddle1, paddle1Position, null, Color.DarkSlateBlue, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
        }
  

В принципе, избавьтесь от Paddle2 из класса. Поскольку вы создаете два экземпляра Paddle в Game1.cs, вам не нужно проводить два рисования внутри paddle. Это противоречит назначению объектов данных. Каждый экземпляр, который находится внутри вашего Game1.cs, вызовет метод Draw(), и они нарисуют себя сами.

Комментарии:

1. Делая это таким образом, я смогу вносить изменения в каждый экземпляр по отдельности? Или внесение изменений повлияет на все экземпляры?

2. Вы сможете вносить изменения в каждый экземпляр по отдельности. Итак, если бы вы хотели изменить положение paddle1, вы бы просто сделали Paddle1 . Позиция = бла ..бла.. А затем выполните Paddle2.Position = бла ..бла .. для Paddle2.

Ответ №2:

Один класс paddle для представления ОБОИХ paddle, вероятно, не лучший дизайн, поскольку он нарушает идею разделения задач. Это касается ДВУХ вещей вместо одной. Простое наличие 2 экземпляров одного класса paddle сделает вашу жизнь намного проще.

Если вы решите не идти этим путем, ваша проблема в файле Game1. У вас есть 2 экземпляра класса, который имеет дело с обоими элементами управления. Смотрите initiliazation(). Вам следует создавать экземпляр только ОДНОГО, если вы собираетесь сделать это таким образом.

В методе Draw() вы также рисуете дважды. Класс Paddle представляет собой 2 paddle, а не один. Таким образом, у вас снова должен быть только один экземпляр paddle, если вы не собираетесь проводить рефакторинг класса paddle.

Ответ №3:

Здесь происходит несколько вещей, которые вызывают вашу проблему:

  1. Похоже, что ваш класс paddle фактически обрабатывает отдельные элементы управления. Вы объявляете два экземпляра этого класса, так что, по сути, у вас есть четыре элемента управления
  2. При создании нового экземпляра paddle вы задаете pongPaddle1 и pongPaddle2 одинаковые координаты. Однако вы обновляете только один из этих наборов координат для каждого объекта paddle. paddle1 обновляет только pongPaddle1 и аналогично для paddle2. pongPaddle2 и pongPaddle1 никогда не изменяются с их начальных позиций для каждого объекта соответственно.
  3. Когда вы переходите к draw, он рисует то, что находится в pongPaddle1 и pongPaddle2 для каждого объекта.

Мое предложение состояло бы в том, чтобы либо изменить ваш класс paddle, чтобы он имел единственное свойство position (вместо pongPaddle1 и pongPaddle2), и сохранить один отдельный объект для каждого paddle. Или вы можете заставить класс paddle обрабатывать оба элемента управления, но только один экземпляр объекта в основном коде. Итак, вместо paddle1 и paddle2 у вас могли бы быть весла, а затем обновить pongPaddle1 и pongPaddle2 для каждого весла соответственно.

Кроме того, XNA не заботится о том, какова ваша объектная ситуация для рисования. Если вы вызываете метод Draw , он просто копирует эти данные изображения в экранный буфер, куда вы им укажете. Вы можете вызывать это столько раз, сколько захотите, с разными параметрами из одного и того же класса, и это покажет все без исключения.

Ответ №4:

Почему бы не нарисовать только один элемент управления для каждого экземпляра класса paddle и просто иметь два экземпляра класса?

 class paddle
{
    public Vector2 paddlePosition;
    public Texture2D pongPaddle; 

    // Getting Paddle Height and Width

    public int Width
    {
        get { return pongPaddle.Width; }
    }


    public int Height
    {
        get { return pongPaddle.Height; }
    }


    public paddle(Texture2D texture, Vector2 position)
    {
        pongPaddle = texture;

        //Set Paddle position
        paddlePosition = position;
    }

    public void Update()
    {
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(pongPaddle, paddlePosition, null, Color.DarkSlateBlue, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
    }
}
  

Инициализировать — это примерно так

 Paddle p1 = new Paddle(texture1, location1);
Paddle p2 = new Paddle(texture2, location2);
  

А затем вызвать draw

 p1.Draw(spriteBatch);
p2.Draw(spriteBatch);
  

Похоже, вы не очень хорошо понимаете принципы OO. Если вы не хотите работать с C # и XNA, я бы посоветовал вам еще немного попрактиковаться в OO.