Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ääni, kun näppäin ylös?

Sivun loppuun

Banzki [30.12.2007 03:38:41]

#

Hakusessa olisi ohjelma mikä toistaisi valitun äänitiedoston kun valitun näppäimen päästää ylös.

Esimerkiksi: A-näppäin pohjassa = Ei ääntä A-näppäin ylös = toistaa: /äänet/tuut.wav

Ja ei kiitos mitään aivan kamalaa hepreaa. :D Kaikenlaiset scriptien, cfg:den sun muiden muokkaukset onnistuu mutta ei koodin kirjoitus tai ymmärtäminen.

Newb [30.12.2007 05:11:09]

#

VB, QB...?

Banzki [30.12.2007 06:00:01]

#

VB 6.0....

Const SND_SYNC = &H0
Const SND_ASYNC = &H1
Const SND_NODEFAULT = &H2
Const SND_MEMORY = &H4
Const SND_LOOP = &H8
Const SND_NOSTOP = &H10
Const SND_PURGE = &H40
Const SND_NOWAIT = &H2000
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Const SND_ALIAS = &H10000
Const SND_FILENAME = &H20000
Const SND_RESOURCE = &H40004
Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long


  If waveOutGetNumDevs() <> 0 Then PlaySound sound, 0, SND_ASYNC


Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


  If waveOutGetNumDevs() <> 0 And GetAsyncKeyState(38)  Then PlaySound sound, 0, SND_ASYNC

Joku laittoi tämän tapaista koodia vinkiksi eräällä toisella foorumilla. Itse en osaa katsoa onko tuossa järkeä, teiltä varmaan saa ihan suomeksi selvennystä. :P

(Mod. Edit. Kooditagit.)

Newb [30.12.2007 06:33:28]

#

'API-määrittelyt
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'PlaySoundia käytetään wav-tiedoston soittamiseen
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
'GetASynckeyStatea käytetään näppäinpainallusten havaitsemiseen



Private Sub Form_Load()

    Timer1.Interval = 1 'Vaihdetaan Timer1.Interval 1 millisekkaan

End Sub

Private Sub Timer1_Timer()

    If GetAsyncKeyState(65) = False Then 'A-näppäimen näppäinkoodi on 65, eli jos A-näppäintä ei paineta, niin:
     PlaySound "C:\tuut.wav", 0, 0 'soitetaan tuut.wav

End Sub

Eli tää ohjelma soittaa jatkuvasti C:\tuut.wav-tiedostoo, ellei A-näppäin ole pohjassa. Formi tarvii siis Timer1-nimisen timerin.

Banzki [30.12.2007 06:58:50]

#

Mutta tarviiko tuota Timeria jos se halutaan vain kerran soittaa sen jälkeen kun näppäimestä on päästetty? Käykö siihen joku Loop = false tai joku jos haluaa sen loppuvan yhden soittokerran jälkeen? Siis että ohjelma ei sulkeutuisi, vaan että ääni loppuisi kunnes äänen pituus loppuu kesken tai painetaan uudestaan sitä näppäintä? Entä mistä mä löydän sen että millä numerolla mikäkin näppäin toimii? Laskemalla vasemmasta yläkulmasta eteenpäin vai? =D


Sori näistä "nuubimaisista" kysymyksistä, muttakun ensimmäistä kertaa yritän saada jotain aikaiseksi jollain ihan oikealla ohjelmointihässäkällä. :)


Edit: Siis että jos Timer menee millisekunneissa, niin se ei vaikuta siihen soiko ääni kuinka monta kertaa? Vai meinaatko Timerilla että se soittaisi vain kerran, ja siihen tarttis sitä?


Edit2: Tuohon näppäimen koodiin se valittaa että: Invalid outside procedure

Kaiketi puuttuu pätkä jotain kriittistä koodia? =P

Newb [30.12.2007 07:06:01]

#

Näppäinkoodit löytyy täältä

Joku muu varmaan jaksaa vastailla..Nukkumaan ->

EDIT: Jep...tota vikaa End Subia ennen pitäis tulla End If

Banzki [30.12.2007 07:10:42]

#

