CAHEK, по вопросу один: вероятно что-то вроде такого
Код
if (IsOfClass(m_penEnemy, "Название класса зомби, который мог упасть")) { // допустим, что это класс CZombie // если зомби упал if (((CZombie*)&*m_penEnemy)->LEG) { // анимация 1 } else { // если еще стоит // анимация 2 } }
Сообщение отредактировалHeming_Hitrowski - Пятница, 04.09.2015, 13:18
Возможно ли каким-нибудь образом включить одновременно несколько коллизий у модели, сделать коллизию кубической или телепортировать браши без рассинхронов?
Телепортировать браши без рассинхрона в теории можно.. Разве Teleport moving brush event не работает? Одновременно несколько коллизий - тоже можно, но это настолько сложно, что я даже не берусь описывать. Кубическая коллизия - можно, но проще будет прикрутить ODE, как сделали в ВТВА. =/
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Мда, вряд ли я его вообще загружу в студию, а ещё и встроить в ентити
Добавлено (15.10.2015, 14:45) --------------------------------------------- Снова непонятно-сложные вопросы. Итак, как можно отрисовывать курсор на экране и выполнять им разные действия?
CDrawPort::PutTexture чтобы нарисовать курсор, движения мыши можно отслеживать из CPlayer::ApplyActionPacket.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
А в чём именно проблема? Как нарисовать курсор я сказал. Откуда взять координаты курсора - сказал (ну, может, не ApplyActionPacket, но в названии там есть ActionPacket или PlayerAction).
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
В CPlayer в функцию ApplyAction приходит значение типа CPlayerAction. В него входит pa_aViewRotation - вектор, фактически соответствующий скорости движения курсора.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Добавлено (17.10.2015, 22:32) --------------------------------------------- Ок, своим способом получилось разобраться, но теперь ещё вопрос. Как можно припарентить камеру к игроку, чтобы при поворотах она не крутилась, а только была на координатах игрока. Пробовал юзать en_plRelativeToParent, но камера дергается при повороте
В смысле, чтобы угол поворота камеры не менялся? Ты можешь просто вручную выставлять его с каждым тиком движка (например, из той же ApplyAction).
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Добавлено (17.10.2015, 23:47) --------------------------------------------- Всё равно дёргается. Игрок движется плавно, а ApplyAction делается через какой-то промежуток времени. Или я как-то не так делаю. Пробовал SetPlacement, Teleport, всё так же
Попробуй делать это из функции рендеринга (RenderGameView) в самом начале.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Вот теперь всё, спасибо. Весь день с этой мышью возился, а там такой простой способ был, я его наизусть запомнил
Добавлено (18.10.2015, 14:00) --------------------------------------------- Естесна, когда всё хорошо, появляются баги. Окей, вопрос. Как можно направить угол обзора игрока (m_aLocalViewRotation?) на какие-либо координаты? (мне например нужно на координаты X и Z: относительно игрока(1) + (координаты мыши(1) - 320) и относительно игрока(3) + (координаты мыши(2) - 240) ) Использовал DirectionVectorToAngles, но чем дальше я от центра карты (0,0,0), тем больше прибавляется угол почему-то, и игрок смотрит уже не в сторону курсора, а с (отклонением+расстояние до центра) P.S. координаты мыши(1) - X курсора на экране (от 0 до 640), координаты мыши(2) - Y курсора на экране (от 0 до 480)
Для начала убедись что твой метод расчёта игровых координат для курсора работает правильно. Телепортируй какой-нибудь маркер под курсор при каждом клике и посмотри, точно ли он попадает под курсор. Преобразование экранных координат в мировые - вообще сложная вещь, я с этим в ССО намучился.
Код
CEntity* EntityUnderCursor(CPlacement3D plViewer, FLOAT3D &o_vPos, int i_w, int i_h, CPlayer* i_player, int x, int y) { // Get a world CWorld* world = i_player->GetWorld();
// Turn a viewer's placement accordingly to the mouse coords
// Some complicated math that has something to do with projections float FOV = _pShell->GetFLOAT("plr_fFOV");
// At first, imagine the screen plane is 1m away // Now calculate physical dimensions of virtual screen rect float screenboxX = 2.0f * tan((FOV * PI) / 360.0f); float screenboxY = (screenboxX / (float)(i_w)) * (float)(i_h);
// Transfer click point coords to screenbox space: float coordsX = ((float)x / (float)(i_w)) * screenboxX; float coordsY = ((float)((i_h) - y) / (float)(i_h)) * screenboxY;
// Therefor, the base coords for virtual screen rect are: FLOAT3D vScreenBox((-screenboxX / 2.0f) + coordsX, (-screenboxY / 2.0f) + coordsY, -1.0f);
// Cast a ray CCastRay crRay(i_player, plViewer); crRay.cr_bHitTranslucentPortals = FALSE; crRay.cr_bPhysical = FALSE; crRay.cr_ttHitModels = CCastRay::TT_COLLISIONBOX; world->CastRay(crRay);
o_vPos = crRay.cr_vHit; return crRay.cr_penHit; }
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Ну вообще в углу экрана у меня написаны координаты мыши, и всё правильно, с левого верхнего угла 0,0; снизу справа 640,480
Добавлено (18.10.2015, 15:35) --------------------------------------------- И ещё по идее у меня не существует мыши в мире, она просто рисуется, и какая бы камера или вид не был активирован, всё от первого угла 0,0 до другого 640,480
Но игрок поворачивается к мировым координатам, а не к экранным. А я помогаю тебе только до тех пор, пока ты не начинаешь спорить. =/
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Добавлено (18.10.2015, 20:38) --------------------------------------------- Блин, всё, не могу. Ничего не выходит. Ещё тот кусок кода не помогает. При том, что если я хочу создать ентити на курсоре - то всё норм (конечно, с отклонениями небольшими, но это всё работает, если делить координаты мыши на сколько-нибудь), а если те же координаты пытаюсь сунуть игроку, деля, не деля - всегда не относительно игрока, а относительно 0,0,0
Добавлено (18.10.2015, 20:41) --------------------------------------------- А ещё можно заставить двигаться игрока не относительно своего поворота, а просто по X,Z? А то кроме en_vCurrentTranslationAbsolute ничего не знаю, но он баганный во многих местах
Он не баганный, просто ты не умеешь пользоваться. А игроку ты должен давать не конечные координаты, куда он должен идти, а скорость движения и поворота, которую нужно расчитывать исходя из координат цели. А функция, которую я дал, гарантированно работает без всяких делений координат. Там есть аргументы: i_w и i_h - размеры DrawPort'a, x и y - координаты курсора. Ничего не нужно делить самому.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Переведи мировые координаты курсора в локальную систему координат игрока. Если значение координаты Х после этого окажется положительным - поворачивай игрока вправо, если отрицательным - влево. Чтобы игрок не дёргался, когда смотрит ровно на точку, можно ввести какой-нибудь минимальное отклонение, после которого игрок начинает поворачиваться.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
ГОСПОДИ, ОПЯТЬ! Опять та самая ситуация, когда ты упустил ТАКУЮ ВЕЩЬ, которую невозможно упустить. Короче, в ту функцию в DirectionVectorToAngles я всунул vScreenbox.Normalize и ВСЁ ЗАРАБОТАЛО! КАК НАДО! И БЕЗ ОТКЛОНЕНИЙ!!! Правда, я ещё подфиксил всё, т.к. игрок поворачивался не за мышкой, а против неё и при приближении мышки ближе чем 1,1 мировых координат, игрок смотрел только прямо. Собстна, вот что я сделал:
Код
// Some complicated math that has something to do with projections float FOV = 90; int x,y,i_w,i_h; x = penThis->m_msPoint(1); y = penThis->m_msPoint(2); i_w = 640; i_h = 480;
// At first, imagine the screen plane is 1m away // Now calculate physical dimensions of virtual screen rect float screenboxX = 2.0f * tan((FOV * PI) / 360.0f); float screenboxY = (screenboxX / (float)(i_w)) * (float)(i_h);
// Transfer click point coords to screenbox space: float coordsX = ((float)x / (float)(i_w)) * screenboxX; float coordsY = ((float)((i_h) - y) / (float)(i_h)) * screenboxY;
// Therefor, the base coords for virtual screen rect are: FLOAT3D vScreenBox((-screenboxX / 2.0f) + coordsX, 1.0f, -((-screenboxY / 2.0f) + coordsY));
penThis->m_msPointFixed(1) = vScreenBox(1)*10; // world coords X penThis->m_msPointFixed(2) = vScreenBox(3)*10; // world coords Z
// Convert the placement /*CPlacement3D plRayTarget(vScreenBox, ANGLE3D(0,0,0)); plRayTarget.RelativeToAbsolute(penThis->GetPlacement()); CPlacement3D plRaySource(penThis->GetPlacement().pl_PositionVector, ANGLE3D(0,0,0)); plRayTarget.AbsoluteToRelative(plRaySource); plRayTarget.pl_PositionVector.Normalize();*/ // eto mne ne nuzno DirectionVectorToAnglesNoSnap((vScreenBox.Normalize())/10, penThis->m_aLocalRotation); DirectionVectorToAnglesNoSnap((vScreenBox.Normalize())/10, penThis->m_aLocalViewRotation);
И размер DrawPorta мне не важен, у меня при любом разрешении мышь в одном углу 0,0, а в другом 640,480
Добавлено (19.10.2015, 11:02) --------------------------------------------- Хорошо, следующий бесящий баг. Как можно при столкновении с врагами/любыми ентити запретить игроку случайно повернуться? Иначе угол съезжает. Ещё такой баг есть при возрождении: прицел фиг знает где, а угол игрока 0, а не в сторону прицела
Ты не "подфиксил", а опять сделал не так, как тебе сказали. Во-первых, координаты курсора в пределах 640х480 - бред, потому что никто сейчас не использует такое разрешение, а у тебя эти координаты записываются в INDEX, в результате теряется точность. Во-вторых, raycasting таки нужен, потому что игрок не всегда будет ходить по ровной поверхности с постоянной высотой. В-третьих, откуда мне знать, почему у твоего игрока угол не такой, как надо? Ты сам его так накодил. В-четвёртых, vScreenBox.Normalize())/10. Откуда взялось это 10? Что оно означает?
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
координаты курсора в пределах 640х480 - бред, потому что никто сейчас не использует такое разрешение
Я не знаю, как оно так работает, но 640х480 максимальные точки - не пиксели экрана. Такой максимум при любом разрешении, даже при фулскрине, я всё тестил. Просто я мышь очень странным способом накодил, вот так и вышло.
ЦитатаSLAwww ()
игрок не всегда будет ходить по ровной поверхности с постоянной высотой
Может я опять как-то не так объяснил, но я пытаюсь создать эффект TDS, где высота игрока мне вообще не нужна, у меня игрок крутится только по оси "H"
ЦитатаSLAwww ()
vScreenBox.Normalize())/10. Откуда взялось это 10? Что оно означает?
Если не делить, то
ЦитатаSTPROD ()
при приближении мышки ближе чем 1,1 мировых координат, игрок смотрел только прямо
ЦитатаSLAwww ()
у тебя эти координаты записываются в INDEX
В твою функцию это передается как int. И да,
ЦитатаSTPROD ()
Как можно при столкновении с врагами/любыми ентити запретить игроку случайно повернуться? Иначе угол съезжает.
Его угол по H сбивается, и мы начинаем крутить курсором так же, но +сдвиг. Я конечно знаю, как это пофиксить, но тогда ноги не будут вращаться в сторону мыши, а если сдвинуться - наплевать, тело всегда будет на мышь смотреть
Наговнокодил. Поищи, откуда берутся эти 640х480 и сделай так, чтобы цифры соответствовали реальному разрешению экрана. Ctrl-Shift-F-640.
ЦитатаSTPROD ()
высота игрока мне вообще не нужна, у меня игрок крутится только по оси "H"
Все три координаты нужны, если ты проецируешь двухмерный курсор в трёхмерный мир.
ЦитатаSTPROD ()
при приближении мышки ближе чем 1,1 мировых координат, игрок смотрел только прямо
Тогда это костыль. Нужно решить проблему, а не ставить заплатку, которая тебе потом отзовётся. Расставь CPrintF'ы и смотри, какие приходят значения, когда курсор вблизи игрока.
ЦитатаSTPROD ()
В твою функцию это передается как int.
Потому что она принимала реальное разрешение DrawPort'a, а не взятые от балды 640х480.
ЦитатаSTPROD ()
Я конечно знаю, как это пофиксить
Ага, переписать всё с нуля. И рассчитывать скорость поворота так, как я говорил.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
такой вопрос, как убрать из игры паузу? или же как сделать так, чтобы при паузе музыка тоже ставилась на паузу? предпочительней второе конечно, это же не слишком сложно?