Модуль CBulletTraces описывает классы, отвечающие за следы пуль. В этой статье разберёмся, как работать с массивом следов пуль.
Подключение файлов.
Для начала, подключаем хедер этого модуля:
#include"CBulletTraces.h"
Теперь мы можем работать с классами CBulletTrace и CBulletTraces. Если мы заглянем в файл "CBulletTraces.h", то увидим, что класс "CBulletTraces" содержит в себе указатель на первый объект "CBulletTrace", а всего — 16 таких объектов. Обращение к какому-либо объекту из этого массива выглядит так:
CBulletTraces::aTraces[0] // (или CBulletTraces::aTraces) - 1-ый элемент CBulletTraces::aTraces[5] // шестой элемент CBulletTraces::aTraces[9].m_dwCreationTime // время создания 10-го элемента CBulletTraces::aTraces[i].m_bExists // статус создания i-го элемента
Для удобства мы можем создать переменную, которая будет хранить указатель на нужный нам элемент:
// теперь мы можем обращаться к i-ому элементу массива пулей через переменную traceCBulletTrace *trace = CBulletTraces::aTraces[i]; // проверяем, существует ли эта пуляif (trace->m_bExists)
В файле "CBulletTraces.h" присутствует переменная MAX_NUM_BULLETTRACES (по умолчанию равна 16). Рассмотрим 2 варианта перебора массива пулей.
1. С использованием переменной-счётчика i.
#include"plugin.h"#include"CBulletTraces.h"usingnamespace plugin;classTestPlugin {public: // Функция, которая выполняется при загрузке .asi-плагина.TestPlugin() { // Регистрируем нашу функцию Events::gameProcessEvent += [] {for (int i =0; i < MAX_NUM_BULLETTRACES; i++) { // Перебираем 0-15 (MAX_NUM_BULLETTRACES = 16) // Если след пули существует и его радиус меньше 0,5if (CBulletTraces::aTraces[i].m_bExists && CBulletTraces::aTraces[i].m_fRadius <0.5f) { // Прибавляем 0,01 к радиусу CBulletTraces::aTraces[i].m_fRadius +=0.01f; // Если время существования следа пули меньше 3 мс - ставим в 3 мс.if (CBulletTraces::aTraces[i].m_dwLifeTime <3000) CBulletTraces::aTraces[i].m_dwLifeTime =3000; // Если прозрачность меньше 255 - ставим в 255.if (CBulletTraces::aTraces[i].m_nTransparency !=255) CBulletTraces::aTraces[i].m_nTransparency =255; } } }; }} test;
2. С использованием в роли счётчика переменной trace
#include"plugin.h"#include"game_sa\CBulletTraces.h"usingnamespace plugin;classTestPlugin {public: // Функция, которая выполняется при загрузке .asi-плагина.TestPlugin() { // Регистрируем нашу функцию Events::gameProcessEvent += [] { // Перебираем элементы массива, пока элемент не будет равен 17-ому (CBulletTraces::aTraces[MAX_NUM_BULLETTRACES])
for (CBulletTrace *trace = CBulletTraces::aTraces; trace < &CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]; trace++) {
// Если след пули существует и его радиус меньше 0,5if (trace->m_bExists &&trace->m_fRadius <0.5f) { // Прибавляем 0,01 к радиусуtrace->m_fRadius +=0.01f; // Если время существования следа пули меньше 3 мс - ставим в 3 мс.if (trace->m_dwLifeTime <3000)trace->m_dwLifeTime =3000; // Если прозрачность меньше 255 - ставим в 255.if (trace->m_nTransparency !=255)trace->m_nTransparency =255; } } }; }} test;
Второй вариант является более "компактным". Обратим внимание на запись
CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]
Так мы получаем 17-ый элемент, который фактически не существует. Но с помощью такой записи мы можем определить, где находится последний элемент массива. Надо также отметить, что в C++ запись
CBulletTraces::aTraces // без указания индекса
Равносильна записи
CBulletTraces::aTraces[0] // индекс - 0, первый элемент массива