Tuolta ei löydy näppäinkoodia ylöspäin nuolelle, mikä on kuitenkin yksi kriittisistä osista tätä koko juttua :F


Juu :DD

Newb [30.12.2007 07:13:03]

#

On se siellä, 38.

Banzki [30.12.2007 07:17:20]

#

Aaa hitto niin onkin. Mutta mitä tuo Invalid outside procedure meinaa ;o

Newb [30.12.2007 07:25:03]

#

Se tarkoittaa, että joku "proseduuri"/koodi/w.e ei oo subin/funktion sisällä. Tosta koodipätkästä puuttu siis End If, eli sen pitäis näyttää tältä

'API-määrittelyt
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
'PlaySoundia käytetään wav-tiedoston soittamiseen
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
'GetASynckeyStatea käytetään näppäinpainallusten havaitsemiseen



Private Sub Form_Load()

    Timer1.Interval = 1 'Vaihdetaan Timer1.Interval 1 millisekkaan

End Sub


Private Sub Timer1_Timer()

    If GetAsyncKeyState(65) = False Then 'A-näppäimen näppäinkoodi on 65, eli jos A-näppäintä ei paineta, niin:
     PlaySound "C:\tuut.wav", 0, 0 'soitetaan tuut.wav
    End If

End Sub

Tollasena se toimi mulla.

Banzki [30.12.2007 07:28:07]

#

Pitää kokeilla...


Nonii =D Nyt kuullostaa hyvältä. Miten tuon looppauksen saa menemään vain kerran?

Joku End Loop If juttu? :o

Taisikin löytyä tuo satunnaisjuttu jo...

Banzki [30.12.2007 08:38:43]

#

Hmm... Eli jos otan Timerin pois ton looppauksenkin pitäisi jäädä pois? Ellen kasvata Intervalia vaikka miljoonaan millisekuntiin? :p


Edit: Äääh, nyt kun sitä kasvattaa menee vain pidempään ennenkuin ääni toistuu kun päästää näpykästä irti.


Teidän on varmaan hauska lukea näitä muiden ongelmia :D


Miten ton Looppauksen saa jäämään pois mutta että tuo äänitiedosto kuitenkin toistuisi uusiksi sen jälkeen kun sitä valittua nappulaa on taas painettu ja nostettu ylös ja että äänen toisto loppuisi kun painaa sitä nappulaa taas :f


Sori kun pyytelen täällä valmista koodia.. Muttakun mä en itse osaa tätä melkein ollenkaan. Mutta olisi kiva kun joku tekisi tuon koodin valmiiksi ja minä muokkaisin sen lopulliseen oikeaan muotoon (tiedostojen dir:t ja nimet)


Oli miten oli, kiitos kuitenkin :D

Newb [30.12.2007 09:17:10]

#

No täs olis yks tapa, mut nyt ei oo GetAsyncKeyState käytössä vaan KeyPress-aliohjelma. Eli tää tarvii ohjelman fokuksen.

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long

Private Sub Form_KeyPress(nappi As Integer)

    If nappi = 97 Then 'jos formissa painetaan A-näppäintä, niin...

        If Timer1.Enabled = True Then 'ja jos Timer1 on käytössä, ni...

            Timer1.Enabled = False 'poistetaan se käytöstä

        Else

            Timer1.Enabled = True 'tai jos se on jo pois käytöstä, ni laitetaa se päälle

        End If

    End If

End Sub

Private Sub Form_Load()

    Timer1.Interval = 1

End Sub

Private Sub Timer1_Timer()

        PlaySound "C:\tuut.wav", 0, 0 'soitetaa "C:\tuut.wav"

End Sub

Toi koodi siis ottaa timer1:n aina käyttöön (tai ottaa pois käytöstä), ku A-näppäintä painetaa formilla.

KeyPressillä ei vaan taida nuolinäppäinten lukeminen onnistua (?), ja nää vois helpottaa oppimista vähä.

Banzki [30.12.2007 09:44:52]

#

Ei toimi halutulla tavalla tuo.. =/ Toi olisi muuten tosi hyvä, muttakun tuo on on/off tyyppinen. Kun sen pitäisi kutakuinkin mennä näin:

