GameMaker-подобная функциональность в C ++ - PullRequest
1 голос
/ 28 октября 2011

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

  • Объекты / классы

В Game Maker был список «Объектов», которые вы могли бы создать, которые по сути представляли собой просто разные классы, все производные оттот же базовый класс (сейчас я назову его GameObject) и системная функция с именем instance_create, которая принимает тип объекта в качестве параметра.В c ++ это выглядело бы примерно так (хотя с точки зрения синтеза очень некорректно):

class MyGameObject : GameObject
{
    //...
}
GameObject instance_create(class objecttype)
{
    objecttype newinstance = new objecttype();
    return newinstance
}
GameObject* gameobjectinstance = instance_create(MyGameObject);

Как бы я это реализовал?

  • системные переменные / функции

В Game Maker были системные переменные и функции, к которым можно было получить доступ откуда угодно.Период.В любом месте.Я думаю, что глобальные, но я знаю, что это плохой дизайн.Я имею в виду наличие глобального класса и переменных / функций как статических, но тогда их нельзя изменить.Как мне это сделать?

  • var

В Game Maker был только один тип данных - var.Это может быть строка, целое число, десятичное число, что угодно.И были системные функции для преобразования между ними.

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

Ответы [ 2 ]

1 голос
/ 23 января 2012

Game Maker позволяет нам контролировать функциональность игры через «объекты», каждый из которых состоит из «событий», которые запускаются в определенное время во время игры. Внутри событий есть «действия». Во-первых, стоит отметить, что сравнивать разработку Game Maker с C ++ - это все равно, что сравнивать мел и сыр. Тем не менее, теоретически, я думаю, вы могли бы отразить функциональность GM (хотя и очень неэффективно) в C ++ следующим образом:

Базовый класс объекта может выглядеть примерно так:

class CObjectBase
{
public:
    CGameSprite* sprite;
    int          x, y;
    ...

    virtual void onEventCreate( void ) {};
    virtual void onEventDestroy( void ) {};
    ...
    virtual void onEventKeyPressedUp( void ) {};
    virtual void onEventKeyPressed...
    ...
    ... (there are lots of these)

    // The draw event in GM (from memory) had in-built functionality:
    virtual void onEventDraw( void ) 
    {
        CGameEngine::getSingleton()->DrawSpriteAtLocation( sprite, x, y );
    }
};

Вы бы унаследовали этот класс и переопределили функции («события»), которые относятся к вашему объекту (операторы, составляющие эти функции, являются вашими «действиями»). Тогда будет какой-то класс синглтонов менеджера экземпляров объекта, который содержит список всех экземпляров объекта в текущей "комнате" и циклически перебирает каждый кадр (и обрабатывает экземпляры), вызывая соответствующие события, вызывая их соответствующие функции.

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

Что касается вашего запроса, относящегося к одному типу 'var', как уже было сказано, это скорее характеристика сценариев, а не C ++. Это доказывает, что Game Maker не может быть смоделирован одним C ++.

1 голос
/ 28 октября 2011

Использование шаблона.

template<typename T> GameObject* instance_create()
{
    return new T;
}
GameObject* gameobjectinstance = instance_create<MyGameObject>();

Однако указанный вами дизайн весьма сомнителен (в лучшем случае) и определенно не подходит для C ++.Вы должны стремиться реализовать хорошо спроектированную и подходящую для языка систему, а не заново создавать систему из прошлого.

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

Вы бы лучше всего подходилипросто вывод языка сценариев, такого как Lua, и написание только необходимых высокопроизводительных компонентов на C ++.

...