XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
mitryz

offline
Опыт: 1,225
Активность:
MMVS (mitryz's moving system)

Наработка

Название: mitryz's moving system (mmvs)
Автор: Я
Исполнение: jass
Версия: 0.3
Скачиваем карту-пример, смотрим.

Требования

  • war3 1.24e+
  • JNGP

Описание

Система предоставляет набор функций для управления движением юнитов-снарядов. Движением управляет update-триггер, взаимодействием с другими снарядами управляет proc-триггер. Эти триггеры указываются при инициализации снаряда. Таким образом можно реализовать любую логику движения снаряда в триггере и прикрепить к снаряду этот триггер.
update-триггер имеет доступ к следующим переменным:
» характеристики снарядов
    // снаряд
    unit mmvs_bullet

    // координаты
    real mmvs_pos_x
    real mmvs_pos_y
    real mmvs_pos_z

    // скорость
    real mmvs_spd_x
    real mmvs_spd_y
    real mmvs_spd_z

    // изменение координат
    real mmvs_add_pos_x
    real mmvs_add_pos_y
    real mmvs_add_pos_z

    // изменение скорости
    real mmvs_add_spd_x
    real mmvs_add_spd_y
    real mmvs_add_spd_z

    // ускорение
    real mmvs_acc_x
    real mmvs_acc_y
    real mmvs_acc_z

    // ускорение к цели
    real mmvs_acc

    // масса, радиус, эластичность
    real mmvs_mass
    real mmvs_radius
    real mmvs_elastic

    // цель
    unit mmvs_target
    real mmvs_target_pos_x
    real mmvs_target_pos_y
    real mmvs_target_pos_z
    real mmvs_target_mass
    real mmvs_target_radius
    real mmvs_target_elastic
Кроме этого proc-триггер имеет доступ ещё к следующим переменным:
» характеристики снарядов
    unit mmvs_proc_bullet
    real mmvs_proc_pos_x
    real mmvs_proc_pos_y
    real mmvs_proc_pos_z
    real mmvs_proc_spd_x
    real mmvs_proc_spd_y
    real mmvs_proc_spd_z
    real mmvs_proc_mass
    real mmvs_proc_radius
    real mmvs_proc_elastic

Триггеры, входящие в систему

  • mmvs_trg_def_update_acctarget - update-триггер - движение и ускорение к цели.
  • mmvs_trg_def_update_collideterrain - update-триггер - движение с учётом рельефа и ускорение к цели.
  • mmvs_trg_def_update_collideterrainnotarget - update-триггер - движение с учётом рельефа.
  • mmvs_trg_def_proc_collide - proc-триггер - столкновение с другими снарядами

API

» mmvsInit
// Инициализация системы.
function mmvsInit takes nothing returns nothing
» mmvsIsReady
// Готова ли система?
function mmvsIsReady takes nothing returns boolean
» mmvsEnable
// Включить систему.
function mmvsEnable takes nothing returns nothing
» mmvsDisable
// Отключить систему.
function mmvsDisable takes nothing returns nothing
» mmvsIsEnabled
// Включена ли система?
function mmvsIsEnabled takes nothing returns boolean
» mmvsIsBullet
// Является ли u снарядом?
unction mmvsIsBullet takes unit u returns boolean
» mmvsAddBullet
// Добавить снаряд.

// Характеристики:

unit mmvs_bullet // снаряд
integer mmvs_bullet_unitid // unit-id снаряда (если mmvs_bullet == null)

boolean mmvs_enable // снаряд изначально включён?

real mmvs_pos_x
real mmvs_pos_y
real mmvs_pos_z

real mmvs_spd_x
real mmvs_spd_y
real mmvs_spd_z

real mmvs_acc_x
real mmvs_acc_y
real mmvs_acc_z

real mmvs_acc

real mmvs_mass
real mmvs_radius
real mmvs_elastic

unit mmvs_target // цель

real mmvs_target_pos_x //
real mmvs_target_pos_y // если mmvs_target == null
real mmvs_target_pos_z //

real mmvs_target_mass   //
real mmvs_target_radius // если mmvs_target - не снаряд
real mmvs_target_elastic//

real mmvs_lifetime // время жизни (0 - вечно)
real mmvs_deathtime // время смерти

trigger mmvs_trg_update // update-триггер
trigger mmvs_trg_proc // proc-триггер

function mmvsAddBullet takes nothing returns unit

// Возвращает добавленный снаряд.
// В переменной mmvs_bullet также будет добавленный снаряд.
» mmvsAddBulletEx
// Заполняет характеристики снаряда и вызывает mmvsAddBullet.
function mmvsAddBulletEx takes boolean enable, unit bullet, integer bulletUnitId, real posX, real posY, real posZ, real spdX, real spdY, real spdZ, real accX, real accY, real accZ, real acc, real mass, real radius, real elastic, unit target, real targetPosX, real targetPosY, real targetPosZ, real targetMass, real targetRadius, real targetElastic, real lifeTime, real deathTime, trigger trgUpdate, trigger trgProc returns unit
» mmvsAddBulletSimple
// Добавить "простой" снаряд.
// Простые снаряды быстрее обрабатываются системой.

// Характеристики:

unit mmvs_bullet // снаряд
integer mmvs_bullet_unitid // unit-id снаряда (если mmvs_bullet == null)

boolean mmvs_enable // снаряд изначально включён?

real mmvs_pos_x
real mmvs_pos_y
real mmvs_pos_z

real mmvs_spd_x
real mmvs_spd_y
real mmvs_spd_z

real mmvs_acc_x
real mmvs_acc_y
real mmvs_acc_z

real mmvs_lifetime // время жизни (0 - вечно)
real mmvs_deathtime // время смерти

function mmvsAddBulletSimple takes nothing returns unit

// Возвращает добавленный снаряд.
// В переменной mmvs_bullet также будет добавленный снаряд.
» mmvsAddBulletSimpleEx
// Заполняет характеристики "простого" снаряда и вызывает mmvsAddBulletSimple.
function mmvsAddBulletSimpleEx takes boolean enable, unit bullet, integer bulletUnitId, real posX, real posY, real posZ, real spdX, real spdY, real spdZ, real accX, real accY, real accZ, real lifeTime, real deathTime returns unit
» mmvsEraseBullet
// Удалить снаряд из системы, не убивая его.
function mmvsEraseBullet takes unit bullet returns nothing
» mmvsKillBullet
// Убить снаряд. После mmvs_deathtime снаряд будет удалён функцией RemoveUnit().
function mmvsKillBullet takes unit bullet returns nothing
» mmvsFlush
// Удалить из системы и уничтожить все снаряды.
function mmvsFlush takes nothing returns nothing
» mmvsEnableBullet
// Включить снаряд.
function mmvsEnableBullet takes unit bullet returns nothing
» mmvsDisableBullet
// Отключить снаряд.
function mmvsDisableBullet takes unit bullet returns nothing
» mmvsIsBulletEnabled
// Включён ли снаряд?
function mmvsIsBulletEnabled takes unit bullet returns boolean
» mmvsGetTerrainNormal
// Вычисление нормали к рельефу в точке (x, y).

// результат
real mmvs_res_x
real mmvs_res_y
real mmvs_res_z

function mmvsGetTerrainNormal takes real x, real y returns nothing
» mmvsReflect
// Отражение вектора (vx, vy, vz) по нормали (nx, ny, nz).

// результат
real mmvs_res_x
real mmvs_res_y
real mmvs_res_z

function mmvsReflect takes real vx, real vy, real vz, real nx, real ny, real nz returns nothing
» mmvsProject
// Проекция вектора (vx, vy, vz) на нормаль (nx, ny, nz).

// результат
real mmvs_res_x
real mmvs_res_y
real mmvs_res_z

function mmvsProject takes real vx, real vy, real vz, real nx, real ny, real nz returns nothing
» mmvsUpdateMove
// Действие update-триггеров системы.
// Перемещение с учётом ускорения.
function mmvsUpdateMove takes nothing returns nothing
» mmvsUpdateAccTarget
// Действие update-триггеров системы.
// Ускорение к цели mmvs_target.
function mmvsUpdateAccTarget takes nothing returns nothing
» mmvsUpdateCollideTerrain
// Действие update-триггеров системы.
// Расчёт столкновения с рельефом.
function mmvsUpdateCollideTerrain takes nothing returns nothing
» mmvsProcCollide
// Действие proc-триггеров системы.
// Расчёт столкновений с другими снарядами.
function mmvsProcCollide takes nothing returns nothing

Последовательность действий

  1. Вызов mmvsInit - инициализация.
  2. Вызов mmvsEnable - включить систему.
  3. Добавление снарядов при помощи mmvsAddBullet[Ex] и mmvsAddBulletSimple[Ex].
  4. Возможно, удаление снарядов (функции mmvsKillBullet, mmvsEraseBullet, mmvsFlush).

Импорт в карту

Скопируйте в нестандартный код своей карты содержимое файла из архива mmvs0_3.rar.
Прикрепленные файлы
Тип файла: w3x mmvs0_3_example.w3x (37.0 Кбайт, 67 просмотров )
Тип файла: rar mmvs0_3.rar (3.9 Кбайт, 40 просмотров )

Отредактировано mitryz, 24.08.2010 в 14:47.
Старый 14.08.2010, 20:37
xpadd91

offline
Опыт: 10,739
Активность:
mitryz:
50 двигаемых объектах
у меня 250 двигатель спелл
Старый 18.08.2010, 18:47
Doc

offline
Опыт: 63,163
Активность:
Почему бы не использовать структуры, чтобы обходиться без хеша, м?
Doc добавил:
А так офигенно, снаряды классно отталкиваются, только почему то не замедляются, или это нстраиваемо?
Старый 18.08.2010, 20:21
mitryz

offline
Опыт: 1,225
Активность:
xpadd91:
у меня 250 двигатель спелл
А у тебя снаряды от земли отталкиваются?
Doc:
А так офигенно, снаряды классно отталкиваются, только почему то не замедляются, или это нстраиваемо?
Т.к. снаряды двигает триггер, то можно реализовать любую логику движения. Но из-за этого ухудшается производительность.
mitryz добавил:
Почему бы не использовать структуры, чтобы обходиться без хеша, м?
Потому что в jass'е нет структур)
Но ассоциативные массивы реализовать могу.
Старый 19.08.2010, 23:19
Doc

offline
Опыт: 63,163
Активность:
ну просто acc уменьшать =О и все.
mitryz, ну офк нет, но вжасс эмулирует их этими же ассоциативными массивами. Предлагаю еще все глобалки перенести непосредственно в код, ибо это глупо держать их в редакторе переменных.
Старый 19.08.2010, 23:44
mitryz

offline
Опыт: 1,225
Активность:
я это писал в обычном WE, а там глобалки в код нельзя
mitryz добавил:
ну просто acc уменьшать =О и все
посмотри код. Там снаряд ловца духов так и летает. Только он ешё гоняется за снарядом баллисты. А производительность ухудшается из-за того, что вызывается триггер.
Старый 20.08.2010, 00:04
Doc

offline
Опыт: 63,163
Активность:
Все должно работать прекрасно, если что, смотри тему.
Старый 20.08.2010, 10:15
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Внутри периодической функции mmvs_proc незачем проверку:
if not udg__mmvs_ready then
    return
endif
Т.к. вначале она отключена (триггер отключен), а чтобы его включить udg__mmvs_ready проверяется..
чтобы наверняка он был отключен еще поменяй местами строки:
call TriggerAddAction(udg__mmvs_proc, function mmvs_proc)
call DisableTrigger(udg__mmvs_proc)
Alex_Hell добавил:
Мне кажется лучше создать больше функций запуска снарядов, я вот вижу функцию mmvsBulletAdd и в ней описание переменных, которые нужно задать, причем со всякими ЕСЛИ (если udg_mmvs_target == null, если udg_mmvs_bullet == null)... и не очень понятно что и когда заполнять, а так создал функцию с набором парамеетров определенных, и знаешь что все нужно заполнить, иначе вызывай другую функцию для других действий, чтобы не было пустых параметров и ЕСЛИ..
Alex_Hell добавил:
Кстати, зачем
call UnitAddAbility(udg_mmvs_bullet, 'Amrf')
call UnitRemoveAbility(udg_mmvs_bullet, 'Amrf')
и че за рав-код
Alex_Hell добавил:
функция mmvsBulletKill только удаляет снаряд, а из отряда udg__mmvs_bullets не удаляет, почему? непорядок.. по-моему должно быть так:
  • mmvsBulletErase - удаляет только из системы (если например юнит применил скилл движения вперед - стал снарядом, а потом он закончился - удалять юнита не надо)
  • mmvsBulletKill - удаляет и из системы и самого юнита - если он был создан только на время движения
Старый 20.08.2010, 16:30
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
а у меня не тормозит и при 200
Артте добавил:
я из описания так и не понял чо она делает
Старый 20.08.2010, 17:22
Doc

offline
Опыт: 63,163
Активность:
Кстати, зачем
чтобы высоту можно было менять же.
Старый 20.08.2010, 18:25
mitryz

offline
Опыт: 1,225
Активность:
функция mmvsBulletKill только удаляет снаряд, а из отряда udg__mmvs_bullets не удаляет, почему?
Потому что в функции mmvs_proc мёртвые снаряды удаляются, после udg_mmvs_death_time после смерти.
а у меня не тормозит и при 200
Посмотрел. На моём компе тормозит.
Лучше протестируй мою систему у себя и скажи, при скольки объектах начинает тормозить.
mitryz добавил:
Мне кажется лучше создать больше функций запуска снарядов
Согласен.
mitryz добавил:
Переписал в JNGP. Сначала всё работало нормально, но сейчас вдруг не могу запустить карту =(
mitryz добавил:
Нашёл ошибку (вместо null написал 0).
Старый 22.08.2010, 12:49
xpadd91

offline
Опыт: 10,739
Активность:
mitryz:
А у тебя снаряды от земли отталкиваются?
увеличает хватит 409 это красная ракета
Старый 22.08.2010, 13:53
mitryz

offline
Опыт: 1,225
Активность:
увеличает хватит 409 это красная ракета
... что?
Можно по-русски
Старый 22.08.2010, 14:52
mitryz

offline
Опыт: 1,225
Активность:
Версия 0.2

Я переписал в JNGP. Практически переписал всё с нуля. Улучшил физику. Добавил взаимодействие снарядов друг с другом.

Отредактировано mitryz, 23.08.2010 в 15:18.
Старый 22.08.2010, 20:54
mitryz

offline
Опыт: 1,225
Активность:
Версия 0.3

Готова новая версия. Небольшие доработки, улучшена физика столкновения снарядов + новые эффекты в карте-примере.
Старый 24.08.2010, 14:35
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:17.