Code archives/3D Graphics - Misc/Game Menu Settings module
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
What we have here is fully working GameMenu module for setting various system settings in your game. It's quite easily configurable and fully bitmap-based. It uses separate alpha-maps (see the gfx sub dir) for generating the "final" menu bitmap-bits (x_*.bmp) which it then loads and uses after the initial creation. It also saves (and reads if it finds the .cfg file from the disk) all settings the user makes. Basic first usage: -RUN the game.bb... first run generates the final menu bitmap-bits and then shows the menu -CHANGE some settings... it saves those changes once you leave the sub-menu -CLICK the "New Game" to see the settings in "game" use (you would use your game in place of the provided "dummy" of course) -PRESS ESC to exit back to menu... you can exit to windows from the main menu, using the Quit (press ENTER) Additional notes: Uhh... look the code what it does. I tried to code it so that it's pretty easy to "read", and I commented it a lot. It might be more compact or faster if it would have been coded differently, but the speed is not the problem in menu use. It should be pretty easy to make it work with Blitz2D, since the actual menu stuff does not require 3D display. And if you ever need to generate menu bitmaps again (if you change thir location on the screen etc) just delete the x_*.bmps and it generates them again. Use this in any way you wish, even commercially... absolutely no restrictions! Remember to unzip the package with sub-directories or this won't work! Controls: Cursor keys, Enter, ESC, F12 (for saving screenshots with alpha-logo) You need the gfx stuff to get this work... get the whole .zip HERE. Screenshots: http://www.caffeineoverdose.net/cod/coding_coding.shtml | |||||
Part 1, Game.bb [code]; ; Blitz3D "general purpose Game Settings Menu" ; by "Mustang" 8/2002 www.caffeineoverdose.net ; ; DrawAlphaImage-function by simon@acid.co.nz ; ; My GameMenu Code & Gfx > fully Public Domain ; ---> http:\\www.caffeineoverdose.net\Blitz3d ; ;======================================================================================= ; ;======================================================================================= AppTitle = "GameMenu 1.0 by Mustang" .GameMenu ;marker ;Let's go to the GameMenu to set the settings... Include "GameMenu.bb" ;And let's apply the selected settings to our "Game" AntiAlias = AntiAliasValue$ WBuffer = DepthBuffer$ HWMultiTex = MultiTexValue$ If GameSmode$ = "fullscreen" Graphics3D GameScreenX,GameScreenY,GameScreenC,1 ;fullscreen Else Graphics3D GameScreenX,GameScreenY,GameScreenC,2 ;windowed EndIf ;======================================================================================= ; fake GameLoop starts [insert your actual gamecode inside this loop] ;======================================================================================= cam = CreateCamera() CameraClsMode cam,0,1 MoveEntity cam,0,0,-5 light = CreateLight() MoveEntity light,-10,10,-10 cube = CreateCube() EntityColor cube,51,51,204 EntityAlpha cube,.75 y = -220: LineSpacing = 12: z = 0 Repeat Cls Z=Z+1 Color 153,153,255 Rect 40,y-10,345,250 Color 0,0,92 Rect 50,y,325,230 If z=<40 Then Color 153,153,255 Rect 50,y+62,9,10 EndIf If z=80 Then z=0 y = y+1 If y > GraphicsHeight() Then y=-220 Color 153,153,255 w=6 Text 50,(LineSpacing*0)+y," **** COMMODORE 64 BASIC V2 ****" Text 50,(LineSpacing*2)+y," 64K RAM SYSTEM 38911 BASIC BYTES FREE" Text 50,(LineSpacing*4)+y,"READY" For s.SMenuItem = Each SMenuItem Text 50,(LineSpacing*w)+y,s\Tag$+":" Select s\DChoice Case 1 Text 160,(LineSpacing*w)+y,s\Choice1$ Case 2 Text 160,(LineSpacing*w)+y,s\Choice2$ Case 3 Text 160,(LineSpacing*w)+y,s\Choice3$ Case 4 Text 160,(LineSpacing*w)+y,s\Choice4$ End Select w = w + 1 Next Text 50,(LineSpacing*w+1)+y,"PRESS 'ESC' TO GET BACK TO THE NENU" TurnEntity cube,2,1,.5 RenderWorld ;===================================================== ;DEBUG INFO ;===================================================== If DEBUGinfo = True If GfxModeExists (GameScreenX,GameScreenY,GameScreenC) Text 0,0,"OK - can do this:" Else Text 0,0,"Ooops - no can do:" EndIf Text 150,0, GameScreenX+"x"+GameScreenY+"x"+GameScreenC Text 0,20, GameSmode$ Text 0,40, MenuSmode$ Text 0,60, AntiAliasValue$ Text 0,80, DepthBuffer$ Text 0,100, MultiTexValue$ Text 0,120, Difficulty$ Text 0,140, GFXquality$ Text 0,160, SoundFXvol$ Text 0,180, MusicFXvol$ EndIf ;===================================================== Flip Until KeyHit (1) ;======================================================================================= ; fake GameLoop ends ;======================================================================================= For m.MMenuItem = Each MMenuItem ;Cleaning... Delete m Next For s.SMenuItem = Each SMenuItem ;Cleaning... Delete s Next Goto GameMenu ;let's go back to the GameMenu if the user exits the game with ESC End Part 2, GameMenu.bb ; Blitz3D "general purpose Game Settings Menu" ; by "Mustang" 8/2002 www.caffeineoverdose.net ; ; DrawAlphaImage-function by simon@acid.co.nz ; ; My GameMenu Code & Gfx > fully Public Domain ; ---> http:\\www.caffeineoverdose.net\Blitz3d ; ;======================================================================================= ; GameMenu configuration starts ;======================================================================================= .Start ;marker AppTitle = "GameMenu 1.0 by Mustang" Const MMItems = 4 ;how many items on the M(ain)Menu? Const SMItems = 12 ;how many items on the S(ub)Menu? Global Menu$ = "main" ;this is used to track the menu we are in Global MMactive = 1 ;tag to track selected MMenu item Global SMactive = 1 ;tag to track selected SMenu item Const YOffset = 0 ;SubMenu choice Y offset Const XOffset = 350 ;SubMenu choice X offset ;>>make sure these 3 values below are correct!<< Const MFrHeight = 64 ;MainMenu item frame height Const SFrHeight = 32 ;SubMenu item frame height Const CFrHeight = 32 ;SubMenuChoice item frame height Global AntiAliasValue$ Global DepthBuffer$ Global MultiTexValue$ Global Difficulty$ Global GFXquality$ Global SoundFXvol$ Global MusicFXvol$ Type MMenuItem Field Frame ;"serialnumber" of the menuitem Field Xpos ;x-position of the menuitem on the screen Field Ypos ;y-position of the menuitem on the screen Field Link$ ;link to what function End Type Type SMenuItem Field Frame ;"serialnumber" of the menuitem Field DChoice ;DefaultChoice for choices Field Xpos ;x-position of the menuitem on the screen Field Ypos ;y-position of the menuitem on the screen Field Tag$ ; Field Choice1$ ;1st choice Field Choice2$ ;2nd choice Field Choice3$ ;3rd choice Field Choice4$ ;4th choice Field MaxChoice ;how many choices out of four maximum End Type ;MMenu item data, properties: framenumber,x-pos,y-pos,sound_active,sound_clicked,link Data 0,128,128+92,"game" Data 1,128,192+92,"setup" Data 2,128,256+92,"credits" Data 3,128,320+92,"quit" ;SMenu item data, properties: ;framenumber,default,x-pos,y-pos,txt-tag,option1,option2,option3,option4 (x=no choice) ;"OK" is used as a marker to get back to the mainmenu ----> no user choices Data 0, 1,64,128+44, "resolution", "640x480", "800x600", "1024x768", "1280x960" Data 1, 1,64,160+44, "color depth", "16", "32", "x", "x" Data 2, 1,64,192+44, "game smode", "fullscreen", "windowed", "x", "x" Data 3, 1,64,224+44, "menu smode", "fullscreen", "windowed", "x", "x" Data 4, 1,64,256+44, "antialias", "true", "false", "x", "x" Data 5, 1,64,288+44, "depth buffer", "false", "true", "x", "x" Data 6, 1,64,320+44, "HW-multitex", "true", "false", "x", "x" Data 7, 1,64,352+44, "difficulty", "easy", "medium", "hard", "ultra" Data 8, 1,64,384+44, "GFX quality", "low", "medium", "high", "x" Data 9, 1,64,416+44, "soundFX vol", "0", "1", "2", "3" Data 10,1,64,448+44, "musicFX vol", "0", "1", "2", "3" Data 11,0,146,545, "OK", "x", "x", "x", "x" Global Gdir$ = "gfx\" ;GFX root directory Global SFXroot$ = "sfx\" ;SFX root directory Global MMenu_1$ = "MMenu_1" ;MainMenu notselected gfx Global MMenu_a$ = "MMenu_a" ;MainMenu alpha gfx Global MMenu_2$ = "MMenu_2" ;MainMenu selected gfx Global SMenu_1$ = "SMenu_1" ;SubMenu notselected gfx Global SMenu_a$ = "SMenu_a" ;SubMenu alpha gfx Global SMenu_2$ = "SMenu_2" ;SubMenu selected gfx Global SMChoice_1$ = "SMChoice_1" ;SubMenuChoice notselected gfx Global SMChoice_a$ = "SMChoice_a" ;SubMenuChoice alpha gfx Global SMChoice_2$ = "SMChoice_2" ;SubMenuChoice selcted gfx Global Logo$ = "Logo" ;logo color, for screenshots Global Logo_a$ = "Logo_a" ;logo alpha, for screenshots Global SaveGFX2Disk = True Global MenuScreenX = 800 ;menu default screen x resolution (you need to have BG-GFX to match) Global MenuScreenY = 600 ;menu default screen y resolution Global MenuScreenC = 32 ;menu default screen color depth Global GameScreenX = 640 ;game default screen x resolution Global GameScreenY = 480 ;game default screen y resolution Global GameScreenC = 32 ;game default screen color depth Global MenuSmode$ = "windowed" ;MENU screenmode flag Global GameSmode$ = "fullscreen" ;GAME screenmode flag Const DEBUGinfo = False ;set this true to see some debug info Global Error$ = "Your PC cannot do the minimum graphics mode required. Get a new PC you sorry sod." ;======================================================================================= ; GameMenu configuration ends ;======================================================================================= Restore For i = 1 To MMItems ;let's read the menudata m.MMenuItem = New MMenuItem Read Frame m.MMenuItem\Frame = Frame Read Xpos m.MMenuitem\Xpos = Xpos Read Ypos m.MMenuitem\Ypos = Ypos Read Link$ m.MMenuItem\Link$ = Link$ Next file = ReadFile("game.cfg") If file <> 0 ;do we have a saved cfg-file that exists? For i = 1 To SMItems s.SMenuItem = New SMenuItem s.SMenuItem\Frame = ReadLine (file) s.SMenuItem\DChoice = ReadLine (file) s.SMenuItem\Xpos = ReadLine (file) s.SMenuItem\Ypos = ReadLine (file) s.SMenuItem\Tag$ = ReadLine (file) s.SMenuItem\Choice1$ = ReadLine (file) s.SMenuItem\Choice2$ = ReadLine (file) s.SMenuItem\Choice3$ = ReadLine (file) s.SMenuItem\Choice4$ = ReadLine (file) s.SMenuItem\MaxChoice = ReadLine (file) Select i Case 3 If s.SMenuItem\DChoice = 1 GameSmode$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 GameSmode$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 GameSmode$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 GameSmode$ = s.SMenuItem\Choice4$ Case 4 If s.SMenuItem\DChoice = 1 MenuSmode$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 MenuSmode$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 MenuSmode$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 MenuSmode$ = s.SMenuItem\Choice4$ Case 5 If s.SMenuItem\DChoice = 1 AntiAliasValue$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 AntiAliasValue$ = s.SMenuItem\Choice2$ Case 6 If s.SMenuItem\DChoice = 1 DepthBuffer$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 DepthBuffer$ = s.SMenuItem\Choice2$ Case 7 If s.SMenuItem\DChoice = 1 WMultiTexValue$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 WMultiTexValue$ = s.SMenuItem\Choice2$ Case 8 If s.SMenuItem\DChoice = 1 Difficulty$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 Difficulty$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 Difficulty$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 Difficulty$ = s.SMenuItem\Choice4$ Case 9 If s.SMenuItem\DChoice = 1 GFXquality$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 GFXquality$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 GFXquality$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 GFXquality$ = s.SMenuItem\Choice4$ Case 10 If s.SMenuItem\DChoice = 1 SoundFXvol$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 SoundFXvol$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 SoundFXvol$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 SoundFXvol$ = s.SMenuItem\Choice4$ Case 11 If s.SMenuItem\DChoice = 1 MusicFXvol$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 MusicFXvol$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 MusicFXvol$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 MusicFXvol$ = s.SMenuItem\Choice4$ End Select Next CloseFile file Else ;no saved file found so we are using the default values For i = 1 To SMItems max = 4 lock = False s.SMenuItem = New SMenuItem Read Frame s.SMenuItem\Frame = Frame Read DChoice s.SMenuItem\DChoice = DChoice Read Xpos s.SMenuitem\Xpos = Xpos Read Ypos s.SMenuitem\Ypos = Ypos Read Tag$ s.SMenuItem\Tag$ = Tag$ Read Choice1$ s.SMenuItem\Choice1$ = Choice1$ If Choice1$ = "x" And lock = False max = 0 lock = True EndIf Read Choice2$ s.SMenuItem\Choice2$ = Choice2$ If Choice2$ = "x" And lock = False max = 1 lock = True EndIf Read Choice3$ s.SMenuItem\Choice3$ = Choice3$ If Choice3$ = "x" And lock = False max = 2 lock = True EndIf Read Choice4$ s.SMenuItem\Choice4$ = Choice4$ If Choice4$ = "x" And lock = False max = 3 lock = True EndIf s.SMenuItem\MaxChoice = max Select i Case 3 If s.SMenuItem\DChoice = 1 GameSmode$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 GameSmode$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 GameSmode$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 GameSmode$ = s.SMenuItem\Choice4$ Case 4 If s.SMenuItem\DChoice = 1 MenuSmode$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 MenuSmode$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 MenuSmode$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 MenuSmode$ = s.SMenuItem\Choice4$ Case 5 If s.SMenuItem\DChoice = 1 AntiAliasValue$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 AntiAliasValue$ = s.SMenuItem\Choice2$ Case 6 If s.SMenuItem\DChoice = 1 DepthBuffer$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 DepthBuffer$ = s.SMenuItem\Choice2$ Case 7 If s.SMenuItem\DChoice = 1 MultiTexValue$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 MultiTexValue$ = s.SMenuItem\Choice2$ Case 8 If s.SMenuItem\DChoice = 1 Difficulty$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 Difficulty$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 Difficulty$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 Difficulty$ = s.SMenuItem\Choice4$ Case 9 If s.SMenuItem\DChoice = 1 GFXquality$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 GFXquality$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 GFXquality$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 GFXquality$ = s.SMenuItem\Choice4$ Case 10 If s.SMenuItem\DChoice = 1 SoundFXvol$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 SoundFXvol$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 SoundFXvol$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 SoundFXvol$ = s.SMenuItem\Choice4$ Case 11 If s.SMenuItem\DChoice = 1 MusicFXvol$ = s.SMenuItem\Choice1$ If s.SMenuItem\DChoice = 2 MusicFXvol$ = s.SMenuItem\Choice2$ If s.SMenuItem\DChoice = 3 MusicFXvol$ = s.SMenuItem\Choice3$ If s.SMenuItem\DChoice = 4 MusicFXvol$ = s.SMenuItem\Choice4$ End Select Next EndIf SetBuffer BackBuffer() If MenuSmode$ = "fullscreen" mode=GfxModeExists(MenuScreenX,MenuScreenY,MenuScreenC) If mode=1 Graphics3D MenuScreenX,MenuScreenY,MenuScreenC,1 ;success - fullscreen! Else RuntimeError Error$ ;no-go... let's do the error dialog... End If Else Graphics3D MenuScreenX,MenuScreenY,MenuScreenC,2 ;windowed EndIf Background1 = LoadImage(Gdir$+"MMenu_bg1.jpg") ;background for the MainMenu Background2 = LoadImage(Gdir$+"MMenu_bg2.jpg") ;background for the Credits Logo = LoadAnimImage (Gdir$+Logo$+".jpg",512,32,0,1) ;screenshot logo color bitmap Logo_a = LoadAnimImage (Gdir$+Logo_a$+".jpg",512,32,0,1) ;screenshot logo alpha bitmap Click1 = LoadSound(SFXroot$+"click1.wav") ;sound1 Click2 = LoadSound(SFXroot$+"click2.wav") ;sound2 check = ReadFile(Gdir$+"x_"+MMenu_1$+".bmp") If check <> 0 ;saved gfx-menu file found... (note that now we don't need any alphamasks!) MMenu_1 = LoadAnimImage (Gdir$+"x_"+MMenu_1$+".bmp",256,MFrHeight,0,MMItems) MMenu_2 = LoadAnimImage (Gdir$+"x_"+MMenu_2$+".bmp",256,MFrHeight,0,MMItems) SMenu_1 = LoadAnimImage (Gdir$+"x_"+SMenu_1$+".bmp",512,SFrHeight,0,SMItems) SMenu_2 = LoadAnimImage (Gdir$+"x_"+SMenu_2$+".bmp",512,SFrHeight,0,SMItems) SMChoice_1 = LoadAnimImage (Gdir$+"x_"+SMChoice_1$+".bmp",200,CFrHeight,0,SMItems*4) SMChoice_2 = LoadAnimImage (Gdir$+"x_"+SMChoice_2$+".bmp",200,CFrHeight,0,SMItems*4) Else ;saved gfx-menu file NOT found... so we'll create new set with the help of alphamasks MMenu_1 = LoadAnimImage (Gdir$+MMenu_1$+".jpg",256,MFrHeight,0,MMItems) MMenu_a = LoadAnimImage (Gdir$+MMenu_a$+".jpg",256,MFrHeight,0,MMItems) MMenu_2 = LoadAnimImage (Gdir$+MMenu_2$+".jpg",256,MFrHeight,0,MMItems) SMenu_1 = LoadAnimImage (Gdir$+SMenu_1$+".jpg",512,SFrHeight,0,SMItems) SMenu_a = LoadAnimImage (Gdir$+SMenu_a$+".jpg",512,SFrHeight,0,SMItems) SMenu_2 = LoadAnimImage (Gdir$+SMenu_2$+".jpg",512,SFrHeight,0,SMItems) SMChoice_1 = LoadAnimImage (Gdir$+SMChoice_1$+".jpg",200,CFrHeight,0,SMItems*4) SMChoice_a = LoadAnimImage (Gdir$+SMChoice_a$+".jpg",200,CFrHeight,0,SMItems*4) SMChoice_2 = LoadAnimImage (Gdir$+SMChoice_2$+".jpg",200,CFrHeight,0,SMItems*4) Gosub PrepareMenuGFX EndIf ;======================================================================================= ; GameMenu Idle Loop starts ;======================================================================================= Repeat If KeyHit(208) ;Down arrow If Menu$="main" If MMactive<MMItems PlaySound Click1 EndIf MMactive=MMactive+1 If MMactive>MMItems MMactive=MMItems EndIf EndIf If Menu$="sub" If SMactive<SMItems PlaySound Click1 EndIf SMactive=SMactive+1 If SMactive>SMItems SMactive=SMItems EndIf EndIf EndIf If KeyHit(200) ;Up arrow If Menu$="main" If MMactive>1 PlaySound Click1 EndIf MMactive=MMactive-1 If MMactive<1 MMactive=1 EndIf EndIf If Menu$="sub" If SMactive>1 PlaySound Click1 EndIf SMactive=SMactive-1 If SMactive<1 SMactive=1 EndIf EndIf EndIf If KeyHit(28) ;return-key? PlaySound Click2 If Menu$ = "main" Select MMactive Case 1 ;go back to main game part & save user settings FreeImage (Background1) FreeImage (Background2) FreeImage (MMenu_1) FreeImage (MMenu_a) FreeImage (MMenu_2) FreeImage (SMenu_1) FreeImage (SMenu_a) FreeImage (SMenu_2) FreeImage (SMChoice_1) FreeImage (SMChoice_a) FreeImage (SMChoice_2) Goto TheEnd Case 2 ;go to SMenu (settings) Menu$ = "sub" SMactive = 1 FlushKeys Case 3 ;go to SMenu (credits) DrawBlock Background2,0,0 ;draw background1 Flip FlushKeys WaitKey PlaySound Click2 FlushKeys Case 4 ;quit to windows! End End Select EndIf If Menu$ = "sub" And SMactive = SMItems Gosub SaveSettings Menu$ = "main" EndIf EndIf If KeyHit(205) And Menu$ = "sub" ;right-arrow? Change user settings up PlaySound Click2 If SMactive < SMItems For s.SMenuItem = Each SMenuItem If s\DChoice = s\MaxChoice And s\Frame = SMactive -1 s\DChoice = 0 EndIf If s\DChoice < s\MaxChoice And s\Frame = SMactive - 1 s\DChoice = s\DChoice + 1 EndIf Next EndIf Gosub Check3D EndIf If KeyHit(203) And Menu$ = "sub" ;left-arrow? Change user settings down PlaySound Click2 If SMactive < SMItems For s.SMenuItem = Each SMenuItem If s\DChoice = 1 And s\Frame = SMactive -1 s\DChoice = s\MaxChoice + 1 EndIf If s\DChoice > 1 And s\Frame = SMactive - 1 s\DChoice = s\DChoice - 1 EndIf Next EndIf Gosub Check3D EndIf Gosub UpdateMenus ;===================================================== ;DEBUG INFO ;===================================================== If DEBUGinfo = True If GfxModeExists (GameScreenX,GameScreenY,GameScreenC) Text 0,0,"OK - can do this:" Else Text 0,0,"Ooops - no can do:" EndIf Text 150,0, GameScreenX+"x"+GameScreenY+"x"+GameScreenC Text 0,20, GameSmode$ Text 0,40, MenuSmode$ Text 0,60, AntiAliasValue$ Text 0,80, DepthBuffer$ Text 0,100, MultiTexValue$ Text 0,120, Difficulty$ Text 0,140, GFXquality$ Text 0,160, SoundFXvol$ Text 0,180, MusicFXvol$ EndIf ;===================================================== If KeyHit(88) ;F12 saves a screenshot (with "alpha-ed" logo) Gosub SaveScreenshot EndIf Flip If Menu$ = "Exit" Exit EndIf Forever ;======================================================================================= ; GameMenu Idle Loop ends ;======================================================================================= .Check3D For z = 1 To 2 For s.SMenuItem = Each SMenuItem For y = 1 To 4 If SMactive = z And s\Frame = 0 Select s\DChoice Case 1 GameScreenX = s\Choice1$ GameScreenY = Right$(s\Choice1$,Len(s\Choice1$)-Instr(s\Choice1$,"x")) Case 2 GameScreenX = s\Choice2$ GameScreenY = Right$(s\Choice2$,Len(s\Choice2$)-Instr(s\Choice2$,"x")) Case 3 GameScreenX = s\Choice3$ GameScreenY = Right$(s\Choice3$,Len(s\Choice3$)-Instr(s\Choice3$,"x")) Case 4 GameScreenX = s\Choice4$ GameScreenY = Right$(s\Choice4$,Len(s\Choice4$)-Instr(s\Choice4$,"x")) End Select EndIf If SMactive = z And s\Frame = 1 Select s\DChoice Case 1 GameScreenC = s\Choice1$ Case 2 GameScreenC = s\Choice2$ Case 3 GameScreenC = s\Choice3$ Case 4 GameScreenC = s\Choice4$ End Select EndIf Next Next Next For z = 3 To 11 For s.SMenuItem = Each SMenuItem For y = 1 To 4 If SMactive = z And s\Frame = 2 Select s\DChoice Case 1 GameSmode$ = s\Choice1$ Case 2 GameSmode$ = s\Choice2$ End Select EndIf If SMactive = z And s\Frame = 3 Select s\DChoice Case 1 MenuSmode$ = s\Choice1$ Case 2 MenuSmode$ = s\Choice2$ End Select EndIf If SMactive = z And s\Frame = 4 Select s\DChoice Case 1 AntiAliasValue$ = s\Choice1$ Case 2 AntiAliasValue$ = s\Choice2$ End Select EndIf If SMactive = z And s\Frame = 5 Select s\DChoice Case 1 DepthBuffer$ = s\Choice1$ Case 2 DepthBuffer$ = s\Choice2$ End Select EndIf If SMactive = z And s\Frame = 6 Select s\DChoice Case 1 MultiTexValue$ = s\Choice1$ Case 2 MultiTexValue$ = s\Choice2$ End Select EndIf If SMactive = z And s\Frame = 7 Select s\DChoice Case 1 Difficulty$ = s\Choice1$ Case 2 Difficulty$ = s\Choice2$ Case 3 Difficulty$ = s\Choice3$ Case 4 Difficulty$ = s\Choice4$ End Select EndIf If SMactive = z And s\Frame = 8 Select s\DChoice Case 1 GFXquality$ = s\Choice1$ Case 2 GFXquality$ = s\Choice2$ Case 3 GFXquality$ = s\Choice3$ Case 4 GFXquality$ = s\Choice4$ End Select EndIf If SMactive = z And s\Frame = 9 Select s\DChoice Case 1 SoundFXvol$ = s\Choice1$ Case 2 SoundFXvol$ = s\Choice2$ Case 3 SoundFXvol$ = s\Choice3$ Case 4 SoundFXvol$ = s\Choice4$ End Select EndIf If SMactive = z And s\Frame = 10 Select s\DChoice Case 1 MusicFXvol$ = s\Choice1$ Case 2 MusicFXvol$ = s\Choice2$ Case 3 MusicFXvol$ = s\Choice3$ Case 4 MusicFXvol$ = s\Choice4$ End Select EndIf Next Next Next Return .UpdateMenus ;well-- draw the menus on the screen If Menu$ = "main" DrawBlock Background1,0,0 ;draw background1 For m.MMenuItem = Each MMenuItem If m\Frame = MMactive-1 DrawBlock (MMenu_2,m\Xpos,m\Ypos,m\Frame) Else DrawBlock (MMenu_1,m\Xpos,m\Ypos,m\Frame) EndIf Next EndIf If Menu$ = "sub" DrawBlock Background1,0,0 ;draw background1 For s.SMenuItem = Each SMenuItem If s\Frame = SMactive-1 DrawBlock (SMenu_2,s\Xpos,s\Ypos,s\Frame) Else DrawBlock (SMenu_1,s\Xpos,s\Ypos,s\Frame) EndIf If s\DChoice <> 0 If s\Frame = SMactive-1 DrawBlock (SMChoice_2,s\Xpos+XOffset,s\Ypos+YOffset,((s\DChoice-1)*SMItems)+s\Frame) Else DrawBlock (SMChoice_1,s\Xpos+XOffset,s\Ypos+YOffset,((s\DChoice-1)*SMItems)+s\Frame) EndIf EndIf Next EndIf Return .PrepareMenuGFX ;and... prepare (and save if needed) the menu gfx bits :) Text GraphicsWidth()/2,GraphicsHeight()/2,"Please wait - generating menu graphics bitmaps",True,True Flip ;MMenu_nonactive alpha images DrawBlock Background1,0,0 ;draw background1 For m.MMenuItem = Each MMenuItem DrawAlphaImage (MMenu_2,m\Xpos,m\Ypos,MMenu_a,m\Frame) GrabImage MMenu_2,m\Xpos,m\Ypos,m\Frame Next ;MMenu_active alpha images DrawBlock Background1,0,0 ;draw background1 For m.MMenuItem = Each MMenuItem DrawAlphaImage (MMenu_1,m\Xpos,m\Ypos,MMenu_a,m\Frame) GrabImage MMenu_1,m\Xpos,m\Ypos,m\Frame Next ;SMenu_nonactive alpha images DrawBlock Background1,0,0 ;draw background1 For s.SMenuItem = Each SMenuItem DrawAlphaImage (SMenu_2,s\Xpos,s\Ypos,SMenu_a,s\Frame) GrabImage SMenu_2,s\Xpos,s\Ypos,s\Frame Next ;SMenu_active alpha images DrawBlock Background1,0,0 ;draw background1 For s.SMenuItem = Each SMenuItem DrawAlphaImage (SMenu_1,s\Xpos,s\Ypos,SMenu_a,s\Frame) GrabImage SMenu_1,s\Xpos,s\Ypos,s\Frame Next ;SMenu_choices_nonactive alpha images For x = 0 To (SMItems*4)-1 Step 12 DrawBlock Background1,0,0 ;draw background1 For s.SMenuItem = Each SMenuItem DrawAlphaImage (SMChoice_2,s\Xpos+XOffset,s\Ypos+YOffset,SMChoice_a,s\Frame+x) GrabImage SMChoice_2,s\Xpos+XOffset,s\Ypos+YOffset,s\Frame+x Next Next ;SMenu_choices_active alpha images For x = 0 To (SMItems*4)-1 Step SMItems DrawBlock Background1,0,0 ;draw background1 For s.SMenuItem = Each SMenuItem DrawAlphaImage (SMChoice_1,s\Xpos+XOffset,s\Ypos+YOffset,SMChoice_a,s\Frame+x) GrabImage SMChoice_1,s\Xpos+XOffset,s\Ypos+YOffset,s\Frame+x Next Next If SaveGFX2Disk = True Frames = MMItems Dump1 = CreateImage (ImageWidth(MMenu_2),Frames*MFrHeight) SetBuffer ImageBuffer(Dump1) For x = 0 To Frames-1 DrawBlock MMenu_2,0,x*MFrHeight,x Next ok=SaveImage (Dump1,Gdir$+"x_MMenu_2.bmp") Dump2 = CreateImage (ImageWidth(MMenu_1),Frames*MFrHeight) SetBuffer ImageBuffer(Dump2) For x = 0 To Frames-1 DrawBlock MMenu_1,0,x*MFrHeight,x Next ok=SaveImage (Dump2,Gdir$+"x_MMenu_1.bmp") Frames = SMItems Dump3 = CreateImage (ImageWidth(SMenu_2),Frames*SFrHeight) SetBuffer ImageBuffer(Dump3) For x = 0 To Frames-1 DrawBlock SMenu_2,0,x*SFrHeight,x Next ok=SaveImage (Dump3,Gdir$+"x_SMenu_2.bmp") Dump4 = CreateImage (ImageWidth(SMenu_1),Frames*SFrHeight) SetBuffer ImageBuffer(Dump4) For x = 0 To Frames-1 DrawBlock SMenu_1,0,x*SFrHeight,x Next ok=SaveImage (Dump4,Gdir$+"x_SMenu_1.bmp") Frames = MMItems*SMItems Dump5 = CreateImage (ImageWidth(SMChoice_2),Frames*CFrHeight) SetBuffer ImageBuffer(Dump5) For x = 0 To Frames-1 DrawBlock SMChoice_2,0,x*CFrHeight,x Next ok=SaveImage (Dump5,Gdir$+"x_SMChoice_2.bmp") Dump6 = CreateImage (ImageWidth(SMChoice_1),Frames*CFrHeight) SetBuffer ImageBuffer(Dump6) For x = 0 To Frames-1 DrawBlock SMChoice_1,0,x*CFrHeight,x Next ok=SaveImage (Dump6,Gdir$+"x_SMChoice_1.bmp") EndIf For m.MMenuItem = Each MMenuItem ;Cleaning... Delete m Next For s.SMenuItem = Each SMenuItem ;Cleaning... Delete s Next Goto Start ;after creating the gfx-bits let's start again this menu, shall we? Return .SaveScreenshot ;save a screenshot with a logo (with alpha-mask) x = ImageWidth(Logo) y = ImageHeight(Logo) xoff = 5 ;define the logo placement offset values from right/bottom corner yoff = 5 DrawAlphaImage (Logo,(GraphicsWidth()-(x+xoff)),(GraphicsHeight()-(y+yoff)),Logo_a,0) iFileNumber% = 0 Repeat iFileNumber = iFileNumber+1 sFileName$ = "Shot" + String$("0",3-Len(Str$(iFileNumber))) + iFileNumber + ".bmp" Until Not(FileType(sFileName)) SaveBuffer BackBuffer(),sFileName Return .SaveSettings ;save all settings to the harddisk file = WriteFile ("game.cfg") For s.SMenuItem = Each SMenuItem WriteLine ( file,s\Frame ) WriteLine ( file,s\DChoice ) WriteLine ( file,s\Xpos ) WriteLine ( file,s\Ypos ) WriteLine ( file,s\Tag$ ) WriteLine ( file,s\Choice1$ ) WriteLine ( file,s\Choice2$ ) WriteLine ( file,s\Choice3$ ) WriteLine ( file,s\Choice4$ ) WriteLine ( file,s\MaxChoice ) Next CloseFile file Return ; ; drawalphaimage.bb ; by simon@acid.co.nz ; Function DrawAlphaImage(image,px,py,alphaimage=0,frame) ;do the images with alpha-mask If alphaimage=0 alphaimage=image ; size w=ImageWidth(image) h=ImageHeight(image) gw=GraphicsWidth() gh=GraphicsHeight() ; clip x0=px:y0=py If x0<0 w=w+x0 x0=0 If y0<0 h=h+y0 y0=0 If x0+w>gw w=gw-x0 If y0+h>gh h=gh-y0 If w<=0 Or h<=0 Return x1=x0+w-1 y1=y0+h-1 ; lock buffers ibuffer=ImageBuffer(image,frame) abuffer=ImageBuffer(alphaimage,frame) gbuffer=GraphicsBuffer() LockBuffer ibuffer LockBuffer abuffer LockBuffer gbuffer ; draw For y=y0 To y1 For x=x0 To x1 alpha=ReadPixelFast(x-px,y-py,abuffer) And 255 If alpha>1 rgb0=ReadPixelFast(x-px,y-py,ibuffer) rgb1=ReadPixelFast(x,y,gbuffer) bit=$80 rgb=0 While bit>1 rgb0=(rgb0 Shr 1) And $7f7f7f rgb1=(rgb1 Shr 1) And $7f7f7f If (alpha And bit) rgb=rgb+rgb0 Else rgb=rgb+rgb1 bit=bit Shr 1 Wend WritePixelFast x,y,rgb EndIf Next Next ; unlock UnlockBuffer gbuffer UnlockBuffer ibuffer UnlockBuffer abuffer End Function .TheEnd ;marker[/code] |
Comments
| ||
File not Found ;( |
| ||
Fixed! I re-organized my site while ago and of course forgot to fix this... anyways, DL-link works now. |
Code Archives Forum