I have a question about music

BlitzPlus Forums/BlitzPlus Beginners Area/I have a question about music

En929(Posted 2011) [#1]
I'm trying to find out what do I add to my game program below if I want to change the music each time my character collides with a door? Details about what I'm trying to do is below inside some brackets (so that my problem could be easier to find):



Graphics 1640, 1000 


HENRY = LoadAnimImage ("HenryMoveAroundIII.PNG",400,370,0,14)
BACKGROUND = LoadImage ("DockII.jpg")
BACKGROUND2= LoadImage ("My Backyard2.png")
DOOR = LoadImage ("Door.png")
DOOR2 = LoadImage ("Door3.png")

;----------------------------------------------------------------------------------------------------------------------------
		             ;MUSIC
		             ;------
	;Below is the music that I want to have played 
									
						

MUSIC = PlayMusic ("EarthToneNewFire.wav") ;This music starts from the very beginning when my charcter HENRY
hasn't collided with a door.

MUSIC2 = LoadSound ("04 Gianni Schicchi- O mio babbino caro.wav") ;This music starts when my charcter 
HAS collided with the FIRST door and hence, it turns off the beginning music.	

MUSIC3 = LoadSound ("Way back.wav"); This music starts when my character has collided with the SECOND door and hence, turns off
; the music from when my character collided with the first door.

;---------------------------------------------------------------------------------------------------------------------------



Type HENRY
	Field x,y
	Field frame
End Type

Type DOOR
	Field x,y
End Type 

Type DOOR2
	Field x,y
End Type 

Type BACKGROUND
	Field x,y
	Field image
End Type 


h.HENRY = New HENRY

h\x = 500
h\y = 250
h\frame = 0

door1st.DOOR = New DOOR
door1st\x = 500
door1st\y = 25

door2nd.DOOR2 = New DOOR2
door2nd\x = 700
door2nd\y = 110


b.BACKGROUND = New BACKGROUND
b\x = 100
b\y = 0
b\image = BACKGROUND





While Not KeyDown(1)

   Cls 
				
TileImage (b\image,b\x,b\y)

   If KeyHit(25)	
      h\frame = h\frame + 1
      If  h\frame > 7
         h\frame = 6	
      EndIf
      ;
      If h\frame < 6
         h\frame = 6
      EndIf					
   EndIf					
				
  

   If KeyHit(24)	
      h\frame = h\frame + 1
      If  h\frame > 9
         h\frame = 8	
      EndIf
      
         h\frame = 8
      EndIf					
   	



   If KeyDown(205)
      h\x = h\x + 3
      h\frame = h\frame + 1
      If h\frame > 2 Then 
         h\frame = 1
      EndIf
 
      If h\frame < 0
         h\frame = 0
      EndIf
   EndIf


   If KeyDown(203)
      h\x = h\x - 3
      h\frame = h\frame + 1
      If h\frame > 5 Then 
         h\frame = 4
      EndIf
    
      If h\frame < 4
         h\frame = 4
      EndIf
   EndIf

;-------------------------------------------------------
;Inside these brackets is the part I need help with 
;-------------------------------------------------------	   







If ImagesCollide (HENRY, h\x, h\y,0,DOOR, door1st\x, door1st\y,0) Then 
      
      door1st\x = 300000        ;When HENRY collides with this 
                                 ;door1st\x, it stops the beginning music 
                                 ;and changes to a new song

		


				
						
	door2nd\x = 100
	door2nd\y = 250
	b\image = BACKGROUND2


  EndIf 


If ImagesCollide (HENRY, h\x, h\y,0,DOOR2, door2nd\x, door2nd\y,0) Then 
      

              door2nd\x = 700000	 ;When HENRY collides with 
                                               ;door2nd\x, it stops the music from the   
                                               ;FIRST door and changes to a new song   
                                               ;again.
							
						
				





		
             b\image = BACKGROUND2
						

						
						
 EndIf 



;--------------------------------------------------------------------
;Thanks, from here that would be all the help I need for now.
;I'll come back if I have anymore questions.
;--------------------------------------------------------------------


DrawImage (DOOR, door1st\x,door1st\y)
DrawImage (DOOR2, door2nd\x,door2nd\y)
DrawImage (HENRY,h\x,h\y,h\frame)

	

   Flip

Wend 



Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011

Last edited 2011


Moore(Posted 2011) [#2]
The code below is just a direct port of your psuedo code. But the best solution I can think of is to have all you music loaded, looped and paused (loadsound(filename.wav, 3)) in an array. Then use a global variable to track the current song and a simple state machine to update the music....

global current_song = 0
music1 = loadsound("filename.wav")
music2 = loadsound("filename.wav")
music3 = loadsound("filename.wav")

dim songs(2)
songs(0) = Playsound(music1,3)
songs(1) = Playsound(music2,3)
songs(2) = Playsound(music3,3)

while true
; handel input
; handel events
If (character collides with a door) then
change_music(door_number)
EndIf
; render graphic
Wend
End

Function change_music(index)
StopChannel(songs(current_channel))
ResumeChannel(songs(index))
current_channel = index
End Function




En929(Posted 2011) [#3]
Thanks Moore, it worked!