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

Зарегистрирован: Jan 2007
Проживает: Россия/Ставрополь
Написал: 109 сообщений

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

Альтернативный режим стрельбы пистолета.
Сообщение #561061
Давайте кодеры пишите туторы, я начну, вот сейчас перевёл и оформил тутор с одного забугорного сайта.

Можите добавлять свои туторы на мой сайт о коддинге и маппинге уже довольно известный!!!

WWW.STAV-MaPPinG.INFO

В этом туторе я покажу как добавить к пистолету альтернативный режимы стрельбы, а точнее на левую кнопку стреляет как обычно, а на правую 3 патрона.

Итак приступим: зайдём в weapon_pistol.cpp.

Синий цвет: Код Valve
Красный цвет: Новый код

Шаг 1 Инициализация:

Перейдите к этой части кода:

private:
float m_flSoonestPrimaryAttack;
float m_flLastAttackTime;
float m_flAccuracyPenalty;
int m_nNumShotsFired;


Ниже этого кода вставляем следующее:

float m_flNextFireModeChange;
int nFireCount;
bool bFiring;
bool bFireMode;
void checkCount();
void FireMode();



Затем идите к описанию данных initializations:

BEGIN_DATADESC( CWeaponPistol )
DEFINE_FIELD( m_flSoonestPrimaryAttack, FIELD_TIME ),
DEFINE_FIELD( m_flLastAttackTime, FIELD_TIME ),
DEFINE_FIELD( m_flAccuracyPenalty, FIELD_FLOAT ),
DEFINE_FIELD( m_nNumShotsFired, FIELD_INTEGER ),



Надо добавить следующий код:

DEFINE_FIELD( m_flNextFireModeChange, FIELD_TIME ),
DEFINE_FIELD( nFireCount, FIELD_INTEGER ),
DEFINE_FIELD( bFiring, FIELD_BOOLEAN ),
DEFINE_FIELD( bFireMode, FIELD_BOOLEAN ),



Найдите это:

CWeaponPistol::CWeaponPistol( void )
{
m_flSoonestPrimaryAttack = gpGlobals->curtime;
m_flAccuracyPenalty = 0.0f;

m_fMinRange1 = 24;
m_fMaxRange1 = 1500;
m_fMinRange2 = 24;
m_fMaxRange2 = 200;

m_bFiresUnderwater = true;



И добавьте это:

nFireCount = 3;
bFiring = false;
bFireMode = false;
m_flNextFireModeChange = gpGlobals->curtime;



Шаг 2 Запрос к checkCount():

Добавить: checkCount(); в CWeaponPistol::ItemPostFrame

Показываю как это нужно сделать:


void CWeaponPistol::ItemPostFrame( void )
{
...
...

checkCount();
}





Шаг 3 Введение функций:

Создайте где нибудь ниже функцию:


void CWeaponPistol::FireMode( void )
{
if ( m_flNextFireModeChange < gpGlobals->curtime )
{
nFireCount = 3;
bFireMode = !bFireMode;
m_flNextFireModeChange = gpGlobals->curtime + 0.5f;
}
}



И ещё ниже создайте вот эту:

void CWeaponPistol::checkCount( void )
{
CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

if (pPlayer == NULL)
return;


if (pPlayer->m_afButtonPressed & IN_ATTACK2)
{
if(bFireMode)
bFiring = true;
nFireCount = 0;
}else if (pPlayer->m_afButtonReleased & IN_ATTACK2)
{
bFiring = false;
}

if((bFireMode==false)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f)){
if(nFireCount < 3){
PrimaryAttack();
nFireCount++;
}
}
if((bFiring)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f))
PrimaryAttack();
}



Шаг 4:

Найдите функцию перезарядки и добавьте: 'bFiring = false':

bool CWeaponPistol::Reload( void )
{
bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD );
if ( fRet )
{

bFiring = false;
WeaponSound( RELOAD );
m_flAccuracyPenalty = 0.0f;
}

return fRet;
}



Так вроде всё.

Перевод: WeB-Monster

Поправил Web-Monster 22-04-2007 в 07:24

Old Post 21-04-2007 21:05
Web-Monster отсутствует Посмотреть данные 'Web-Monster' Отправить Приватное Сообщение для 'Web-Monster' Посетить домашнюю страничку Web-Monster Найти другие сообщения 'Web-Monster' Добавить Web-Monster в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Lolmen
(С++ Разработчик)

Зарегистрирован: Dec 2004
Проживает: Беларусь/Минск
Написал: 4515 сообщений

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

Старожил 
Сообщение #561146
Ну во первых красный код не твой а код из тутора
Во вторых не bind "x" "+firemode", а достаточно нажать RMB
так как +attack2 будет использоваться в данном случае...

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

Так что садись и фикси...
Советую делать коммент почти на каждую строчку с обьяснением что каждая функция делает, и какие аргументы а главное какого типа туда передавать, мне то понятно, а вот простой маппер скажем захочет вставить эту возможность в свой мод... И что? Ладно он кода не знает, можно какой-то смысл понять если знаешь английский, а если человек английского не знает... Вот для того и нужны комменты маппер прочитал, маппер понял... А понял он например смысловую нагрузку какого-то куска кода, для того чтобы он смог использовать полученные знания совершенно в других местах, например он узнал, что тот-же кусок кода :
Цитата:
bFireMode = !bFireMode;
m_flNextFireModeChange = gpGlobals->curtime + 0.5f;

Несёт в себе великий смысл, а не просто две глупые строки английских букв , например он означал что при обращении к функции её врутренняя переменнная bool bFireMode т.е булевого типа меняет своё значение на противоположное...
хотя сам по себе знак "!" не означает факториал числа просто в высшей матемке есть такой загон что перед числом или переменной ставиться знак ! он означает факториал числа, а в булевой алгебре это записывается по другому, непонятно зачем авторы C сделали восклицательный знак как приставку "НЕ"
Так вот : если записать например
Цитата:
if ( bFireMode ){ "делаем так" }else { "денлаем нита" }

что будет значиь если ( мы в режиме стрельбы ) { "делаем так" }иначе { "делаем нитак" } равно как и обратное
Цитата:
if ( !bFireMode ){ "делаем нитак" }else{ "делаем так" }

порусски если ( мы НЕ в режиме стрельбы } { ... } иначе { ... }
Фигурные скобки лутше ставить чтобы разграничивать условия...

m_flNextFireModeChange переменная которая будет приравниваться к текущему игровому времени + запас в пол секунды, так как здеся секунда не означает 60 долей сеунд, здесь секунда плавающее значение от 0.00000 до 1.000000, может возникнуть вопрос почему 6 нулей после точки? потому что эато 32 битное значение с плавающей запятой записывается как float, иначе говоря дробное число простой точности...
есть также числа двойной точности напрмиер с 8-12-16 нолями, но это зависит от компилятора и cоответственно поддерживаемой разрядностью у процессора и записывается как double и long double.

Вот такие батенька детали могут заинтересовать народ
Зарание сорри за не солидарность!

Мой блог

Поправил Lolmen 22-04-2007 в 02:04

Old Post 22-04-2007 01:57
Lolmen отсутствует Посмотреть данные 'Lolmen' Отправить Приватное Сообщение для 'Lolmen' Посетить домашнюю страничку Lolmen Найти другие сообщения 'Lolmen' Добавить Lolmen в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Все время в GMT . Сейчас 15:18.
Создать Новую Тему    Ответить

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

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

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


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

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