Sidebar

[HL2] Zoom

  • Рекомендуется задавать вопросы только относительно темы с уроком. Для остальных вопросов существует раздел [url=/forums/pomosch.12/]«Помощь»[/url].

    Темы с просьбами помощи будут удаляться без предупреждения и без объяснения причины.

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

DeTLeR

New member
17.12.2006
2 777
Zoom

Вот пока делать нечего, решил накатить тутор для "маленьких" :) Ничего особенно, для новичков сойдет ;)
______________________________

Сложность: новичек.

Создание приближения для оружия. Рассмотрим несколько примеров создания зум-режима.
Для начала сделаем самый простой зум. Как у арбалета. Для нам потребуется код такого содержания:

В классе оружия нам потребуется сама функция, к примеру назовем её просто zoom:

Код:
[COLOR=Blue]void[/Color] Zoom( [COLOR=Blue]void[/Color] );
и небольшая переменная:

Код:
[COLOR=Blue]bool[/Color] m_bZoomed;
Так же нам надо записать нашу переменную в DataDesk:

Код:
DEFINE_FIELD( m_bZoomed, FIELD_BOOLEAN ),
Теперь нам надо что б наш зум вызывался на ПКМ ( правая кнопка мыши ). Для этого мы идём в функцию ItemPostFrame и там напишем что-нибудь вроде этого:

Код:
[COLOR=Blue]if[/Color] ( pPlayer -> m_nButtons & IN_ATTACK2 ) [COLOR=Green]// если игрок нажмет на правую кнопку мышы[/COLOR]
{
	Zoom(); [COLOR=Green]// то будем вызывать нашу фукцию zoom[/COLOR]
}
С этим покончено. Теперь непосредственно перейдем к самому приближению. Для этого создадим функцию:

Код:
[COLOR=Blue]void[/Color]CWeaponTest::Zoom( [COLOR=Blue]void[/Color] )
{
	CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
	[COLOR=Blue]if[/Color] ( pPlayer == NULL ) [COLOR=Blue]return[/Color];

	[COLOR=Blue]if[/Color] ( m_bZoomed ) 
	{
		pPlayer -> ShowViewModel( [COLOR=Blue]true[/Color] ); [COLOR=Green]// пока игрок не нажал на ПКМ, то вью модель оружия будет видна[/COLOR]

		WeaponSound( SPECIAL2 ); [COLOR=Green]// звук при нажатии[/COLOR]
		pPlayer -> SetFOV( [COLOR=Blue]this[/Color], 0, 0.1f );
		m_bZoomed = [COLOR=Blue]false[/Color]; [COLOR=Green]// m_bZoomed не активен[/COLOR]
	}
	[COLOR=Blue]else[/Color]
	{
		pPlayer -> ShowViewModel( [COLOR=Blue]false[/Color] ); [COLOR=Green]// вьюмодель будет уже скрыта, так как зум ативирован :)[/COLOR]

		WeaponSound( SPECIAL1 ); [COLOR=Green]// звук при нажатии[/COLOR]
		pPlayer -> SetFOV( [COLOR=Blue]this[/Color], 35, 0.1f ); [COLOR=Green]// 35 – значение насколько сильно приближение[/COLOR]
		m_bZoomed = [COLOR=Blue]true[/Color]; [COLOR=Green]// m_bZoomed активен[/COLOR]
	}
}
Так же надо сделать такие мелочи, что если вы в игре и, к примеру, у вас включен зум у оружия и вдруг вам пришло в голову переключить пушку не выключая зума, надо что б этот зум не заморозился на месте и его нельзя было убрать %)

Для фикса этого бага надо в функции Holster сделать так :)

Код:
[COLOR=Blue]if[/COLOR] ( m_bZoomed )
{
Zoom();
}
Полный пример функции:

Код:
[COLOR=Blue]bool[/COLOR] CWeaponTest::Holster( CBaseCombatWeapon *pSwitchingTo )
{
[COLOR=Blue]if[/COLOR] ( m_bZoomed )
{
Zoom();
}

[COLOR=Blue]return[/COLOR] BaseClass::Holster( pSwitchingTo );
}
Такой же метод надо всунуть с функцию Reload для того что бы зум возвращался в позицию ноль и проигрывалась анимация. Ну и напоследок в функции Drop, если у вас в проекте работает такая вещь как выброс оружия ;)

Если вам ненужны звуки при переключении "простой режим - зум" и обратно, то просто удалите строки начинающиеся с WeaponSound.

Ну вот собственно с самым легким зумом покончено ;) На этом пока всё.

To be continued…
______________________________

Удачного програмирования вам :) Потом допишу более сложные примеры.
 
Последнее редактирование:

DeTLeR

New member
17.12.2006
2 777
У меня именно про зум, а у тебя там всё вместе у куча лишнего непонятно для чего :) Скрины чего, того как работает арбалет в хл2? :) И у тебя там нет поясняющих коментов ;) Тутор оформлю. Тем более я написал что буду добовлять различные примеры посложнее по мере моего свободного времени.
 

Noxter

