Рейтинг - 5.0 (4)

Работа с массивом следов пуль в plugin-sdk.

Модуль CBulletTraces описывает классы, отвечающие за следы пуль. В этой статье разберёмся, как работать с массивом следов пуль.

Подключение файлов.

Для начала, подключаем хедер этого модуля:

#include "game_sa\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-го элемента

Для удобства, мы можем создать переменную, которая будет хранить указатель на нужный нам элемент:

CBulletTrace *trace = CBulletTraces::aTraces[i]; // теперь мы можем обращаться к i-ому элементу массива пулей через переменную trace 
if (trace->m_bExists) // проверяем, существует ли эта пуля

В файле "CBulletTraces.h" присутствует переменная MAX_NUM_BULLETTRACES ( по умолчанию, равна 16 ). Рассмотрим 2 варианта перебора массива пулей.

1-ый - с использованием переменной-счётчика i.

#include "plugin.h"
#include "game_sa\CBulletTraces.h"

using namespace plugin;

class TestPlugin {
public:
 // Функция, которая выполняется при загрузке .asi-плагина.
 TestPlugin() {
 // Регистрируем нашу функцию
 Events::gameProcessEvent += [] {
 for (int i = 0; i < MAX_NUM_BULLETTRACES; i++) { // Перебираем 0-15 (MAX_NUM_BULLETTRACES = 16)
 // Если след пули существует и его радиус меньше 0,5
 if (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;

Второй - с использованием в роли счётчика переменной "trace".

#include "plugin.h"
#include "game_sa\CBulletTraces.h"

using namespace plugin;

class TestPlugin {
public:
 // Функция, которая выполняется при загрузке .asi-плагина.
 TestPlugin() {
 // Регистрируем нашу функцию
 Events::gameProcessEvent += [] {
 // Перебираем элементы массива, пока элемент не будет равен 17-ому (CBulletTraces::aTraces[MAX_NUM_BULLETTRACES])
 for (CBulletTrace *trace = CBulletTraces::aTraces; trace < &CBulletTraces::aTraces[MAX_NUM_BULLETTRACES]; trace++) {
 // Если след пули существует и его радиус меньше 0,5
 if (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, первый элемент массива

Теги: object array, plugin sdk, массив объектов

KiLLeR96   (29.09.13 22:42)
Что данный плагин делает?

DK22Pac   (29.09.13 22:43)
KiLLeR96, в комментариях же написано.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какие моды Вы хотите видеть на сайте?
Всего ответов: 5
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Реклама