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