#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:
Здесь происходит несколько вещей, которые вызывают вашу проблему:
- Похоже, что ваш класс paddle фактически обрабатывает отдельные элементы управления. Вы объявляете два экземпляра этого класса, так что, по сути, у вас есть четыре элемента управления
- При создании нового экземпляра paddle вы задаете pongPaddle1 и pongPaddle2 одинаковые координаты. Однако вы обновляете только один из этих наборов координат для каждого объекта paddle. paddle1 обновляет только pongPaddle1 и аналогично для paddle2. pongPaddle2 и pongPaddle1 никогда не изменяются с их начальных позиций для каждого объекта соответственно.
- Когда вы переходите к 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.