Jump to content

Глючные анимы


Recommended Posts

попробовал с ботами - тоже самое. Ты уверен, что видел это именно на примере собственного кода, а не на каком-то фрироме с ресурсом "супермен"? интересно всё-таки, может ты это можешь воспроизвести

Link to comment

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

Вот так нужно ТП перса

http://mxgames.kz/images/2011-06-07_150547.png

и тогда вот так он сядет

http://mxgames.kz/images/2011-06-07_151128.png

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

Link to comment

очень занятное замечание (проверил у себя), то есть по сути надо всего-лишь встать на скамейку и применить анимацию)

а анимация посадки это и впрямь тема: сделать edf с элементом "скамейка" и расставить где надо, чтобы точно выставлять углы поворотов. вычислить примерно оффсеты места, с которого садиться и место, в котором есть. ТП в первую точку, анимация посадки, тп во вторую точку, анимация "етьбы" - гениально. а чтобы ставить "скамейки" на готовых скамейках, можно сделать элемент безматериальным)

Link to comment

Короче пацаны, после многочисленных тестов выяснилось что даже если сместить перса над скамейкой, стулом, диваном и т.п., то он теперь будет висеть над ними, находясь немножко в воздухе. Над чем-то больше, над чем-то меньше, зависит от объекта. Исправляется все только коллизией, но функция не синхронизирована с сервером, поэтому тоже не решение... Но я прочитал на вики, что эта функция синхронизирована в версии МТА 1.1, но она еще сырая как говорят многие. Чего делать и сам не знаю :( Что вы можете сказать насчет 1.1?

Link to comment

и в чём же сложность синхронизировать отмену коллизии вручную? оО всего-то лишь нужно вызвать функцию у всех клиентов сразу+вызывать у клиента при заходе на сервер.

Link to comment

Задача слишком проста, чтобы иметь сложное решение. Для некоторых одно решение это только путь к следующей проблеме. В чем ваще задача состоит? Посадить перса на выбранный стул в кафешке?

Кстати, уже от темы отъехали на 20 км и пока выяснилось, что анимации работают как положено, а глючные только скрипты. Раз с анимациями все в порядке, то для помощи создайте новую тему, где четко будет поставлена задача. А то так и будем топтаться на 1 месте.

Link to comment

Давайте уже не будем создавать тему. Я просто еще раз объясню что хочу сделать, а вы уж если можете, то поможете, т.к. некоторые задачи для меня просто сложно сделать не так как из-за технического исполнения, как из-за малого знакомства с .lua, MTA в частности и всех связанных с этим "фичей". В общем первоначальная задача: посадить игрока на сиденье в кафешке с анимацией еды (FF_Sit_Eat1, FF_Sit_Eat2, FF_Sit_Eat3), но как я уже говорил, чтобы его ноги не проваливались в пол, или любой другой объект, а также чтобы он при этом не висел в воздухе, а сидел прямо на седлушке и хамячил. Отсюда вытекла проблема с взаимодействием элементов с объектами мира, имеющие Collision (попробуйте например применить анимацию "лечь на кровать", стоя рядом с кроватью - перс тоже будет спать в воздухе).

--lil Toady, заморозить-то можно, но перс и без того не падает, а нагло не садится на стул, даже если его в самую нужную точку ставить - он находится выше, как бы вися в воздухе, я выложу все скрины попыток, как буду дома, если нужно и визульно покажу проблему.

Link to comment

В setPedAnimation выстави updatePosition на false, чтобы игрок анимкой подошёл к кровати и лёг на неё как бы. (Так же я делал со стульями.)

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

Link to comment

Kernell, да кровать заработала, спасибо.

BX_Master, вотъ скрипт, он чисто тестовый:

function Sit ( playerSource) 
local x, y, z=getElementPosition ( playerSource ) 
setElementPosition ( playerSource, x, y, z + 0.5 ) 
--Если в этой части скрипта отключить коллизию, то как раз и будет нужная мне анимация, сидения ровно на стуле и едя. Но она отключается на клиенте, как я уже говорил и видна только клиенту. 
setPedAnimation ( playerSource, "FOOD", "FF_Sit_Eat1", -1, true, false, false, false ) 
end 
addCommandHandler ( "sit", Sit ) 

Link to comment

всё проверил, только 1 вариант сейчас: если знать точно все позиции и углы над табуретками, то можно просто тп игрока над ней в нужный момент и затем применить анимацию хавки. Анимации, где игрок садится на стул никогда не посадят перса на стул из-за коллизий. setElementCollisionsEnabled / setElementFrozen тут ничем не помогут.

Ну разве, что во время анимации заменить COL у объекта, на который он садится. Перед началом анимации вставания с табуретки - вернуть объекту его оригинальный COL. Т.е. не у игрока коллизии отключить, а вот таким способом - у объекта.

Link to comment

чтобы показать скрипт надо высчитывать оффсеты для начала и конца анимации относительно лавки... Ну смотри, если выставить updatePosition -> false то персонаж визуально будет двигаться, но координаты меняться не будут. То есть он по сути стоит на месте (соотвественно коллизии ни на что не повлияют), но визуально будет двигаться "сквозь" обьект и нормально на него присаживаться. Таким образом надо применить анимацию с updatePosition->false и на самом последнем её кадре нужно отменить анимацию и телепортировать игрока туда, где он должен оказаться(на лавку тобиш). Если правильно всё посчитать, стык будет практически незаметным, единственное, что камера дёрнется при телепорте (можно сделать на этот момент кастомную, приаттаченную камеру через setCameraMatrix в onClientPreRender, но это уже другая история)

_______________________

x,y,z = координаты игрока

x2,y2,z2 = координаты позиции, которая находится чуточку впереди от игрока

time = время, за которое проходит анимация

setPedAnimation(ped,"блок","анимация",-1,false,false,false);

setTimer(setElementPosition,time,1,ped,x2,y2,z2);

как-то так.

Link to comment

мне интересно, почему этих жестких стыков никогда нет при комбинациях анимаций самой игры

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

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...