Simpla Developer
02.09.2007
2 766
36
2 DeTLeR:
1. Покажи где у мну лишнее?
2. Я тоже использовал код арбалета
3. Да у мну немного код кривой смотри скрины по ссылке выше

P.S. Не помешал бы раздел "Туторы"... Эх...
 

DeTLeR

New member
17.12.2006
2 777
2 Noxter:
У меня для зума задействованы 2 функции, у оригинального кода арбалета их целая куча. Работает одинаково, делаем выводы :)
 

FiEctro

Супер Модератор
Команда форума
Супер Модератор
28.07.2006
17 167
33
  • Золотая медаль 213
  • Neh
>> у оригинального кода арбалета их целая куча

МБ кому нить понадобятся другие функции из этой кучи?
 

DeTLeR

New member
17.12.2006
2 777
Ну Х/З. Я например не понимаю нафиг вобще нужна в коде ItemBasyFrame и ItemPreFrame =/
 

Noxter

Simpla Developer
02.09.2007
2 766
36
FiEctro сказал(а):
Ни как не вьеду что это означает?

Согласен с DeTLeR но без этих функций выдает ошибки!
Сказать по правде я гребу вообще что оно значит вообще, просто копипастю НО копипастю правильно по другому я нуб хз не знаю)))
 

DeTLeR

New member
17.12.2006
2 777
МБ = Может быть.
У меня в коде вместо тех функций на вторую кнопку сразу вызывается зум. А тут через эти корявые функции оно их вызывает по 3 раза непонятно зачем.
 

Noxter

Simpla Developer
02.09.2007
2 766
36
2 DeTLeR:
ХЗ забей)
И переоформи плз чтоб было красиво а то синий шрифт на темном очень не читаемо.
 

FiEctro

Супер Модератор
Команда форума
Супер Модератор
28.07.2006
17 167
33
  • Золотая медаль 213
  • Neh
2 Noxter:
Синий еще ладно. Но вот коментарии без выделения, вообще не читабельны %).
 

FiEctro

Супер Модератор
Команда форума
Супер Модератор
28.07.2006
17 167
33
  • Золотая медаль 213
  • Neh
2 DeTLeR:
Сорри что не по теме, но ты случаем не знаешь где находится класс ITexture в сорцах хл2бета? Нужен не интерфейс, а именно реализация.
 

Mikle

New member
24.02.2007
72
2 DeTLeR:
Спасибо огромное за пример! Но у меня есть пара трабл:
1.Если реализовать как у тебя, то переменная m_bZoomed будет меняться с огромной скоростью и кнопку придётся нажимать очень коротко. Как исправить, чтобы переменная менялась только при нажатии, а не пока держишь мышку?
2.У меня надо ставить не pPlayer, а pOwner(может это из-за бэтовских исходников?)
 

DeTLeR

New member
17.12.2006
2 777
Не понял первого %)
Попробуй вверху сделать инклуд
#include "player.h"
или
#include "hl2_player.h"
Непомню как правильно, и нет возможности глянуть.
 
Последнее редактирование:

Mikle

New member
24.02.2007
72
Ну получается такой эффект, что изображение "дрожит", быстро-быстро приближаясь и отдаляясь обратно, а для нормального зума надо очень коротко кликнуть мышкой
 

DeTLeR

New member
17.12.2006
2 777
Ага, вроде понял. Попробуй поиграть в вот таких родах строк с третим параметром, он отвечает за скорость приближения и отдаления.
pPlayer -> SetFOV( this, 0, 0.1f );
 

Mikle

New member
24.02.2007
72
2 DeTLeR:
Урааа!!! Я разобрался! Смотри: я немного доработал, надо добавить простой, как у пистолета, чтобы между возможностью приближения проходило некоторое количество времени. В начале обявим временной промежуток, там где другие define:
Код:
#define NEXT_ZOOM_TIME 0.3f //Промежуток времени до возможности следующего зума
ок, теперь объявим переменную, которая будет содержать само время, после которого сново возможен зум(ставим её после нашей m_bZoomed)
Код:
	bool	m_bZoomed;  	float	m_fNextZoomTime;
отлично, не забываем добавить её в DaTaDesk:
Код:
	DEFINE_FIELD( m_fNextZoomTime, FIELD_FLOAT ),
всё, а теперь немного изменённая функция Zoom:
Код:
void CWeaponPistol::Zoom( void )
{
CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

if (pPlayer == NULL)
return;

if ( (pPlayer->m_nButtons & IN_ATTACK2) && (gpGlobals->curtime > m_fNextZoomTime) )
{
	if(m_bZoomed)
{

	pPlayer -> ShowViewModel( true );
	WeaponSound( SPECIAL2 );
	pPlayer->SetFOV(this, 0, 0.2f);
	m_bZoomed = false;

}
else
{
	pPlayer -> ShowViewModel( false );
	WeaponSound( SPECIAL1 );
	pPlayer->SetFOV(this, 30, 0.2f);
	m_bZoomed = true;
}
m_fNextZoomTime = gpGlobals->curtime + NEXT_ZOOM_TIME;
}
}
Псё)), добавил на пистолет, работает!
 
Последнее редактирование:

Game Server

Доноры Красавчики

Пользователи онлайн

Нет пользователей онлайн.