www.gusucode.com > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序 > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序\code\source\MENU\Title.cpp

    //Download by http://www.NewXing.com
//********************************************
//	封面 相关函数
//  创建于2000年9月29日
//********************************************
#include <stdio.h>
#include "..\gamelib\goldpoint2.h"
#include "..\interface\interface2.h"
#include "..\main.h"
#include "..\map.h"
#include "..\mapedit\mapedit.h"
#include "..\script.h"
#include "menu_inc.h"
#include "..\cursor.h"
#include "..\role.h"

CTitle::CTitle()
{
	Select=0;
	Button = NULL;
	BackGroundFile = NULL;
}

CTitle::~CTitle()
{
	_DELETE_ARRAY(Button);
	_FREE( BackGroundFile );
}

//读取
void CTitle::LoadTitleIni(char *filename, char *index)
{
	CIniSet Ini(filename);

	BackGroundFile=Ini.ReadText(index, "BackGroundFile");

	ButtonNum=Ini.ReadInt(index, "ButtonNum");
	Button=new CCButton[ButtonNum];

	//初始化按钮
	char* strFile;
	char* strIndex;
	for(int i=0; i<ButtonNum; i++)
	{
		strFile = Ini.ReadText(index, i);
		strIndex = Ini.ReadData(index,i);
		Button[i].LoadIni(strFile, strIndex);
		_FREE(strFile);
		_FREE(strIndex);
	}

	//初始化字体
	char *strTemp = GameIni.ReadText("配置文件","字体");
	ShowVersionFont.LoadFont(strTemp, "版本字体");
	_FREE(strTemp);
	
	strTemp = GameIni.ReadText("Start","version");
	strcpy(m_szVersion,strTemp);
	_FREE(strTemp);
}

//------------------------------------

//显示
void CTitle::ShowTitle(LPDIRECTDRAWSURFACE surf, bool bShowWindow)
{
}

