Каков самый изящный и эффективный способ смоделировать игровую иерархию объектов? (разработайте беспокойства),

Я нашел этот статья CodeProject записанный Daniel Fisher содержащий простое реализация C# из изображения к алгоритму преобразования ASCII-творчества.

Это шаги, которые выполняет программа/библиотека:

  1. Загрузка поток Изображения к растровому объекту
  2. Шкала полутонов битовый массив с помощью Графического объекта
  3. Цикл через пиксели изображения (потому что мы не хотим одного символа ASCII на пиксель, мы берем один на 10 x 5)
  4. , Чтобы позволить каждому пикселю влиять на получающийся символ ASCII, мы циклично выполняем их и вычисляем яркость суммы текущих 10 x 5 блоков.
  5. Наконец, добавьте различные символы ASCII, базирующиеся для текущего блока на расчетной сумме.

Довольно легкий, не так ли?

BTW: В комментариях к статье я нашел этот прохладная реализация AJAX : Генератор ASCII-ТВОРЧЕСТВА Gaia Ajax :

[...] я чувствовал себя вынужденным продемонстрировать, что это могло легко быть сделано в стандартизированном наборе веб-технологий. Я намеревался видеть, мог ли я найти, что некоторые библиотеки использовали, и я нашел codeproject статью Sau Fan Lee о его ASCII fying библиотекой.NET.

P.S.: Lucas (см. комментарии) нашел другой статья .

CodeProject

9
задан zyndor 23 September 2009 в 09:33
поделиться

4 ответа

Это, вероятно, самая большая проблема, с которой я сталкиваюсь при разработке подобных программ. Подход, который я выбрал, состоит в том, чтобы понять, что объекту действительно не важно, где он находится в абсолютном выражении. Все, что его волнует, - это то, что вокруг него. В результате объект World (а я предпочитаю объектный подход синглтону по многим веским причинам, которые вы можете найти в Интернете) поддерживает расположение всех объектов, и они могут спросить мир, что объекты находятся поблизости, где другие объекты находятся по отношению к нему и т. д. Мир не должен заботиться о содержании Object ; он будет содержать что угодно, и сами объекты будут определять, как они взаимодействуют друг с другом. События также являются отличным способом обработки взаимодействующих объектов, поскольку они предоставляют миру средство информировать Объект о том, что происходит, не заботясь о том, что такое Объект .

Скрытие информации от Объект о всех объектах - хорошая идея, и его не следует путать с сокрытием информации о любом объекте . Думайте о людях - для вас разумно знать и хранить информацию о многих разных людях, хотя вы можете узнать эту информацию, только встретившись с ними или попросив кого-нибудь о них рассказать.

ИЗМЕНИТЬ СНОВА:

Все право. Мне довольно ясно, чего вы действительно хотите, и это множественная отправка - способность полиморфно обрабатывать ситуацию по типам многих параметров для вызова функции, а не только одному. К сожалению, C ++ изначально не поддерживает множественную отправку.

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

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

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

5
ответ дан 4 December 2019 в 14:29
поделиться

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

Это сохраняет знания о различных типах объектов вне первичных объектов и инкапсулирует их в объекты со знаниями, специфичными для взаимодействие.

6
ответ дан 4 December 2019 в 14:29
поделиться

Объекты должны знать о Мире. они внутри, чтобы запросить столкновение информация и другие объекты.

Короче - нет. Классы, подобные World, могут справиться с большей частью этого, и все, что должен сделать Объект, - это вести себя соответствующим образом, когда Мир сообщает ему, что произошло столкновение.

Иногда вам может потребоваться, чтобы у объекта был какой-то контекст, чтобы другой тип решения. Вы можете передать объект World в этот момент, когда это необходимо. Однако вместо того, чтобы передавать World, лучше передать какой-нибудь более мелкий, более релевантный объект в зависимости от того, какой тип запроса фактически выполняется. Скорее всего, ваш объект World выполняет несколько разных ролей, а объектам нужен только временный доступ к одной или двум из этих ролей. В этом случае хорошо разделить объект World на подобъекты или, если это нецелесообразно,

3
ответ дан 4 December 2019 в 14:29
поделиться

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

В нашей системе CMS уже были все функции для вывода списка страниц в древовидном формате, поэтому, если у вас есть что-то похожее, вы можете просто открыть свою собственную созданную страницу с помощью кнопки tinyMCE.

(Также не забудьте подумать о том, как вы будет обрабатывать внутренние ссылки на удаленные или заархивированные страницы).

bullets и т. д. списки их (и других) категорий полностью доступны для них, включая object.hpp, который они, очевидно, должны в любом случае.

О бите полиморфизма и почему разные категории хранятся в отдельных списках: категории объектов 'базовые классы (Bullet, Enemy, Player) могут предоставлять «обработчики событий» для поражения объектов определенных типов; однако они не объявляются на уровне объекта, а не на уровне категории. (например, нас не волнуют столкновения пули с пулей, они не проверяются и не обрабатываются.)

// object.hpp
//-----------
#include "world.hpp"

class Object
{
  static World *pWorld;
  ...
};

class Bullet: public Object
{
  typedef std::list<Bullet*> InstList;
  static InstList insts;
  ...
};

class Player: public Object
{
  static Player *pThePlayer;

  void OnHitBullet(const Bullet *b);
  ...
};

class Enemy: public Object
{
  typedef std::list<Enemy*> InstList;
  static InstList insts;

  virtual void OnHitBullet(const Bullet *b);
  virtual void OnHitPlayer(const Player *p);
  ...
};

ИЗМЕНИТЬ, для полноты:

// game.hpp
//-----------
#include "object.hpp"

struct Game
{
  static World world;

  static void Update(); // update world and objects, check for collisions and
                        /// handle them.
  static void Render();
};
0
ответ дан 4 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

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