Ylöspäin nuolinäppäin pohjassa = Ei kuulu mitään.
Ylöspäin nuolinäppäin ylhäällä = Toistaa *.wav tiedoston kerran.


Ja se on varmaan hankalaa saada toimimaan samaan aikaan kun jokin peli on päällä...


"Iiiisiii, miksei susta tullu Pill Keitsiä" : D


Ja mulla on tuo VB-Käsikirja, ihan kirjana kirjana. Ja olen yrittänyt katsoa Koodivinkeistä noista *.wav tiedostojen toistosta mallia. Ja kyllä varmaan ymmärrätte että kun ei sinänsä ohjelmointihommat kiinnosta, niin sitä on vaikea lähteä harjoittelemaan... Ainoa syy minkä takia tämänkin "yritän" "opetella", on että koitan vain saada eräästä pelistä sellaisen kuin haluan sen olevan. Samasta syystä olen olen noiden scriptejen sun muiden muokkausta "harjoitellut".

No olipahan avautuminen :D


Toi aikaisempi olisi paljon parempi, jos sen vain saisi lopettamaan sen äänen looppaamisen sen yhden kerran jälkeen.

pohjassa: ratatatatatatataatatatata ylös: tuut
taas pohjaan: ratatatatatatatatata ylös: tuut

:D

Metabolix [30.12.2007 10:53:07]

#

Kuulepa, omaakin ajattelua suositellaan. Haluat, että ääni soi, kun nappi nostetaan ylös. VB:ssä on KeyUp-tapahtuma, eikö olekin? Olisiko se siis ehkä loogisempi paikka äänen soittamiselle?

Banzki [30.12.2007 14:45:29]

#

Tänään aamulla vasta pari tuntia harjoittelin tuota, so there`s more to learn. Pitää katsoa jos tuosta käsikirjasta löytyisi juttua siitä KeyUp:sta :P

Banzki [30.12.2007 18:55:01]

#

En saa KeyUp:ia toimimaan...

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long




Private Sub Form_KeyUp()



End Sub





     If Form_KeyUp(38) Then
     PlaySound "\scaniaturbosurge.wav", 0, 0




    End If

End Sub

Antti Laaksonen [30.12.2007 19:08:34]

#

Kokeilepa tätä koodia:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyUp Then
        PlaySound "c:\oma\testi.wav", 0, 0
    End If
End Sub

Private Sub Form_Load()
    KeyPreview = True
End Sub

Vakio vbKeyUp tarkoittaa samaa kuin luku 38, tuosta vain näkee selvemmin, mitä näppäintä tutkitaan.

Banzki [30.12.2007 21:23:58]

#

Toistaa kuten pitääkin! Muttamutta, mä en haluaisi masentaa ketään, mutta nyt tuo ei sitten taas sitten toimi jos on joku toinen ikkuna auki sen päällä, eli tuota ei saa alapalkkiin piiloon ja peliä auki siihen päälle niin, että se toistaisi tuon äänen vaikka on se peli auki. =/

Tähän mennessä parhain idea on ollut tuo Time1.Interval muttakun se looppaa sitä äänitiedostoa kokoajan jos ei paina ylöspäin nuolta pohjassa.

Hankala juttu.


Entä osaako joku tehdä tuollaisen koodin jollain muulla kielellä? Ei sen pakko ole VB olla, tuo vaan nyt on koneella.

Antti Laaksonen [30.12.2007 21:35:19]

#

Tämän pitäisi soittaa ääni, kun lopettaa näppäimen painamisen:

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Form_Load()
    Timer1.Interval = 50
    GetAsyncKeyState vbKeyUp
End Sub

Private Sub Timer1_Timer()
    Static muutos As Boolean
    If GetAsyncKeyState(vbKeyUp) And 1 Then
        muutos = True
    End If
    If GetAsyncKeyState(vbKeyUp) = 0 And muutos Then
        PlaySound "c:\oma\testi.wav", 0, 0
        muutos = False
    End If
End Sub

Banzki [31.12.2007 16:07:10]

#

Jee!! Kiitos =DD Toimii aivan kuten pitääkin =D

Erittäin suuret kiitokset tästä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta