Форумы на Наша-Life
Home user CP  
Календарь событий Найти других пользователей Часто задаваемые Вопросы Поиск  
Автор
Тема
Создать Новую Тему    Ответить
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Становимся джедаями, или гравипушка, привязанная к клавише, с регулируемой мощностью
Сообщение #873041
Вообще, я делаю Star Wars-мод, и самое сложное для меня - это как раз кодинг Особенно сложный, связаный с физикой.

Вообщем, что надо сделать: при нажатии на определенную клавишу запускается функция, которая в зависимости от времени нажатия увеличивает силу отталкивания обьекта. При удерживании клавиши передвижение и перемещение обзора игрока блокируются. При отпускании обьект, на который направлен прицел, отправляется в полет с N-ной силой

Алогоритм:

1) создаем в меню настройки клавиатуры новый пункт (файлы config_default.cfg, kb_act.lst) - легко
2) Идем в client.cpp, и дописываем дополнительную команду static ConCommand Force_pull("Force_pull", <Название процедуры>,"<описание процедуры>" ) - тоже реализуемо.
3) Описываем процедуру Force_pull, только хз где конкретно, вроде в Server\hl2\hl2_player.cpp, не забывая указать в hl2_player.h ссылку на нее. - вот это уже трудно

Сама процедура, тоже алгоритм:

Цикл
Если клавиша нажата и мы смотрим на физический обьект, то:
- Заблокировать передвижение и перемещение обзора игрока (кстати, какая команда за это отвечает? )
- Установить определенную анимацию для игрока (в моде вид будет от 3-го лица)
- Увеличить силу удара
- Воспроизвести звук
- Ждать Х секунд

иначе
- прервать цикл
- Воспроизвести вторую анимацию для игрока
- Воспроизвести 2-й звук
- Запульнуть обьект, на который смотрел игрок с N-ной силой
- Вернуть игроку контроль над персонажем

Вообщем, помогите кому не лень пожалуйста, а то я так за неделю не сделаю сам ничего Или хотя бы оцените алгоритм, и помогите с определение его местоположения Так-то можно спереть от гравипушки много чего )
Не существует границ, есть лишь препятствия

Поправил Breever 18-06-2009 в 12:02

Old Post 18-06-2009 11:31
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #873068
Во-первых стот понимать, то все уже изобретено до нас, стоит лишь све это найти и повернуть себе во благо. Во-вторых я уже давно обрисовал некую общую структуру, которая подходит в 99% к процессу кодинга под Сурс (https://bbs.nashalife.ru/showthread...2441#post752441). Обрати особое внимание на первые 2 пункта. И броски объектов, и фриз управнения, и анимации и звуки - все это есть в исходниках, просто нужно их найти. Но нужна сущая малость - навыки в программировании. Если их нет, то твой пост сводится к "напишите за меня это и это". Вряд-ли кто-нибудь на это согласится. Если они есть, то исходники тебе в руки - они главное, достоверное, и почти всегда единственное место, откуда можно почерпнуть практически все об Сурсе.
Old Post 18-06-2009 12:23
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873075
Я конечно это понимаю, в принципе, так и анализируя, я и хочу сделать все, что надо.

Никого я не призываю писать за меня что-то, только прошу прокомментировать алгоритм и дать советы (мол сначала используй трассировку, потом обрабатывай результаты, потом запускай объект)

Просто если алгоритм неправильный, то над его реализацией можно и месяц пыхтеть - ничего не получится
Не существует границ, есть лишь препятствия

Поправил Breever 18-06-2009 в 12:44

Old Post 18-06-2009 12:33
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #873093
Вот пример тебе - нужен, например ДоФ шейдер. Пишем алгоритм:

- оттрасировать точку, в которую смотрит плеер
- передать длинну трейс-лайна в шейдер
- для каждой точки экрана узнать ее глубину, и в зависимости от результата сравнения с длинной трейс-лайна как-то блурить эту точку.

Все вроде правильно. Алгоритм правильный....

Но есть одно очень большое НО! Алгоритм правильным будет оставатся ровно до того момента, пока ты не начнешь его реализовывать. Ибо когда ты начнешь все это делать, то увидишь, что както странно начинают выделятся границы объектов с большой разницей глубины. Бамц! Алгоритм уже не настолько правильный, приходится переделывать. Переделал... Снова Бамц! Оказывается у нас нет на руках полного depth-range! Опять алгоритм не правильный! Опять переделывать, причем координальным образом. И т.д.... И это не синтетика, это я тебе из реального опыта рассказываю.

Это я все к тому, что пока не возьмешься, не узнаешь, правилен твой алгоритм или нет. Пока у тебя вроде все стройно и хорошо выглядит, дай бог чтобы так и осталось. Хотя Интересно кого ты будешь толкать, если цель, за время твоего накопления смоется )) Вообще
этот момент обдумывать нужно, здесь больше бы подошел способ поиска всех физ объектов в конусе перед игроком, и применение к ним силы, пропорциональной расстоянию игрока до них. Во-вторых при воздействии на НПС прийдется либо их насмерь убивать (и толкать рагдолл), либо не трогать вообще. И т.д. и т.п.
Предварительный план - это замечательно, но потрудись пробить почву перед построением планов.
Old Post 18-06-2009 13:14
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873106
Ну уже прописал в скриптах, осталось только написать 2 процедурки непосредственно толкания.
Про цель смоется - это интересно, надо подумать Ну видимо будет просто толчек в никуда.

Кстати самый главный вопрос: Возможно ли реализовать, чтобы враги после того, как схватят толчек, превращались в рагдоллы, но затем вставали обратно, если еще живы (как это есть в Dark Messiah)
Убить-то не трудно, а вот воскрестить из рагдолла, это уже хуже, да и примеров этому в исходниках вроде нету.
Не существует границ, есть лишь препятствия
Old Post 18-06-2009 13:29
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #873109
Конечно возможно. Возможно вообще все! Были бы навыки время и желание. В теории это выглядит примерно так:

- регдоллим НПС, он улетает куда-то, с раскинутыми ручками-ножками
- лежит так недолго
- потом мы начинаем блендить регдолл до начального состояния анимации подьема с земли.
- как только доблендили, запускаем анимацию подьема.

Опять-же алгоритм вроде простой, пока его реализовывать не начнешь.
Old Post 18-06-2009 13:41
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
 
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #873190
Хмм. Мне одному показалось, что алгоритм функции включает цикл в себя? о_О
Breever, ты так добьёшься только повисновения игры) Потому что во время цикла игра будет стоять и не сможет отреагировать ни на действия игрока, ни на что вообще) Код этого цикла тебе придётся приткнуть в какое-то другое место. В Think-функцию оружия, например.
Old Post 18-06-2009 15:38
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873248
Почти исправил сам, уже полтора часа парюсь над этой фигней Оо

Breever добавил 18-06-2009 в 17:41:46:
Ну вообщем, во всем разобрался, просто я вообще на С++ мало программировал, хорошо шарю только в делфи. Но тем не менее, остается одна противная ошибка:
code:
Compiling...
client.cpp
.\client.cpp(655) : error C3861: 'LaunchObject': identifier not found

Здесь, как я понял, один из аргументов функции не впорядке. Вообще же, это стандартная функция от гравипушки, заголовочный файл которой я подключил нормально.

