У меня слишком много информации, чтобы работать с , поэтому сейчас я рассмотрю вопрос, на который дан ответ, пока не смогу разобраться во всем и принять решение об окончательной реализации! Спасибо большое GF и Саймон Бьюкен . Хотел бы я принять оба ваших ответа, так как они оба являются определенными возможностями!
Дополнительная / пересмотренная концептуальная информация в соответствии с предложением:
Что я собираюсь сделать;
Я создаю игру. В этой игре каждый используемый объект является экземпляром класса DOBJ. Класс TUR расширяет класс DOBJ. Класс SHO расширяет класс TUR.
Каждый класс TUR имеет массив SHO, хранящийся в его массиве SHOARR. Каждому экземпляру SHO должен быть присвоен набор инструкций.
Я точно знаю, что мог бы создать тысячи различных классов SHO, инструкции которых были заданы во время построения.
Однако, учитывая, что у меня будет так много разных действующих экземпляров SHO, меня заинтересовал другой способ передачи набора инструкций. Через конструкцию ШО будет идеальным.
Инструкции, которые я пытаюсь передать каждому SHO, являются простыми операторами if;
if(frame > 64) { rotation += 4; };<br>
if(state == 0 && frame < 32) { xs = 12; ys = 12; state = 1; };
Оригинальный вопрос
Миграция с ActionScript3.0 на C ++ действительно оказывается пробной. Спасибо тем, кто уже ответил на мои вопросы, а также тем, кто открыл стек переполнение в первую очередь. На вопрос ... (TL; DR возле дна, чтобы перейти непосредственно к вопросу)
Я пытаюсь применить ту же логику, что и в AS3.0, к своему проекту в C ++, и это не очень хорошо.
В AS3.0 я привык подбирать любой тип данных в массив. Это сделало вещи довольно простыми. Теперь, когда я столкнулся с разработчиком C ++, я понял, что больше не могу этого делать.
Так что теперь я застрял с проблемой переписывания маленькой системы ИИ на новом языке, где движущая точка системы даже не совместима!
Вот пример фрагмента кода, который я писал в AS3.0;
AI[NUM][1]( OBJ, AI[NUM][2], AI[NUM][3] );
AI - массив, NUM - целое число, OBJ - экземпляр класса.
Эта строка, очевидно, вызвала функцию во втором элементе первого массива в основном массиве с аргументами , являющимися классом, в котором выполнить функцию на , независимо от того, что было в третьем элементе первого массива основного массива , а также на четвертом элементе .
В данном случае;
AI[NUM][1]
будет функцией
AI[NUM][2]
будет переменной
AI[NUM][3]
будет числом
Обычно мой ИИ запускался при вызове функции для изменения или сравнения переменной с числом.
Примером будет;
CompareST( someObject, "x", 500 );
и верните true, если переменная someObject x была меньше (ST) 500.
Сам массив AI был просто заполнен массивами вызовов, подобных этому.
Совершенно новичок в 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 ++ или изменить его для работы по-другому.
Последствия / Дополнительная информация
Что я на самом деле намереваюсь сделать, так это дать объекту набор инструкций во время его создания через конструктор. Например, при создании дать объекту инструкцию ждать 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, если true
Сравните FRAME больше, чем (GT) 64, если true
Добавьте 180 к (AT) baseRotation, установите STATE равным 1
Извините, что это оказалось очень долго. Надеюсь, это понятно, и я не прошу чего-то глупо трудного объяснить.