teremochek
6 постов
Карма: 0
#11 09 июля 2012 в 16:55
Хотелось немного написать, о том что я понял в Quake 3 source. Да все как-то лень...<br />Сегодня Несколько часов потратил, хотел избавится от вращения спрайта плазмы...<br />В конце концов оказалось, что оно прописано в Скриптах - pak0.pk3-&gt;scripts-&gt;models.shader<br />И такое уже не первый раз...<br /><br />Я делаю танчики - battle city. Попробую немного объяснить, как я делал управление. <br />Итак сперва я выбрал функцию движения, в которой было меньше всего написано - &quot;PM_FlyMove&quot; (В фаиле &quot;bg_pmove.c&quot;).<br />Главная функция которая нам понадобится - &quot;PmoveSingle&quot;.<br />В ней собраны все функции движения - по воде, по земле, в воздухе и т.д..<br />Заменил &quot;PM_WalkMove&quot; на &quot;PM_FlyMove&quot;.<br /><br /><br /> if ( pm-&gt;ps-&gt;powerups[PW_FLIGHT] ) {<br /> // flight powerup doesn&#039;t allow jump and has different friction<br /> PM_FlyMove();<br /> } else if (pm-&gt;ps-&gt;pm_flags &amp; PMF_GRAPPLE_PULL) {<br /> PM_GrappleMove();<br /> // We can wiggle a bit<br /> PM_AirMove();<br /> } else if (pm-&gt;ps-&gt;pm_flags &amp; PMF_TIME_WATERJUMP) {<br /> PM_WaterJumpMove();<br /> } else if ( pm-&gt;waterlevel &gt; 1 ) {<br /> // swimming<br /> PM_WaterMove();<br /> } else if ( pml.walking ) {<br /> // walking on ground<br /> //PM_WalkMove();<br /> PM_FlyMove(); // ------------------------------------------------------ Здесь<br /> } else {<br /> // airborne<br /> PM_AirMove();<br /> }<br /><br /><br />Теперь когда ходишь по земле, то действует функция FlyMove.<br /><br />Убрал &quot;PM_Friction (); &quot; Трение. Оно делает движения немного рывка-образными...<br /><br />static void PM_FlyMove( void ) {<br /> int i;<br /> vec3_t wishvel;<br /> float wishspeed;<br /> vec3_t wishdir;<br /> float scale;<br />&nbsp; &nbsp; <br /> // normal slowdown<br /> ////////PM_Friction ();&nbsp; <br /><br /><br />Убрал передачу управления стандартным образом.<br />wishvel[2]=0. Это движение по оси Z (вверх-вниз), сделал равным нулю.&nbsp; Оно мне не нужно. <br /><br />[code]<br /> scale = PM_CmdScale( &amp;pm-&gt;cmd );<br /> //<br /> // user intentions<br /> if ( !scale ) {<br /> wishvel[0] = 0;<br /> wishvel[1] = 0;<br /> wishvel[2] = 0;<br /> } else {<br /> for (i=0 ; i&lt;3 ; i++) {<br /> //wishvel[i] = scale * pml.forward[i]*pm-&gt;cmd.forwardmove + scale * pml.right[i]*pm-&gt;cmd.rightmove; <br /> }<br /> //wishvel[2] += scale * pm-&gt;cmd.upmove;<br /> &nbsp; wishvel[2]=0;<br />[/code]<br /><br />Блок кнопок, если одновременно две кнопки нажимается, то движения нет.. (Это для простоты сделал, вообще в танчиках подругому)<br />И Ограничил величину скорости передвижения 127. Т.к. были какие-то глюки с передвижением.<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &lt; 0 &amp;&amp; pm-&gt;cmd.forwardmove &gt; 0) { pm-&gt;cmd.rightmove=0; pm-&gt;cmd.forwardmove=0;} // dwe knopki odnowremenno<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &lt; 0 &amp;&amp; pm-&gt;cmd.forwardmove &lt; 0) { pm-&gt;cmd.rightmove=0; pm-&gt;cmd.forwardmove=0;}<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &gt; 0 &amp;&amp; pm-&gt;cmd.forwardmove &gt; 0) { pm-&gt;cmd.rightmove=0; pm-&gt;cmd.forwardmove=0;}<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &gt; 0 &amp;&amp; pm-&gt;cmd.forwardmove &lt; 0) { pm-&gt;cmd.rightmove=0; pm-&gt;cmd.forwardmove=0;}<br /><br /> if(pm-&gt;cmd.forwardmove&gt;127){pm-&gt;cmd.forwardmove=127;} // maksimalnaya skorost (gluk?)<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &gt; 127){pm-&gt;cmd.rightmove=127;}<br /> if(pm-&gt;cmd.forwardmove &lt; -127){pm-&gt;cmd.forwardmove=-127;}<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &lt; -127){pm-&gt;cmd.rightmove=-127;}<br /><br /><br />Само управление - &quot;pm-&gt;ps-&gt;viewangles[YAW] = 0&quot; это поворот игрока в нужную стороны + Анимация...(О ней может-быть позже)<br />Т.е. если нажато в право, то танчик разворачивается в право.. ! Но двигаться он будет при этом - вперед (относительно самого себя)<br /><br /> if(pm-&gt;cmd.forwardmove &gt;126){pm-&gt;ps-&gt;viewangles[YAW] = 0; pm-&gt;ps-&gt;viewangles[PITCH] = 0; // naprawlenie i animaciya tanka (2 kadra)<br /> &nbsp; if( pm-&gt;ps-&gt;torsoAnim &lt; 5 || pm-&gt;ps-&gt;torsoAnim &gt; 8){pm-&gt;ps-&gt;torsoAnim = 5;} //prawelniy kadr<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pm-&gt;ps-&gt;torsoAnim += 1; if( pm-&gt;ps-&gt;torsoAnim &gt;8 ){pm-&gt;ps-&gt;torsoAnim = 5;} //smena kadra<br /> }<br />&nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;cmd.rightmove &gt;126)&nbsp; {pm-&gt;ps-&gt;viewangles[YAW] = -90; pm-&gt;ps-&gt;viewangles[PITCH] = 0; <br /> &nbsp; if( pm-&gt;ps-&gt;torsoAnim &lt; 9 || pm-&gt;ps-&gt;torsoAnim &gt; 12){pm-&gt;ps-&gt;torsoAnim = 9;} <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pm-&gt;ps-&gt;torsoAnim += 1; if( pm-&gt;ps-&gt;torsoAnim &gt;12 ){pm-&gt;ps-&gt;torsoAnim = 9;} <br /> }<br /> if(pm-&gt;cmd.forwardmove &lt;-126){pm-&gt;ps-&gt;viewangles[YAW] = -180; pm-&gt;ps-&gt;viewangles[PITCH] = 0; <br /> &nbsp; if( pm-&gt;ps-&gt;torsoAnim &lt; 13 || pm-&gt;ps-&gt;torsoAnim &gt; 16){pm-&gt;ps-&gt;torsoAnim = 13;} <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pm-&gt;ps-&gt;torsoAnim += 1; if( pm-&gt;ps-&gt;torsoAnim &gt;16 ){pm-&gt;ps-&gt;torsoAnim = 13;} <br /> }<br /> if(pm-&gt;cmd.rightmove &lt;-126)&nbsp; {pm-&gt;ps-&gt;viewangles[YAW] = 90; pm-&gt;ps-&gt;viewangles[PITCH] = 0;<br /> &nbsp; if( pm-&gt;ps-&gt;torsoAnim &lt; 1 || pm-&gt;ps-&gt;torsoAnim &gt; 4){pm-&gt;ps-&gt;torsoAnim = 1;} <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pm-&gt;ps-&gt;torsoAnim += 1; if( pm-&gt;ps-&gt;torsoAnim &gt;4 ){pm-&gt;ps-&gt;torsoAnim = 1;} <br /> }<br /><br /><br />Анимация взрыва..<br /><br /> if ( pm-&gt;ps-&gt;pm_type &gt;= PM_DEAD ) { // ----------------------------------------------------------------- wzriw tanka (animaciya)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(pm-&gt;ps-&gt;torsoAnim &lt; 0){ pm-&gt;ps-&gt;torsoAnim+=1 ;} //+animaciya<br /> if(pm-&gt;ps-&gt;torsoAnim &gt; 0){ pm-&gt;ps-&gt;torsoAnim=-16 ;} // nachalnaya animaciya wzriwa<br />&nbsp; &nbsp; }<br /><br /><br /><br />Передаем значения переменной &quot;wishvel&quot; по координатам XY.<br />Зануляем значения&nbsp; &quot;forwardmov rightmove&quot;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; wishvel[0]=pm-&gt;cmd.forwardmove;//*128;<br />&nbsp; &nbsp; &nbsp; &nbsp; wishvel[1]=-(pm-&gt;cmd.rightmove);<br /><br /> pm-&gt;cmd.forwardmove=0;<br /> pm-&gt;cmd.rightmove=0;<br /> }<br /><br /><br />Здесь я убрал&nbsp; &quot;PM_Accelerate (wishdir, wishspeed, pm_flyaccelerate);&quot;. Ускорение движения мне не нужно. Танчик должен двигаться стабильно. <br /><br /> VectorCopy (wishvel, wishdir);<br /> wishspeed = VectorNormalize(wishdir);<br /><br /> pm-&gt;ps-&gt;velocity[0] = wishvel[0];<br />&nbsp; &nbsp; pm-&gt;ps-&gt;velocity[1] = wishvel[1];<br /> pm-&gt;ps-&gt;velocity[2] = wishvel[2];<br /><br /> //PM_Accelerate (wishdir, wishspeed, pm_flyaccelerate);<br /> PM_StepSlideMove( qfalse );<br />}<br /><br /><br />Получилось что-то похожее. Разумеется можно еще с этим поработать, cделать движения как в танчиках 3/4. Но я так подумал, что это не обязательно. Т.к. по сети получается каша) Танчик двигается не ровно.. И анимация тоже непонятно меняется.<br />Может это кому-нибудь поможет..
Eugeny
199 постов
Карма: 10
#12 21 июля 2012 в 11:02
прикольно
DOOMer
1598 постов
Карма: 103
#13 21 июля 2012 в 14:12
teremochek, ты все таки решил сделать именно как мод, без внесения изменений в client-side код движка?<br />
Вертексы должны образовывать конвексный браш
My Quake Maps

Core i7 8700 3.3 Ghz, 32 Gb RAM, GeForce RTX2060s
Gentoo Linux [amd64] | Windows 10 Home



сохранись перед дверью...два раза =)
Doinkes
97 постов
Карма: -12
#14 24 июля 2012 в 05:12
Спасио, что показал. Мне это наверно понадобиться. Хотел бы(подчеркиваю хотел БЫ) сделать мод сеговской игы rock n roll racing, только надо делать невьебенное количество моделей и физику переделывать впридачу. Никто не хочет помочь?&nbsp; :)
-----------------------------------------------------
Всё что было написано, это конечно хорошо, но если что то не так... нет.&nbsp; всё так.
my_maps