Linux_Shines Posted May 26, 2013 Share Posted May 26, 2013 Heloł, ledwo zamknąłem poprzedni temat, a już tworzę kolejny. No ale... Mniejsza z tym... W każdym razie - czy jest możliwe pobranie długości dźwięku pojazdu i stworzenie na podstawie tej długości dźwięku obrotomierza? Dokładniej - chodzi mi o to, że w San Andreas odgłosów auta jest zaledwie 5, a mi chodzi o pobranie tych: - przyspieszenie- obroty silnika na jałowym biegu - obroty silnika przy maksymalnej prędkości Następnie pobrane dźwięki chciałbym w jakiś "magiczny sposób" przypisać do prędkościomierza, dzięki czemu uzyskałbym ilość obrotów silnika dla każdego auta. Tak więc - czy jest to w ogóle możliwe? @edit: Z tego co widzę, to jest to jak najbardziej możliwe, tylko teraz jak to oskryptować? @edit 2: Udało mi się zrobić takie coś, niestety - dźwięki nakładają się do siebie: -- Hotring: engineImportTXD(engineLoadTXD("hotring.txd"), 494) engineReplaceModel(engineLoadDFF("hotring.dff", 494), 494) -- Infernus: engineImportTXD(engineLoadTXD("infernus.txd"), 411) engineReplaceModel(engineLoadDFF("infernus.dff", 411), 411) -- Infernus - podmiana dźwięku: local FilePath = "Bank_001/sound_002.wav" local FilePath_2 = "Bank_002/sound_001.wav" local FilePath_3 = "Bank_002/sound_002.wav" function getElementSpeed(element, unit) if(unit == nil) then unit = 0 end if(isElement(element)) then local x, y, z = getElementVelocity(element) if(unit=="kph" or unit == 1 or unit =='1') then return (x^2 + y^2 + z^2) ^ 0.5 * 1.61 * 100 else return (x^2 + y^2 + z^2) ^ 0.5 * 100 end else outputDebugString("Nie mogę pobrać prędkości pojazdu.") return false end end addEventHandler("onClientRender", root, function(keyState) local vehicle = getPedOccupiedVehicle(localPlayer) if(vehicle) then if(keyState == "down") then local sound = playSound("Bank_002/sound_003.wav", false) setSoundVolume(sound, 0.05) setSoundMaxDistance(sound, 40) end if getElementSpeed(vehicle, "kmh") == 0 then StartNeutralEngineSound() elseif getElementSpeed(vehicle, "kmh") > 0 or getElementSpeed(vehicle, "kmh") < 400 then StartDriveSound() elseif getElementSpeed(vehicle, "kmh") > 0 then StartMaximumSound() else DestroySound() end end end) function StartNeutralEngineSound() -- if isElement(sound) then return false end sound = playSound(FilePath, false) setSoundVolume(sound, 0.05) setSoundMaxDistance(sound, 40) end function StartDriveSound() -- if isElement(sound2) then return false end if isElement(FilePath_2) then destroyElement(FilePath) end sound2 = playSound(FilePath_2, false) setSoundVolume(sound2, 0.05) setSoundMaxDistance(sound2, 40) end function StartMaximumSound() -- if isElement(sound3) then return false end if isElement(FilePath_3) then destroyElement(FilePath_2) end sound3 = playSound(FilePath_3, false) setSoundVolume(sound3, 0.05) setSoundMaxDistance(sound3, 40) end function DestroySound() if isElement(FilePath_3) or isElement(sound3) then destroyElement(FilePath_3) destroyElement(sound3) end end Link to comment
dzek (varez) Posted May 26, 2013 Share Posted May 26, 2013 Ciężko powiedzieć jak to jest wykonane. Nie wiem jak pobrać obroty silnika, jedynie aktualny bieg: https://wiki.multitheftauto.com/wiki/Get ... urrentGear Nie mam pojęcia też w jaki sposób zmodyfikować wysokość tonu (pitch) dźwięku. Swoją drogą - świetny zasób ten ktoś zrobił. Może popytaj autora w jaki sposób (jakich funkcji użył) pobiera obroty silnika i jak modyfikuje pitch dźwięku. Link to comment
Linux_Shines Posted May 26, 2013 Author Share Posted May 26, 2013 Ta funkcja działa... ale dosyć dziwnie i nie sprawdza dźwięku, jaki jest odtwarzany podczas jazdy, tylko losowo wyświetla zmianę biegów... Lecz - czy można byłoby zrobić takie coś, że dźwięki auta są modulowane, ewentualnie odtwarzane jeden po drugim? Już pal licho z biegami. Link to comment
dzek (varez) Posted May 26, 2013 Share Posted May 26, 2013 Cóż, GTA nigdy nie przejmowało się dobrą synchronizacją dźwięków i biegów (np. gdy gra się zwieszała podczas wciskania gazu - było słychać narastający dźwięk, potem zmianę biegu i narastający dźwięk - i tak w nieskończoność ). Ja bym dostosował zmiany biegów właśnie do wartości pokazywanych przez ww funkcję - samochodom można zmieniać biegi w handling i na pewno będzie to bardziej uniwersalne rozwiązanie. Nie wiem jak wyciszyć oryginalny dźwięk tylko pojazdów, ale przejrzałem za Ciebie wiki dokładniej i znalazłem to: https://wiki.multitheftauto.com/wiki/SetSoundProperties edit: najlepszy efekt uzyskasz przyklejając te dźwięki do samochodów (w 3D) - będzie fajny efekt, jak ktoś będzie przejeżdżał obok (w dodatku MTA samo ogarnie efekt dopplera) natomiast ten dźwięk nie będzie odtwarzany jako 3D dla graczy siedzących w danym pojeździe - żeby lepiej był słyszalny, lepiej odtwarzać go poza środowiskiem 3D. Link to comment
Linux_Shines Posted May 27, 2013 Author Share Posted May 27, 2013 Co do pobierania biegów - zauważyłem, że MTA stara się poprawnie interpretować biegi, wskutek czego nawet przy zmodyfikowanym handlingu wyświetla prawie dobrze odpowiednie biegi. A propos handlingu - w jaki sposób można zmieniać biegi? Bo w hedit nie widzę opcji zmiany długości jakiegoś biegu, tylko ogólna prędkość, etc. A co do edita - czy mógłbym Cię poprosić o jakiś pseudokod, ewentualnie przerobienie w odpowiedni sposób na pseudokod tego, co umieściłem w pierwszym poście? Bo właśnie ciężko mi ogarnąć przyklejanie dźwięków z tego powodu, że się na siebie nakładają (pewnie wina onClientRender). Link to comment
dzek (varez) Posted May 27, 2013 Share Posted May 27, 2013 https://wiki.multitheftauto.com/wiki/Han ... berOfGears na pewno to (+set) --- btw: WIKI!, któryś parametr powinien wpływać (miej lub bardziej) na to jaką maksymalną prędkość możemy uzyskać na danym biegu (tj. nie będzie to po kolei, raczej jedna wartość do wyliczenia) - na pewno maksymalna prędkość dźwięk odtwarzasz raz - w pętli - jak zrobisz nowy dźwięk co każdą klatkę to nic sensownego z tego nie będzie. więc przy tworzeniu/wsiadaniu do samochodu tworzysz dźwięk 3d, przyklejasz do samochodu, i w zależności od prędkości/biegu - nadajesz mu modulację. i tylko modulację zmieniasz w onClientRender Link to comment
Linux_Shines Posted May 28, 2013 Author Share Posted May 28, 2013 Wychodzi na to, że jednak powinienem jeszcze raz przejrzeć dokładniej wiki. I to dużo dokładniej. Tylko że San Andreas mi się ciągle psoci, jeżeli chodzi o te biegi... W każdym razie póki co to mam takie coś (głównie zmiana handlingu, nie zajmuję się jeszcze modulacją): -- Modyfikowanie prowadzenia się Infernusa: function InfernusTuning() infernus = 411 for _, veh in pairs(getElementsByType("vehicle")) do if getElementModel(veh) == infernus then setVehicleHandling(veh, "mass", 1000) setVehicleHandling(veh, "turnMass", 2000) setVehicleHandling(veh, "dragCoeff", 4) setVehicleHandling(veh, "centerOfMass", { 0, -0.1, -0.1 } ) setVehicleHandling(veh, "percentSubmerged", 80) setVehicleHandling(veh, "tractionMultiplier", 0.95) setVehicleHandling(veh, "tractionLoss", 0.9) setVehicleHandling(veh, "tractionBias", 0.42) setVehicleHandling(veh, "numberOfGears", 1)-- do testu, było 5) setVehicleHandling(veh, "maxVelocity", 420) setVehicleHandling(veh, "engineAcceleration", 22) setVehicleHandling(veh, "engineInertia", -0.1) setVehicleHandling(veh, "driveType", "awd") setVehicleHandling(veh, "engineType", "petrol") setVehicleHandling(veh, "brakeDeceleration", 6) setVehicleHandling(veh, "brakeBias", 0.5) setVehicleHandling(veh, "ABS", false) setVehicleHandling(veh, "steeringLock", 30) setVehicleHandling(veh, "suspensionForceLevel", 0.95) setVehicleHandling(veh, "suspensionDamping", 0.25) setVehicleHandling(veh, "suspensionHighSpeedDamping", 1.25) setVehicleHandling(veh, "suspensionUpperLimit", 0.2) setVehicleHandling(veh, "suspensionLowerLimit", -0.1) setVehicleHandling(veh, "suspensionFrontRearBias", 0.45) setVehicleHandling(veh, "suspensionAntiDiveMultiplier", 1) setVehicleHandling(veh, "seatOffsetDistance", 0.38) setVehicleHandling(veh, "collisionDamageMultiplier", 0.5) setVehicleHandling(veh, "monetary", 2000000) setVehicleHandling(veh, "modelFlags", 0x0) setVehicleHandling(veh, "handlingFlags", 0x1708803) setVehicleHandling(veh, "headLight", 1) setVehicleHandling(veh, "tailLight", 1) setVehicleHandling(veh, "animGroup", 1) end end end addEventHandler("onPlayerVehicleEnter", getRootElement(), InfernusTuning) Szkoda, że funkcje wymienione przez Ciebie nie są jakoś dokładniej opisane (w przykładach jest tylko "-- TODO"), bo gdy próbuję ich używać, interpreter w trakcie gry wypluwa attempt to call global handlingGetNumberOfGears (a nil value)a gdy używam kodu powyżej isetVehicleHandling(veh, "numberOfGears", 1) to auto ciągle przyspiesza do maksymalnej prędkości, tylko że zmienia jeden raz bieg i po prostu rozpędza się do tych 420 km/h... Link to comment
Wielebny Posted May 28, 2013 Share Posted May 28, 2013 function InfernusTuning() infernus = 411 for _, veh in pairs(getElementsByType("vehicle")) do if getElementModel(veh) == infernus then setVehicleHandling(veh, "mass", 1000) ... Zamiast tego możesz użyć (raz, nie dla każdego pojazdu osobno) funkcji setModelHandling(411, ... Szkoda, że funkcje wymienione przez Ciebie nie są jakoś dokładniej opisane (w przykładach jest tylko "-- TODO"), bo gdy próbuję ich używać, interpreter w trakcie gry wypluwa attempt to call global handlingGetNumberOfGears (a nil value) http://code.google.com/p/mtasa-blue/sou ... lingDefs.h Ta funkcja nie została jeszcze napisana. Powinieś użyć setVehicleHandling(veh, "numberOfGears", ...) a gdy używam kodu powyżej isetVehicleHandling(veh, "numberOfGears", 1) to auto ciągle przyspiesza do maksymalnej prędkości, tylko że zmienia jeden raz bieg i po prostu rozpędza się do tych 420 km/h... Działa zgodnie z założeniem - ustawiasz że auto ma tylko jeden bieg, to ma tylko jeden. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now