GameMaker-подібна функціональність у C ++

Коли я був молодшим, я багато використовував інструмент, названий 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 ++ може створювати типи об'єктів під час виконання, так як я можу це зробити?

1
це повинно бути C ++? Lua, ймовірно, буде краще підходити.
додано Автор Brian Driscoll, джерело

2 Відповіді

Використання шаблону.

template GameObject* instance_create()
{
    return new T;
}
GameObject* gameobjectinstance = instance_create();

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

Особливо я думаю, що оскільки ви згадуєте інтерпретацію сценаріїв під час виконання, то насправді класи класу GameMaker та C ++ не мають нічого спільного. І ви безумовно не можете створити класи C ++ під час виконання, а також не можете передавати типи навколо під час виконання, а також не можете створювати шаблони під час виконання.

Ви б найкраще підходили для простого написання скриптової мови, наприклад, Lua, і написання лише необхідних високопродуктивних компонентів у C ++.

1
додано
@Keelx: Поки ви визначаєте "тип", що означає щось інше, ніж клас С ++, ніщо не заважає вам створювати типи за допомогою сценарію. Вам просто доведеться використовувати механізм, що надається або іншою мовою або написаний сам.
додано Автор Puppy, джерело
Спасибі, і так, я знаю, що цей дизайн "сумнівний". Я, можливо, не був зрозумілий, але я фактично не збираюся використовувати цей дизайн, я просто цікавився цим. Але створення типів об'єктів за допомогою скриптів - це те, що я можу робити в майбутньому.
додано Автор Keelx, джерело

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
додано
Пройшло багато часу, але -1 для Singleton.
додано Автор Puppy, джерело
Виступаючи за одну з найбільш постійно зневажливих "моделей", що коли-небудь розроблялися, звичайно, достатньо для -1.
додано Автор Puppy, джерело
Вибачте, але цього недостатньо для обґрунтування -1 IMO. Чи є щось неправильне з відповіддю? (який, я можу додати, був дійсно лише для ілюстративних цілей)
додано Автор Alex Z, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147