Jump to content

Zapytanie o pobranie długości dźwięku pojazdu


Recommended Posts

Heloł, ledwo zamknąłem poprzedni temat, a już tworzę kolejny. No ale... Mniejsza z tym... :wink:

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

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

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

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ść :P).

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

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

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ść :P

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

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... :D

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 i
setVehicleHandling(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
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 i
setVehicleHandling(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

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...