Shell   23-06-2023, 00:17
#1
Buenas!.

Es un juego infantil que hice para resolver una duda que tengo con los sonidos.
A ver si podeís ayudarme.

[Imagen: q817Q94.png]

- Se hace clic en el botón de reproducir el sonido y luego se hace clic en el animal que crees que hace ese sonido.

Como es lógico para un adulto no tiene problema. Ok, cuando se acierta se escucharán los aplausos.
Y ahora viene la pregunta.  Si le doy a reproducir sonido de animal, escucharé dos sonidos a la vez.
Los aplausos y el del animal.

¿ Cómo se podría hacer para que los aplausos cesasen y solo se escuchase el sonido del animal ?.

En realidad hice este ejemplo con la escusa de resolver esta duda. Lo necesito para otro ejemplo. Smile

El código fuente:

FMain:

Código:
' Gambas class file

Const MENSAJE As String = "Haz clic en la imagen del animal que hace ese soindo"

Private canimales As New Collection
Private rutaimagenes As String
Private rutasonidos As String

Private sonidoerror As Sound
Private aplausos As Sound
Private adivinaanimal As String

Public Sub Form_Open()

  Label1.text = MENSAJE
  Me.Text = "Adivina el animal"
 
  rutaimagenes = Application.Path &/ "Imagenes/"
  rutasonidos = Application.Path &/ "Sonidos/"
  sonidoerror = Sound.Load(Application.Path &/ "Sonidos/error.ogg")
  aplausos = Sound.Load(Application.Path &/ "Sonidos/aplausosfin.ogg")
  CreaAnimales()

  Randomize
  DistribuirAnimales

  Timer1.Delay = 3000
  Panel1.Enabled = False

End

Public Sub CreaAnimales()

  CreaObjetoAnimal(rutasonidos, rutaimagenes, "01_cat.png", "gato.wav", "gato")
  CreaObjetoAnimal(rutasonidos, rutaimagenes, "02_pig.png", "cerdo.ogg", "cerdo")
  CreaObjetoAnimal(rutasonidos, rutaimagenes, "04_hippopotamus.png", "hipopotamo.ogg", "hipopotamo")
  CreaObjetoAnimal(rutasonidos, rutaimagenes, "10_chicken.png", "gallina.ogg", "gallina")

End

Public Sub CreaObjetoAnimal(rutasonidos As String, rutaimagenes As String, dibujo As String, sonido As String, nombre As String)

  Dim animal As New Animal

  With animal
    .dibujo = Picture.Load(rutaimagenes & dibujo)
    .sonido = rutasonidos & sonido
    .nombre = nombre
  End With

  canimales.Add(animal, animal.nombre)

End

Public Function DevolverListaNombres(clista As Collection) As String[]

  Dim lista As New String[]
  Dim animal As Animal

  For Each animal In clista
    lista.Add(animal.nombre)
  Next
  Return lista

End

Public Sub DistribuirAnimales()

  Dim unpicturebox As PictureBox
  Dim aanimales As String[]
  Dim azar As Integer
  Dim fondo As Integer[] = [Color.red, Color.green, Color.Blue, Color.Yellow]

  aanimales = DevolverListaNombres(canimales)

  For Each unpicturebox In Panel1.Children
    If unpicturebox Is PictureBox Then
      azar = Rand(aanimales.Max)
      With unpicturebox
        .Mode = PictureBox.Fill
        .Tag = aanimales[azar]
        .Picture = canimales[aanimales[azar]].dibujo
        .Background = fondo[azar]
      End With
      aanimales.Remove(azar)
      fondo.Remove(azar)
    Endif
  Next

  Panel1.Enabled = False
 
End

Public Sub ImagenesDeAnimales_MouseDown()

  If Last.tag = adivinaanimal Then
    Label1.Text = "Correcto!"
    aplausos.Play()
  Else
    Label1.Text = "Incorrecto!"
    sonidoerror.Play()
  Endif
  Panel1.Enabled = False
  Timer1.Start()
   
End