Сама моя функция выглядит следующим образом:
code:
// ======== FORCE_PULL ========
void CC_Force_pull( void )
{
CBasePlayer *pPlayer = UTIL_PlayerByIndex(1); // Инициализируем игрока, без этой строки pPlayer не робит Оо
PLAYER_ANIM playeranim = PLAYER_ATTACK1; // ставим любую анимку
Vector vstart = pPlayer->Weapon_ShootPosition(); // Начало линии трассировки
Vector vend; // конец линии трассировки

QAngle ang = pPlayer->EyeAngles(); // получаем углы зрения
AngleVectors (ang, &vend); // Конец линии трассировки (угол в вектор)

trace_t tr;
UTIL_TraceLine( vstart, vend, MASK_SHOT, pPlayer, COLLISION_GROUP_NONE, &tr);
// трассируем из start в end, по маске выстрела, игнорируя себя, без коллизий, записываем в переменную tr

if (tr.fraction != 1.0) //проверяем, достигла ли трассировка конца
{
LaunchObject( vend, 2000.0 ); // пуляем обьект с силой 2000
}
return;
}
static ConCommand Force_Pull ("Force_pull", CC_Force_pull, "Force pull jedi ability");


Тут уж вообще не понимаю в чем дело и что не нравится компилятору Оо Помогите отловить ошибку?
Не существует границ, есть лишь препятствия

Поправил Breever 18-06-2009 в 17:11

Old Post 18-06-2009 16:49
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #873348
Во-первых LaunchObject не член глобального пространства имен, на это компилятор и жалуется. LaunchObject - это член класса CWeaponPhysCannon. Что это обозначает, поситай в любой книжке по ООП и С++

