Я нашел этот статья CodeProject записанный Daniel Fisher содержащий простое реализация C# из изображения к алгоритму преобразования ASCII-творчества.
Это шаги, которые выполняет программа/библиотека:
Довольно легкий, не так ли?
BTW: В комментариях к статье я нашел этот прохладная реализация AJAX : Генератор ASCII-ТВОРЧЕСТВА Gaia Ajax :
[...] я чувствовал себя вынужденным продемонстрировать, что это могло легко быть сделано в стандартизированном наборе веб-технологий. Я намеревался видеть, мог ли я найти, что некоторые библиотеки использовали, и я нашел codeproject статью Sau Fan Lee о его ASCII fying библиотекой.NET.
P.S.: Lucas (см. комментарии) нашел другой статья .
CodeProject
Это, вероятно, самая большая проблема, с которой я сталкиваюсь при разработке подобных программ. Подход, который я выбрал, состоит в том, чтобы понять, что объекту действительно не важно, где он находится в абсолютном выражении. Все, что его волнует, - это то, что вокруг него. В результате объект World
(а я предпочитаю объектный подход синглтону по многим веским причинам, которые вы можете найти в Интернете) поддерживает расположение всех объектов, и они могут спросить мир, что объекты находятся поблизости, где другие объекты находятся по отношению к нему и т. д. Мир
не должен заботиться о содержании Object
; он будет содержать что угодно, и сами объекты
будут определять, как они взаимодействуют друг с другом. События также являются отличным способом обработки взаимодействующих объектов, поскольку они предоставляют миру
средство информировать Объект
о том, что происходит, не заботясь о том, что такое Объект
.
Скрытие информации от Объект
о всех объектах - хорошая идея, и его не следует путать с сокрытием информации о любом объекте
. Думайте о людях - для вас разумно знать и хранить информацию о многих разных людях, хотя вы можете узнать эту информацию, только встретившись с ними или попросив кого-нибудь о них рассказать.
ИЗМЕНИТЬ СНОВА:
Все право. Мне довольно ясно, чего вы действительно хотите, и это множественная отправка - способность полиморфно обрабатывать ситуацию по типам многих параметров для вызова функции, а не только одному. К сожалению, C ++ изначально не поддерживает множественную отправку.
Здесь есть два варианта. Вы можете попытаться воспроизвести множественную отправку с двойной отправкой или шаблоном посетителя, или вы можете использовать dynamic_cast
. Что вы хотите использовать, зависит от обстоятельств. Если у вас есть много разных типов, которые можно использовать, dynamic_cast
, вероятно, будет лучшим подходом. Если у вас их всего несколько, возможно, более уместна двойная отправка или шаблон посетителя.
dynamic_cast
, вероятно, лучший подход. Если у вас их всего несколько, возможно, более уместна двойная отправка или шаблон посетителя. dynamic_cast
, вероятно, лучший подход. Если у вас их всего несколько, возможно, более уместна двойная отправка или шаблон посетителя. Я думаю, вы захотите передать ссылку на Мир игровому объекту. Это довольно простой принцип внедрения зависимостей . Для столкновений Мир может использовать шаблон стратегии , чтобы определить, как взаимодействуют определенные типы объектов.
Это сохраняет знания о различных типах объектов вне первичных объектов и инкапсулирует их в объекты со знаниями, специфичными для взаимодействие.
Объекты должны знать о Мире. они внутри, чтобы запросить столкновение информация и другие объекты.
Короче - нет. Классы, подобные World, могут справиться с большей частью этого, и все, что должен сделать Объект, - это вести себя соответствующим образом, когда Мир сообщает ему, что произошло столкновение.
Иногда вам может потребоваться, чтобы у объекта был какой-то контекст, чтобы другой тип решения. Вы можете передать объект World в этот момент, когда это необходимо. Однако вместо того, чтобы передавать World, лучше передать какой-нибудь более мелкий, более релевантный объект в зависимости от того, какой тип запроса фактически выполняется. Скорее всего, ваш объект World выполняет несколько разных ролей, а объектам нужен только временный доступ к одной или двум из этих ролей. В этом случае хорошо разделить объект World на подобъекты или, если это нецелесообразно,
Недавно мы только что добавили это в нашу систему 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();
};