Public Sub btnReproduce_Click()

  Dim lista As String[]
  Dim azar As Integer

  Panel1.Enabled = True  
  lista = DevolverListaNombres(canimales)

  azar = Rand(lista.Max)
  adivinaanimal = lista[azar]
  canimales[adivinaanimal].ReproducirSonido()

End

Public Sub Timer1_Timer()

  Label1.Text = MENSAJE
  DistribuirAnimales()
  Timer1.Stop

End

Clase Animal:

Código:
Property nombre As String Use $nombre
Property sonido As String Use $sonido
Property dibujo As Picture Use $dibujo


Public Sub ReproducirSonido()
 
  Dim ssonido As Sound
 
  ssonido = Sound.Load(Me.sonido)
  ssonido.Play()
 
End

Os subo el ejemplo del juego de los sonidos.

¿ Qué me podéis aconsejar cuando trabaje con sonidos y uso el componente gb.sdl2.audio ?.

Saludos
Última modificación: 23-06-2023, 11:30 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   23-06-2023, 09:53
#2
Sorry, nunca he usado ese componente. Prueba a soslayar el problema con un "Bieeennn", que dure un segundo. Así no se te montan... supongo.

Saludos

No podemos regresar
Shell   23-06-2023, 10:28
#3
(23-06-2023, 09:53)Shordi escribió: Sorry, nunca he usado ese componente. Prueba a soslayar el problema con un "Bieeennn", que dure un segundo. Así no se te montan... supongo.

Big Grin 
 ¿ Entones como estás reproduciendo sonidos en tus aplicaciones ?. Huh
( ¿ Una aplicación externa ?). Castigado!. A escribir solo usaré aplicaciones externas cuando Gambas no me de esa posibilidad. Shy

Se podía cambiar el sonido pero no es una solución que resuelva el problema

Imagina una orquesta. Suenan los instrumentos de cuerdas por un lado, por otro lado los de percusión, etc.
Y quieres que los de una clase de instrumentos dejen de funcionar (pararlos) y que solo suene los que te interesa,
Ese es otro ejemplo más a solucionar.

En su día vi los ejemplos de Vuott, que se de sobra que le gusta el tema del sonido, sobre todo los midis.
Pero no acabé de entender el uso de canales de sonido.

Reproduces un sonido, pero, ¿ en que canal se encuentra ese sonido?. Esto es lo que lo para.
Pero claro, ¿ cómo sabes que el sonido "x" se reproduce en el canal 1 o el canal 2, etc ?.

Puedes reproducir un sonido mediante la clase Sound o la clase Channel.
Lo más socorrido es usar Sound, pero si ya te interesa pausar, parar, se usa Channel.
Aun así el juego que estoy desarrollando me suenan los dos sonidos a la vez y solo quiero que reproduzca uno.

También se puede "esperar" a que termine de reproducir el sonido y que luego comience el siguiente, pero no es
lo que me interesa, o sí por que es breve, no es tan largo como los aplausos.

A ver si el maestro de orquesta "Vuott" me ha entendido. Seguro que si, ya que estuvo el verano anterior con dos españolas.
 

Como hemos tratado temas similares en el foro ( en el antiguo )
Este es el enlace en el antiguo foro de Gambas-es que lleva a la wiki de la comunidad de Italia sobre el tema del componente gb.sdl2.audio.

Utilizar El Nuevo Componente Gb.sdl2.audio

Pero aún así a ver que responde Vuott.

Saludos
Última modificación: 23-06-2023, 10:41 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   23-06-2023, 11:16
#4
Shell, tienes que cargar el archivo a reproducir cada vez que el archivo sea dirferente.
                
Código:
Music.Stop()
Music.Load($File)
Music.Play()

Donde $File es el sondo de turno a reproducir.

1 Saludo.
Shell   23-06-2023, 11:28
#5
Hola Tincho.
 
(23-06-2023, 11:16)tincho escribió: Shell, tienes que cargar el archivo a reproducir cada vez que el archivo sea dirferente.

No se me había ocurrido ese método.

Al final lo hice de otra forma y acabo de de ver tu respuesta ahora.
He usado canales de sonido.

Voy a mostraros la parte del código donde se hace referencia a estos.

El Form_Open()

