Sonido y respuesta háptica
Reproduce efectos de sonido y retroalimentación háptica local.
Usa la API SFX para reproducir efectos de sonido cortos (clics de la interfaz, pasos, impactos) y audio simple en bucle (bucles ambientales, música).
Actualmente solo codificados en PCM .wav se admiten archivos. Si tienes un .wav que no se importe/reproduzca, conviértelo a PCM usando Audacity (o una herramienta similar).
Inicio rápido (reproducir un sonido)
click := get_asset(SFX_Asset, "sfx/click.wav");
desc := SFX.default_sfx_desc();
SFX.play(click, desc);Referencia de la API SFX
SFX_Asset :: class : Asset {}
SFX_Channel :: enum {
SFX;
MUSIC;
}
SFX_Desc :: struct {
specific_to_player: Player;
positional: bool;
position: v2 #read_only;
delay: float;
volume: float;
speed: float;
volume_perturb: float;
speed_perturb: float;
range_multiplier: float;
loop_timeout: float;
entity_to_follow: u64;
loop: bool;
channel: SFX_Channel;
unique_id: u64;
set_position :: method(p: v2);
}
SFX :: struct {
play :: proc(asset: SFX_Asset, desc: SFX_Desc) -> u64;
stop :: proc(id: u64);
fade_out_and_stop :: proc(id: u64, fade_time: float);
default_sfx_desc :: proc() -> SFX_Desc;
}Obtener un SFX_Asset
Los efectos de sonido viven en la carpeta res de tu juego (a menudo bajo res/sfx/).
Arrastra sonidos desde el Catálogo de recursos (el editor los descarga en
res/)O añade tu propio
.wavarchivo enres/desde tu máquina local
Luego refiérete a ellos por su ruta:
Comprueba las rutas de los recursos durante el desarrollo. Un recurso faltante produce un handle nulo; SFX.play registra una advertencia y devuelve 0.
Sonidos posicionales (tipo 3D)
Por defecto, SFX se reproduce como un sonido “2D” no posicional. Para hacerlo posicional, establece una posición:
Siguiendo una entidad (fuente de sonido en movimiento)
Si un sonido debe moverse con una entidad (zumbido del motor, proyectil zumbador, etc.), establece entity_to_follow:
Sonidos dirigidos a un jugador
Establece specific_to_player cuando el servidor deba rastrear el sonido pero solo un cliente deba oírlo realmente:
Reproducción en bucle + detención
SFX.play devuelve un ID que puedes detener más tarde:
Sonidos repetidos rápidamente y variación
Para sonidos repetitivos rápidos como pasos o armas automáticas, asigna a cada evento lógico un ID único. Asocia un índice de evento monótono sincronizado a su entidad origen cuando el sonido no siga a esa entidad:
El mismo evento lógico debe conservar el mismo ID único en el cliente, el servidor y cada resimulación. Cada evento cercano distinto debe obtener un valor diferente. Derívalo solo de un índice de evento que esté sincronizado y sea estable durante la predicción. entity_to_follow participa en la identidad del sonido, así que cuando se asigne, usa el índice del evento directamente en lugar de mezclar el ID de la entidad en ID único.
Una variación sutil puede evitar que los sonidos reproducidos con frecuencia se vuelvan monótonos:
Predicción y asignación de objetivo
Llama a los sonidos de gameplay desde la misma ruta predicha compartida que el evento que los causó. El sistema de sonido reconcilia el sonido predicho de un cliente con el resultado del servidor, así que no envuelvas SFX.play en Game.is_server() o player.is_local().
Para un sonido que solo un jugador debe oír, establece desc.specific_to_player. Esto mantiene el evento en el código de gameplay compartido mientras dirige la reproducción al cliente de ese jugador.
Hápticos
Haptics.play_impact activa la respuesta háptica de impacto en el dispositivo local. Llámalo solo para el jugador local:
Elige .LIGHT, .MEDIUM, o .HEAVY. Los hápticos actualmente funcionan en iOS. Las llamadas en Android, la web, Windows y los servidores no hacen nada.
Los hápticos no se sincronizan, no se dirigen ni se deduplican. Actívalos en el punto de interacción local en lugar de desde código de gameplay de toda la escena.
Última actualización