У меня слишком много информации для работы с, поэтому пока я отвечу на этот вопрос, пока не смогу разобраться во всем и решить окончательную реализацию! Спасибо тонну gf и Simon Buchan. Хотелось бы, чтобы я согласился с вашими ответами, так как они оба являются определенными возможностями!Выполнение этой задачи на C++; Миграция из AS3.0
Дополнительно/переработан Концептуальная информация по предложению:
Что я стремлюсь сделать;
Я делаю игру. В этой игре каждый используемый объект является экземпляром класса DOBJ. Класс TUR расширяет класс DOBJ. Класс SHO расширяет класс TUR.
Каждый класс TUR имеет массив SHO, хранящихся в массиве SHOARR. Каждому экземпляру SHO должен быть предоставлен набор инструкций.
Я знаю, что мог бы сделать 1000 различных классов SHO, которые имеют свои инструкции, установленные во время строительства.
Однако, учитывая, что у меня будет так много разных действующих экземпляров SHO, меня интересовал другой способ передачи набора инструкций. Благодаря конструкции SHO был бы идеалом.
Инструкции, которые я пытаюсь передать каждому SHO, являются простыми, если заявления;
if(frame > 64) { rotation += 4; };
if(state == 0 && frame < 32) { xs = 12; ys = 12; state = 1; };
Оригинальный вопрос
Миграция из ActionScript3.0 на C++, оказывается испытание на самом деле. Спасибо тем, кто ответил на мои вопросы до сих пор, а также тем, кто открыл стек переполнения в первую очередь. Onto вопрос ... (TL; DR вблизи дна, чтобы получить прямо на вопрос)
Я пытающегося применить ту же логику, что я мог бы применить в AS3.0 к моему проекту в C++ и это просто не очень хорошо.
В AS3.0 Я привык к удалению любого типа данных в массив. Это сделало вещи довольно простыми. Теперь, когда я столкнулся с разработчиком C++, я понял, что больше не могу этого сделать.
Так что теперь я застрял в этой проблеме переписывания маленькой системы искусственного интеллекта на новом языке, где место для движения системы даже не совместимо!
Вот пример фрагмента кода, который я писал в AS3.0;
AI[NUM][1](OBJ, AI[NUM][2], AI[NUM][3]);
А.И. быть массивом, NUM представляет собой целое число, OBJ, являющийся экземпляром класса.
Эта линия, очевидно, называется функцией в второго элемента первого массива в основном массиве с аргументами будучи классом, в котором для выполнения функции на, что было в трети элемент первого массива основного массива, а также четвертый элемент.
В этом случае;
AI[NUM][1]
будет функция AI[NUM][2]
будет переменная AI[NUM][3]
бы номер
Вообще, мой ИИ был запущен на вызов функции, чтобы изменить или сравнить переменную с номером.
Примером может быть;
CompareST(someObject, "x", 500);
и возвращает истину, если переменная х SomeObject была меньше (ST) 500.
ИИ массив сам был просто заполнен с массивами вызовов, подобных этим.
Совершенно новый для C++ Я понятия не имел, как это сделать, поэтому я немного искал и читал множество разных сайтов и пришел к выводу, что я должен искать указатели на функции.
Однако, прочитав немного в них, я пришел к выводу, что это не поможет мне реализовать мою цель. Хотя это помогло мне вызвать такие функции, как я хотел их назвать, это не помогает мне складывать разные типы данных в один массив массивов.
TL; DR
EDIT ++:
Что мне нужно для каждого объекта представляет собой набор инструкций для проверки каждого кадра. Однако для каждого экземпляра класса инструкции должны быть разными.
Я планирую иметь много разных экземпляров, поэтому создание класса для каждого из них необоснованно.
Таким образом, мне понадобился способ передать набор инструкций каждому из них через его конструктор и прочитать + выполнить их в любое время, когда вызывается их функция think().
Моей конечной целью (кроме того, чтобы узнать об этом лучше), было бы иметь множество вызовов функций, например;
A[n][0](O, A[n][1], A[n][2]);
Где; O
является экземпляром, который функция изменяет A[n][0]
является функцией (равенство или сравнение) A[n][1]
- это переменная, например; «x», O["x"]
(или указатель на эту переменную в случае C++) A[n][2]
- это значение для изменения переменной или сравнения ее с.
И я не уверен, как бы переписать это на C++ или изменить его для работы по-другому.
Aftermath/Дополнительная информация
То, что я на самом деле стремится сделать, это быть в состоянии дать объект, набор инструкций, в момент его создания, с помощью конструктора. Например, при создании дать объектной инструкции подождать 64 кадра, а затем повернуть в противоположном направлении, было бы что-то вроде этого;
t.AI = [ [ 1, AIF.CompareET, "STATE", 0, AIF.CompareGT, "FRAME", 64, 0, AIF.EqualityAT, "baseRotation", 180, AIF.EqualityET, "STATE", 1 ] ];
В псевдокоде;
(1 в массиве обозначает, как читать остальную часть массива, в этом случае все до нечетного 0 [тот, который приходит после 64], является сравнением. Если кто-либо из них не работает, что-либо после 0 не будет рассматриваться)
Сравнить STATE равно (ET) 0, если верно
Сравнить КАДР является greather чем (GT) 64, если это правда
Добавить 180 в (AT) baseRotation, установленное состояние, равное 1
Извините, что так получилось очень долго. Надеюсь, это понятно, и я не прошу что-то глупость объяснить.
Я думаю, вам будет лучше, если вы сосредоточитесь на своих требованиях к этой функциональности (т. Е. Концептуально). Попытка напрямую перевести это, скорее всего, плохая идея. –
Я знаю, чего я пытаюсь выполнить, я просто не знаю, как это сделать на C++; поэтому я попытался использовать AS3.0, чтобы выразить свои потребности так, как я уже знал. Что мне нужно для каждого объекта - это набор инструкций для каждого кадра. Однако для каждого экземпляра класса инструкции должны быть разными. Я планирую иметь много разных экземпляров, поэтому создание класса для каждого из них необоснованно. Таким образом, мне нужен был способ передать набор инструкций каждому из них через его конструктор и прочитать + выполнить их в любое время, когда вызывается их функция think(). – user247334
Является ли производительность важной проблемой? Вы передаете только интегральные значения в списке инструкций? Что мешает вам использовать функциональные возможности, используя наследование? –