Как нарисовать два объекта из одного класса в C # / Csharp и XNA? - PullRequest
2 голосов
/ 29 апреля 2011

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

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

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

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

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

А у меня мяч - http://paste2.org/p/1390856

Ответы [ 4 ]

2 голосов
/ 29 апреля 2011

Внутри ваших методов Intialize / Draw вы рисуете два весла для одного объекта.Измените их следующим образом:

       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 голос
/ 29 апреля 2011

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

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);

А потом назови ничью

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

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

1 голос
/ 29 апреля 2011

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

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

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

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

1 голос
/ 29 апреля 2011

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

Если вы решите не идти по этому пути, ваша проблема в файле Game1.У вас есть 2 экземпляра класса, который имеет дело с обеими веслами.Смотрите инициализацию ().Вы должны создавать экземпляр ONE только если вы собираетесь сделать это таким образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...