Code archives/User Input/ImageMap
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Creating a simple 'imagemap' system is the easiest way to create a simple GUI. A imagemap is is single graphic image containing more than one clickable areas often called HotSpots that link to a url. They're many Free ImageMap Editors that output html map files defining the hotspots. So, you just load your pre-drawn image, draw your hotspots, and save. I've written a simple html map loader. It will only recognize RECTangle shaped hotspots, but its a simple start. Copy the image and code and give it a try! test.jpg ![]() test.htm Html Map file generated with Map This! 1.3 | |||||
;ImageMap by Frankie 'TechLord' Taylor 12/06/2004
Const IMAGEMAP_AREA_MAX%=256
Global imagemapCurrent.imagemap
Type imagemap
;Purpose: Store Image and HotSpots
Field id%
Field name$
Field x#
Field y#
Field imgsrc$
Field image%
Field hotspots%
Field hotspot.hotspot[IMAGEMAP_AREA_MAX%]
Field state%
End Type
Type hotspot
;Purpose: Stores Coords, target, and command information
Field id%
Field typeid%
Field coord[3]
Field target$
Field command$
Field state%
End Type
Function imagemapLoad.imagemap(imagemapname$,imagemapfilename$,imagemapsrcname$="")
;Purpose: Parses html client side imagemap file.
;Parameters:
; imagemapname$ - name of imagemap. Can be used for reference purposes.
; imagemapfilename$ - html map file name, *.htm extension not required.
; imagemapsrcname$ - image file name. Valid map format extension required.
;Return:
imagemapfile%=OpenFile(imagemapfilename+".htm") ;*.map
If Not imagemapfile% Return Null
While Not Eof(imagemapfile%)
imagemapfileline$=Lower(ReadLine(imagemapfile%))
imagemapfilelinelength%=Len(imagemapfileline$)
For loop% = 1 To imagemapfilelinelength%
imagemapchar$=Mid$(imagemapfileline$,loop%,1)
Select imagemapchar$
Case " ","<",">","=",Chr(34),Chr(39)
;ignor whitespace and tags
imagemapword$=nil$
Default
imagemapword$=imagemapword$+imagemapchar$
End Select
Select imagemapword$
Case "name"
this.imagemap=New imagemap
this\imgsrc$=imagemapsrcname$
this\image%=LoadImage(this\imgsrc$)
this\name$=imagemapname$
this\state%=1
Case "area"
this\hotspots%=this\hotspots%+1
this\hotspot[this\hotspots%] = New hotspot
hotspot.hotspot=this\hotspot[this\hotspots%] ;testing
Case "coords" ;coords define shape, rect by by limitation
For loop% = loop%+1 To imagemapfilelinelength%
imagemapchar$=Mid$(imagemapfileline$,loop%,1)
Select imagemapchar$
Case "="," "
hotspotcoord%=0
imagemapword$=nil$
Case ","
this\hotspot[this\hotspots%]\coord[hotspotcoord%]=imagemapword$
hotspotcoord%=hotspotcoord%+1
imagemapword$=nil$
Case Chr(34),Chr(39);quotes
If hotspotcoord%>0 Or imagemapword$<>nil$
this\hotspot[this\hotspots%]\coord[hotspotcoord%]=imagemapword$
Exit
EndIf
Default
imagemapword$=imagemapword$+imagemapchar$
End Select
Next
Case "href" ;command$
For loop% = loop%+1 To imagemapfilelinelength%
imagemapchar$=Mid$(imagemapfileline$,loop%,1)
Select imagemapchar$
Case "="," "
imagemapword$=nil$
Case Chr(34),Chr(39);quotes
If imagemapword$<>nil$
this\hotspot[this\hotspots%]\command$=imagemapword$
Exit
EndIf
Default
imagemapword$=imagemapword$+imagemapchar$
End Select
Next
Case "target"
For loop% = loop%+1 To imagemapfilelinelength%
imagemapchar$=Mid$(imagemapfileline$,loop%,1)
Select imagemapchar$
Case "="," "
imagemapword$=nil$
Case Chr(34),Chr(39);quotes
If imagemapword$<>nil$
this\hotspot[this\hotspots%]\target$=imagemapword$
Exit
EndIf
Default
imagemapword$=imagemapword$+imagemapchar$
End Select
Next
End Select
Next
Wend
Return this
End Function
Function imagemapDestroy(this.imagemap)
;Purpose: Removes imagemap, hotspots, and image from memory
;Parameters: imagemap object
;Return: none
If this<>Null
For loop = 1 To hotspots%
If this\hotspot[loop%]<>Null
Delete this\hotspot[loop%]
EndIf
Next
If this\image% FreeImage(this\image)
Delete this
EndIf
End Function
Function imagemapUpdate()
;Purpose: Checks for mouse and hotspot events. called in main loop
;Parameters: none
;Return: none
this.imagemap=imagemapCurrent
If imagemapCurrent\state%
If this\image DrawBlock(this\image%,this\x,this\y)
;check mouse and hotspot events
For loop% = 1 To this\hotspots%
If MouseX()>=this\hotspot[loop%]\coord%[0] And MouseX()<this\hotspot[loop%]\coord%[2]
If MouseY()>=this\hotspot[loop%]\coord%[1] And MouseY()<this\hotspot[loop%]\coord%[3]
Color 0,255,0
If MouseDown(1)
Color 255,0,0 ; do something
EndIf
Rect this\hotspot[loop%]\coord%[0],this\hotspot[loop%]\coord%[1],this\hotspot[loop%]\coord%[2]-this\hotspot[loop%]\coord%[0],this\hotspot[loop%]\coord%[3]-this\hotspot[loop%]\coord%[1],0
EndIf
EndIf
Next
EndIf
End Function
;DEMO ==========================================================================================
.MAIN
Graphics 512,256,16,2
SetBuffer(BackBuffer())
;load a imagemap
imagemapCurrent=imagemapLoad("test","test","test.jpg")
While Not KeyDown(1)
imagemapUpdate()
Flip()
Wend
imagemapDestroy(imagemapCurrent)
End |
Comments
None.
Code Archives Forum
