Если актеры в игре несут ответственность за рисование себя? Разница между ортогональной картой и изометрическим mapLearning для создания лучшего искусства (2D-игры) Почему радианы предпочитают более чем в градусах развития игры? Обнаружение столкновений шестиугольников для быстро движущихся объектов? ? В движке Entity-Component-System, как я могу работать с группами зависимых объектов? Должен ли я использовать текстуры, не имеющие размера 2? Почему этот код обнаружения биений не позволяет правильно зарегистрировать некоторые удары? он подходит к наградам и статистике? Как сделать прыжок персонажа? Что мне нужно для законного использования музыки, защищенной авторским правом, в моей игре? Какие-нибудь советы по созданию кросс-платформенных игр? [closed] Максимальная звуковая задержка до того, как игрок заметит? Как создать частицы, которые реагируют на игрока и врагов? Как именно работает Xrit SpriteBatch? Можно ли вычислить или математически доказать, сбалансирована ли игра? FPSHow я могу сделать «случайный» генератор, который предвзято предшествует событиям? Дизайн MMORPG для ограниченных по времени игроков. В эти дни нужны установки для установки? Каков наилучший способ устранения размола в играх? [закрыто] Моделирование и физика воды /океанаИзготовление игрового процесса для программиста «все-все»

Я очень новичок в разработке игр, но не в программировании.

Я снова играю с игрой типа «Понг» с использованием элемента canvas JavaScript

.

Я создал объект Paddle, который имеет следующие свойства ...

    width литий>
  • height
  • x
  • y
  • colour

У меня также есть объект Pong, который имеет такие свойства, как ...

    width литий>
  • height
  • backgroundColour
  • draw().

Метод draw() в настоящее время сбрасывает содержимое canvas, и здесь возникает вопрос.

Если объект Paddle имеет метод draw(), отвечающий за его рисунок, или должен draw() Pong должен отвечать за привлечение его участников (я предполагаю, что это правильный термин, пожалуйста, исправьте меня, если я ошибаюсь).

Я понял, что для Paddle было бы выгодно рисовать себя, поскольку я создаю два объекта, Player и Enemy. Если бы это не было в Pong 'draw(), мне нужно было бы написать аналогичный код дважды.

Какая здесь самая лучшая практика?

Спасибо.

0 голосов | спросил Tae-Sung Shinashes999Michael StumAPI-BeastgnoblinJ 12 Jam1000000amThu, 12 Jan 2012 07:51:34 +040012 2012, 07:51:34

5 ответов


48

Привлечение актеров к себе не является хорошим дизайном по двум основным причинам:

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

2) это затрудняет расширение; если каждый тип субъекта реализует свой собственный чертеж, и вам нужно изменить способ рисования вообще , вам может потребоваться изменить много кода. Избежание чрезмерного использования наследования может в некоторой степени облегчить это, но не полностью.

Для вашего рендерера лучше обработать чертеж. В конце концов, это то, что значит быть рендерером. Метод drawer's draw должен принимать объект «описание описания», который содержит все необходимое для визуализации вещи. Ссылки на (возможно, общие) данные геометрии, специфические для экземпляра преобразования или свойства материала, такие как цвет и т. Д. Затем он рисует это, и не волнует, как должно выглядеть это описание рендеринга.

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

Затем вы можете просто перебрать все видимые актеры, enqeue их описания визуализации в рендерер, и позволить ему делать свое дело (в основном, вы могли бы обобщить это еще дальше).

ответил Josh Petrie 25 J0000006Europe/Moscow 2011, 06:28:48
15

Здесь может быть полезен шаблон посетителя .

Что вы можете сделать, это иметь интерфейс Renderer, который знает, как рисовать каждый объект и метод «рисовать самостоятельно» в каждом акторе, который определяет, какой (конкретный) метод визуализации для вызова, например.

interface Renderer {
    void drawPaddle(Player owner, Rectangle position);
    // Note: the Renderer chooses the Color based on which player the paddle belongs to

    // Also drawBackground, drawBall etc.
}

interface Actor {
    void draw(Renderer renderer);
}

class Paddle implements Actor {
    void draw(Renderer renderer) {
        renderer.drawPaddle(this.owner, this.getBounds());
    }
}

Таким образом, все еще легко переносить в другую графическую библиотеку или фреймворк (я однажды портировал игру из Swing /Java2D в LWJGL и был очень рад, что использовал этот шаблон вместо передачи Graphics2D вокруг.)

Есть еще одно преимущество: средство визуализации может быть протестировано отдельно от любого актерского кода

ответил finnw 30 J0000006Europe/Moscow 2011, 21:35:00
2

В вашем примере вы хотите, чтобы объекты Pong реализовали draw () и отображали сами.

Хотя вы не заметите каких-либо существенных выигрышей в проекте такого размера, обычно разделяющая логика игры и их визуальное представление (рендеринг) - это полезная деятельность.

Под этим я подразумеваю, что у вас будут ваши игровые объекты, которые могут быть update () 'd, но они не имеют представления о том, как они отображаются, они касаются только моделирования.

Тогда у вас будет класс PongRenderer (), который имеет ссылку на объект Pong, и затем он берет на себя ответственность за рендеринг класса Pong (), это может включать в себя рендеринг Paddles или наличие класса PaddleRenderer для ухода его.

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

ответил Michael 25 J0000006Europe/Moscow 2011, 06:27:51
0

Если вы должны были сделать это в Pong 'draw (), вам не нужно будет дублировать код - просто вызовите draw Paddle ) для каждого из ваших весла. Таким образом, в вашем тэге Pong у вас будет

humanPaddle.draw();
compPaddle.draw();
ответил Benixo 25 J0000006Europe/Moscow 2011, 05:48:15
0

Каждый объект должен содержать свою собственную функцию рисования, которую должен вызывать код обновления игры или код рисования. Как

class X
{
  public void Draw( )
  {
     // Do something 
  } 
}

class Y
{
  public void Draw( )
   { // Do Something 
   } 
}

class Game
{
  X objX;
  Y objY;

  @Override
  public void OnDraw( )
  {
      objX.Draw( );
      objY.Draw( ); 
  } 
}

Это не код, а только для показа, как рисовать объекты должны быть.

ответил user43609 2 72014vEurope/Moscow11bEurope/MoscowSun, 02 Nov 2014 11:58:42 +0300 2014, 11:58:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132