Código:
Public Sub Form_Open()

  Label1.text = MENSAJE
  Me.Text = "Adivina el animal"
 
  rutaimagenes = Application.Path &/ "Imagenes/"
  rutasonidos = Application.Path &/ "Sonidos/"
  sonidoerror = Sound.Load(Application.Path &/ "Sonidos/error.ogg")
  aplausos = Sound.Load(Application.Path &/ "Sonidos/aplausosfin.ogg")
  CreaAnimales()

  Randomize
  DistribuirAnimales

  'En el canal1 se va a reproducir los sonidos de los animales y el de error
  'En el canal2 se va a reproducir los aplausos
 
  Channels.Count = 2
  canal1 = Channels[0]
  canal2 = Channels[1]
 
  Timer1.Delay = 3000
  Panel1.Enabled = False

End

Cuando se crea el evento MouseDown sobre la imagen del animal.

Código:
Public Sub ImagenesDeAnimales_MouseDown()

  Panel1.Enabled = True
  If Last.tag = adivinaanimal Then
    Label1.Text = "Correcto!"
    canal1.Stop
    canal2.Play(aplausos)    
  Else
    Label1.Text = "Incorrecto!"
    canal1.Play(sonidoerror)
  Endif
 
  Timer1.Start()
   
End

Y cuando se le da al botón reproducir

Código:
Public Sub btnReproduce_Click()

  Dim lista As String[]
  Dim azar As Integer

  Panel1.Enabled = True  
  lista = DevolverListaNombres(canimales)

  azar = Rand(lista.Max)
  adivinaanimal = lista[azar]
  canimales[adivinaanimal].ReproducirSonido(canal1, canal2)
   

End

La clase Animal queda así:

Código:
Property nombre As String Use $nombre
Property sonido As String Use $sonido
Property dibujo As Picture Use $dibujo


Public Sub ReproducirSonido(c1 As Channel, c2 As Channel)
 
  Dim ssonido As Sound
 
  ssonido = Sound.Load(Me.sonido)
 
  'Paramos el canal de los aplausos  
  c2.Stop
  'Hacemos sonar el canal dedicado a los sonidos de los animales y para el sonido de error
  c1.Play(ssonido)  
   
End

Uno de los problemas que me estaba encontrando era la activación del panel que lo solucioné es que el jugador no
puede hacer clic (sé que es mousedown) sobre las imágenes de los animales si antes no haber no haber hecho clic en el botón
de reproducir sonido. El estado del panel cambia.

Subo la nueva versión del código. Los aplausos cesan y el sonido del animal suena.

Saludos
Archivos adjuntos
.gz
AdivinaElAnimal-0.0.2.tar.gz (Tamaño: 367.66 KB Descargas: 2)
Última modificación: 23-06-2023, 11:30 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   23-06-2023, 18:23
#6
Aún estaba creando molestias la opción de estar activo el panel que contiene las imágenes cuando no debe estarlo.
Esto deberá solucionar el problema.

Al hacer clic sobre la imagen, se activa el panel y luego se desactiva
Código:
Public Sub ImagenesDeAnimales_MouseDown()

  Panel1.Enabled = True
  If Last.tag = adivinaanimal Then
    Label1.Text = "Correcto!"
    canal1.Stop
    canal2.Play(aplausos)
  Else
    Label1.Text = "Incorrecto!"
    canal1.Play(sonidoerror)
  Endif
  Panel1.Enabled = False
 
  Timer1.Start()
   
End

Y cuando se le da al botón de reproducir el sonido para que al final del código de este active el panel de nuevo.

Código:
Public Sub btnReproduce_Click()

  Dim lista As String[]
  Dim azar As Integer
 
  lista = DevolverListaNombres(canimales)

  azar = Rand(lista.Max)
  adivinaanimal = lista[azar]
  canimales[adivinaanimal].ReproducirSonido(canal1, canal2)
  Panel1.Enabled = True     

End

Aún queda que se muestre un mensaje diciéndole al jugador que pulse el botón, una vez acierte o falle.

Como ven no hay un proyecto que no haya que estar revisando y revisando su correcto funcionamiento y
luego si se le añaden características nuevas.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 5 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.