//封面循环
void CTitle::DoMenu(LPDIRECTDRAWSURFACE surf, bool bShowWindow)
{
	int bHigh=-1, Contral=1;
	int oldx, oldy;

	g_ePlayState = PS_Null;
	bool b[3]={0,0,0};

	Music.Stop();
	WCHAR* str = WChar("music\\title.mid");
	Music.LoadMusic(str);
	_DELETE(str);
	Music.Play();

	//读入背景页面
	DDReLoadBitmap(lpDDSBackGround, BackGroundFile);
	for(int i=0; i<ButtonNum; i++)
	{
		Button[i].CheckLoop(lpDDSBackGround, -1);
	}

	ColorOut(lpDDSBackGround, 100);
	
	CCursor::GetCursor(CCursor::CS_CHANGEMAP).pPic.SetShowCount(0);

	//显示版本号
	int showversion_x,showversion_y;
	TEXTMETRIC tm;
	ShowVersionFont.GetFontInfo(lpDDSBack,&tm);
	showversion_x = MainWidth-tm.tmAveCharWidth*strlen(m_szVersion)-4;
	showversion_y = MainHeight-tm.tmHeight-tm.tmExternalLeading-4;
	ShowVersionFont.PrintText( lpDDSBackGround,showversion_x,showversion_y,m_szVersion);
	//菜单循环
	MSG msg;
	while(RunGame)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
            if (!GetMessage(&msg, NULL, 0, 0)) return;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
		}
		else if(bActive)
		{
			//获取输入信息
			GetInputData();
			
			//背景
			Blt(lpDDSBack, 0, 0, lpDDSBackGround, RectScreen, false);
			
			if( Contral == 0 && oldx!=point.x || oldy!=point.y )
			{
				Contral=1;
				oldx=point.x;
				oldy=point.y;
			}
			else if( Contral == 1 && ( UP_DOWN || DOWN_DOWN ) )
			{
				Contral=0;
				Select=0;
				key=0;
			}

			if( Contral==0 )	//键盘
			{
				//选择
				if( UP_DOWN )
				{
					Select--;
					if( Select<0 ) Select=ButtonNum-1;
					CMenu::Sound_HighLight.Play();
				}
				if( DOWN_DOWN )
				{
					Select++;
					if( Select>ButtonNum-1 ) Select=0;
					CMenu::Sound_HighLight.Play();
				}
				
				//显示
				for(int i=0; i<ButtonNum; i++)
				{
					if( i==Select ) bHigh=1;
					else bHigh=-1;

					int ret=Button[i].CheckLoop(lpDDSBack, bHigh);
					if( ret==2 )	Select=i;
				}

				if( A_UP )
					Button[Select].CheckLoop(lpDDSBack, 2);

				if( A_UP )
				{
					switch( Select )
					{
					case 0:		//new game
						{
							CMenu::Sound_TileClick.Play();
							Music.Stop();
							NewGame();
							char *str=GameIni.ReadText("Start", "起始脚本");
							Script.Run( str );
							_FREE(str);
							return;
						}
					case 1:		//load game
						CMenu::Sound_TileClick.Play();
						if( CMenu::LoadSave.DoMenu(lpDDSBack, true, 168, 48 ) )
						{
							g_ePlayState=PS_MAIN;
							FadeIn(2);
							map.ShowMap();
							if( CMusic::bPlay )	//背景音乐
							{
								Music.Resume();
							}
							return;
						}
						DDReLoadBitmap(lpDDSBackGround, BackGroundFile);
						ShowVersionFont.PrintText( lpDDSBackGround,showversion_x,showversion_y,m_szVersion);
						break;
					case 2:		//exit game
						CMenu::Sound_TileClick.Play();
						Music.Stop();
						RunGame=false;
						return;
					}
				}
			}
			else if( Contral==1 )	//鼠标
			{
				int ret[3], ret2[3];
				for(int i=0; i<ButtonNum; i++)
				{
					ret[i]=Button[i].CheckLoop(lpDDSBack, -1);
					if( ret[i]==2 && ret2[i] != 2 )
					{
						Select=i;
						CMenu::Sound_HighLight.Play();
					}
					ret2[i] = ret[i];
				}

				for(i=0; i<ButtonNum; i++)
				{
					if( ret[i]==1 )
					{
						switch( Select )
						{
						case 0:		//new game
							{
								CMenu::Sound_TileClick.Play();
								Music.Stop();
								NewGame();
								char *str=GameIni.ReadText("Start", "起始脚本");
								Script.Run( str );
								_FREE(str);
								return;
							}
						case 1:		//load game
							CMenu::Sound_TileClick.Play();
							if( CMenu::LoadSave.DoMenu(lpDDSBack, true, 168, 48 ) )
							{
								g_ePlayState=PS_MAIN;
								FadeIn(2);
								map.ShowMap();
								if( CMusic::bPlay )	//背景音乐
								{
									Music.Resume();
								}
								return;
							}
							DDReLoadBitmap(lpDDSBackGround, BackGroundFile);
							ShowVersionFont.PrintText( lpDDSBackGround,showversion_x,showversion_y,m_szVersion);
							break;

						case 2:		//exit game
							CMenu::Sound_TileClick.Play();
							Music.Stop();
							RunGame=false;
							return;
						}
					}
				}
			}
			ShowMouseCursor(lpDDSBack, false);
			_UpdateScreen();

			//直接进入地图编辑模式
			if( key==DIK_F5 && Key.GetState(DIK_LALT) )
			{
				NewGame();
				Music.Stop();
				//初始化Undomap
				UndoMap=new Cell_Struct[map.Width*map.Height];
				memcpy(UndoMap, map.Cell, sizeof(Cell_Struct)*map.Width*map.Height);
				g_ePlayState=PS_EDIT;
				bShowHardCursor=true;
				ShowCursor(true);
				return;
			}
		}
		else WaitMessage();	//等待消息
	}
}