Во-вторых, (но это уже не существенно из-за сказаного выше) LaunchObject запускает объект, прикрепленный к m_grabController`у, который опять-же обьявлен в CWeaponPhysCannon.

Копай глубже.
Old Post 18-06-2009 18:38
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873511
Ясно, это оказывается методы класса, я чет не обратил внимания и использовал их как просто функции.

А каким тогда образом оформить ссылку на класс?
Или же, если нужно неприменно сделать свой на основе CWeaponPhysCannon, то каким образом? Он ведь не найдет базовый класс, если просто написать "class CForce_pull : public CWeaponPhysCannon;"

P.S. В инете прочитал только про наследование, если все классы описываются в одном файле, у нас же получается в разных Оо

=====================================
Как так, смотрю даже на примере гаус-пушки из туторов, она сделана как отдельный класс, наследующий признаки CBaseHLCombatWeapon, пытаюсь найти как это сделано - иду в "basehlcombatweapon.h" (т.к. он подключен в заголовочных файлах) и никакого класса там ни нахожу, каг таг? Оо


======================================
короче нихера не понимаю, что вообще за хрень такая

======================================
Максимум чего сам добился за это время:
code:
1>.\client.cpp(657) : error C2027: use of undefined type 'CWeaponPhysCannon'
1> d:\Games\Steam\MyMod\src\game\server\hl2\weapon_physcannon.h(33) : see declaration of 'CWeaponPhysCannon'
1>.\client.cpp(657) : error C3861: 'LaunchObject': identifier not found


Теперь видимо ему просто не нравится как в weapon_physcannon.h описан класс CWeaponPhysCannon, как его еще по-другому-то описать, чтобы я смог из client.cpp наследовать его методы, а главное функцию LaunchOgject????????
Не существует границ, есть лишь препятствия

Поправил Breever 19-06-2009 в 06:06

Old Post 19-06-2009 04:36
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
freeman85
(lolwut?!)

Зарегистрирован: Oct 2006
Проживает: /etc/fstab
Написал: 2174 сообщений

Оценка: 70 Votes 70 чел.

Сообщение #873531
1> d:\Games\Steam\MyMod\src\game\server\hl2\weapon_physcannon.h(33) : see declaration of 'CWeaponPhysCannon'

Похоже ты пытаешься назвать свой класс так же как старый, оно говорит, что CWeaponPhysCannon уже объявлен

1>.\client.cpp(657) : error C2027: use of undefined type 'CWeaponPhysCannon'

Походу последствие следующей ошибки, хотя не помню, что бы у меня когда-нибудь писало type. Ещё тогда версия, что ты не правильно объявил код public|private.
http://freeman85.net - Мой блог
OpenLife
Twitter || Last.FM || Хабрахабр || Facebook || в Жопе
cat /dev/urandom > /dev/sda
Хочешь задать вопрос? Заюзай Google! http://google.com

Поправил freeman85 19-06-2009 в 07:29

Old Post 19-06-2009 07:26
freeman85 отсутствует Посмотреть данные 'freeman85' Отправить Приватное Сообщение для 'freeman85' Посетить домашнюю страничку freeman85 Найти другие сообщения 'freeman85' Добавить freeman85 в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873536
Не, пока свой класс я не создавал.
Вообщем, там ситуация такая: Моя функция находится в client.cpp, в ней требуется использовать функции, являющиеся методами класса CWeaponPhysCannon.
Обнако грамотно обьявить и сослаться на weapon_physcannon у меня не получается, даже подключив в модулях weapon_physcannon.h. Описания class CWeaponPhysCannon ведь там нету, оно находится не в заголовочном файле, а в самом cpp.
Вот я и пытался написать в weapon_physcannon.h обьявление о том, что в weapon_physcannon.cpp содержится этот самый класс, компилятору не понравилось.
Вообще, сделал это я просто вот так:
code:class CWeaponPhysCannon;

На это компилятор как раз и выругался
Не существует границ, есть лишь препятствия
Old Post 19-06-2009 07:48
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #873594
Нудык правильно, что выругался) Нельзя использовать просто объявленный класс (максимум, что можно - создавать/передавать указатели на него), компилятору нужно его определение. А поскольку определение какой-то умник из вальвы запихнул в цппшник, остаётся только его оттуда вытащить в отдельный хедер.
Но всё это тщетно, потому что метод, который ты хочешь вызвать - не статический.
Old Post 19-06-2009 10:00
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873611
Угу, мне тоже не понравилось, что функциональность реализована не отдельными функциями, а методами класса Оо
Ну дык я хочу поюзать не весь метод, а только куски из него

А есть еще обычные команды применения силы к определенному обьекту?
Вот эта функция не подойдет:
code:
// Applies force impulses at a later time
void PhysCallbackImpulse( IPhysicsObject *pPhysicsObject, const Vector &vecCenterForce, const AngularImpulse &vecCenterTorque );

Вроде как она применяет импульс силы (любимая физика! ) на короткое время.

Только вот с ее параметрами не совсем все ясно.
1 параметр - сам физ. обьект, получить ссылку на него можно при помощи трассировки
2 параметр - как я понял вектор приложения силы, получаем также трассировкой
3 параметр - какой-то угловой импульс, где его брать??

P.S. И да, я нубопрограммер :Р
Не существует границ, есть лишь препятствия
Old Post 19-06-2009 10:42
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #873645
Всё куда проще)
// force vector is direction & magnitude of impulse kg in / s
virtual void ApplyForceCenter( const Vector &forceVector ) = 0;

Итого:
if ( tr.m_pEnt && tr.m_pEnt->VPhysicsGetObject() )
tr.m_pEnt->VPhysicsGetObject()->ApplyForceCenter( dir*1000.0f );
Old Post 19-06-2009 12:00
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Все время в GMT . Сейчас 09:48.
Создать Новую Тему    Ответить

Быстрый ответ
Ваше Имя:
Хотите Зарегистрироваться?
Ваш Пароль:
Забыли свой Пароль?
Вы можете оставлять свои комментарии анонимно, просто введя свои имя и оставив пустым поле пароля.
Ваш ответ:

[проверить размер]
[транслит в win] | [?]
[русская клавиатура]

Дополнительно: Подтверждение по E-Mail


Быстрый переход:
 
Оцените эту Тему:
 

Правила форума:
Создание Тем не разрешено
Создание Сообщений разрешено
Создавать Вложения не разрешено
Редактирование Сообщений не разрешено
Коды HTML запрещены
Коды форума разрешены
Смайлики разрешены
Коды [IMG] запрещены