⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpg.cpp

📁 这是我以前数据结构的课设
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		Scene = 4;
		SX=0; DX=0;
		SY=30; DY=0;
		Hero.x=Hero.old_x=310; Hero.y=Hero.old_y=450;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;
	
	case SPACE+10:		//出神殿
		Scene = 2;
		SX=14; DX=0;
		SY=11; DY=0;
		Hero.x=Hero.old_x=620; Hero.y=Hero.old_y=450;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;

	case SPACE+11:		//进兵器店
		Scene = 5;
		SX=0; DX=0;
		SY=0; DY=0;
		Hero.x=Hero.old_x=300; Hero.y=Hero.old_y=400;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;

	case SPACE+12:		//出兵器店
		Scene = 1;
		SX=14;  DX=0;
		SY=0; DY=0;
		Hero.x=Hero.old_x=384; Hero.y=Hero.old_y=256;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;
	
	case SPACE+13:		//进药店
		Scene = 6;
		SX=0; DX=0;
		SY=0; DY=0;
		Hero.x=Hero.old_x=300; Hero.y=Hero.old_y=400;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;

	case SPACE+14:		//出药店
		Scene = 1;
		SX=0;  DX=0;
		SY=8; DY=0;
		Hero.x=Hero.old_x=96; Hero.y=Hero.old_y=256;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;

	case SPACE+15:		//进酒店
		Scene = 7;
		SX=0; DX=0;
		SY=0; DY=0;
		Hero.x=Hero.old_x=200; Hero.y=Hero.old_y=400;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;

	case SPACE+16:		//出酒店
		Scene = 1;
		SX=14;  DX=0;
		SY=6; DY=0;
		Hero.x=Hero.old_x=384; Hero.y=Hero.old_y=256;
		ChangePalette(MainPal,NullPal,-1);
		MainMove();
		Flip();
		ChangePalette(NullPal,MainPal,1);
		break;
	}
}


//*******************************************************************
//应用程序入口
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow)
{
	MSG		msg;

	//初始化主窗口
	hWnd=InitWindow( hInstance, nCmdShow ) ;
	if (hWnd == NULL )
		return FALSE;
	
	InitDirectSound(hWnd); //初始化音乐
	LoadSoundData(); //读取声音数据

	//初始化DirectDraw环境,并实现DirectDraw功能
	if (!InitDDraw())
	{
		MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!请检查你是否正确的安装了DirectX。", "Error", MB_OK );
		FreeDDraw();
		return FALSE;
	}

	LoadTalkText();	//读对话资源
	LoadGoodData(); //读取物品资源
	InitFont();	//初始化字体

	SetCursor(NULL); //消除光标
	GameTitle();	//游戏片头

	while(1)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(bActive)
		{
			MainLoop(); //进入游戏主循环
		}
		//等待消息
		else WaitMessage();
	}
}


//******************************************************************
//创建主窗口。
HWND InitWindow( HINSTANCE hInstance, int nCmdShow )
{
    HWND				hwnd;	
    WNDCLASS			wc;		

	//填充窗口类结构
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON1) );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = (struct HBRUSH__ *)GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
	wc.lpszClassName = "英雄救美";

	//注册窗口类
    RegisterClass( &wc );
    
	//创建主窗口
    hwnd = CreateWindowEx(
		0,
		"英雄救美",
		"英雄救美",
		WS_POPUP,//WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_SYSMENU,
		0,
		0,
		GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
		NULL,
		NULL,
		hInstance,
		NULL );

    if( !hwnd )		return FALSE;

	//显示并更新窗口
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );

	return hwnd;
}

//*****************************
//处理主窗口消息
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, 
                            WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
	case WM_ACTIVATEAPP://
		bActive = wParam;
		break;

	case WM_SETCURSOR:
        SetCursor(NULL);
        return TRUE;

    case WM_KEYDOWN://击键消息
//        switch( wParam )
        {
//        case VK_ESCAPE:		//调主菜单
//			Menu();	
//          break;
//		case VK_F1:
//			Fight(Map[Scene].NPC[0],3);
//			break;
//		case VK_F2:
//			ChangePalette(MainPal,NullPal,-1);
//			break;
//		case VK_F3:
//			ChangePalette(NullPal,MainPal,1);
//			break;
		}
        break;
	
	case WM_TIMER://定时器消息
		NpcMove();
		{static Times=0; //背景音乐循环播放
		Times++;
		if( SoundAble==TRUE && Times>25*6 ) //2分钟
		{
			char buf[256];
			mciSendString("close all", buf, sizeof(buf), NULL);
			mciSendString("open voc\\back.mid",buf,sizeof(buf),NULL);
			mciSendString("play voc\\back.mid", buf, sizeof(buf), NULL);
			Times=0;
		}}

		break;

    case WM_DESTROY://退出消息
 		ReleaseDirectSound();//释放DirectSound
		if( SoundAble==TRUE )
		{
		char buf[256];
		mciSendString("close all", buf, sizeof(buf), NULL);
		}
		FreeDDraw();//释放所有DirectDraw对象
	    PostQuitMessage( 0 );
        break;
    }
	
	//调用缺省消息处理过程
    return DefWindowProc(hWnd, message, wParam, lParam);
}

//*********************
//Npc活动函数
void NpcMove()
{ 
	for(int i=0; i<Map[Scene].Npc_Nums; i++)
	if( Map[Scene].NPC[i].Show==1 && Map[Scene].NPC[i].Active==1 ) //角色活动
	{
		if( random(100)>80 ) Map[Scene].NPC[i].Way=random(4);
		Map[Scene].NPC[i].Stats++;
		if( Map[Scene].NPC[i].Stats>=2 ) Map[Scene].NPC[i].Stats=0;
		
		//NpcS移动
		switch( Map[Scene].NPC[i].Way ) 
		{
		case 0: Map[Scene].NPC[i].y+=Map[Scene].NPC[i].Speed;
			break;
		case 1: Map[Scene].NPC[i].x-=Map[Scene].NPC[i].Speed;
			break;
		case 2: Map[Scene].NPC[i].y-=Map[Scene].NPC[i].Speed;
			break;
		case 3: Map[Scene].NPC[i].x+=Map[Scene].NPC[i].Speed;
			break;
		}
		//边界检测
		if( Map[Scene].NPC[i].x<0 ) Map[Scene].NPC[i].x=0;
		if( Map[Scene].NPC[i].x>Map[Scene].Width*32-Map[Scene].NPC[i].Width ) Map[Scene].NPC[i].x=Map[Scene].Width*32-Map[Scene].NPC[i].Width;
		if( Map[Scene].NPC[i].y<Map[Scene].NPC[i].Hight-16 ) Map[Scene].NPC[i].y=Map[Scene].NPC[i].Hight-16;
		if( Map[Scene].NPC[i].y>Map[Scene].Hight*32 ) Map[Scene].NPC[i].y=Map[Scene].Hight*32;
	
		//NPC碰撞检测
		if( abs(Hero.x+SX*32-DX - Map[ Scene ].NPC[i].x)<=24 &&\
			abs(Hero.y+SY*32-DY - Map[Scene].NPC[i].y)<=24 )
		{
			Map[Scene].NPC[i].x=Map[Scene].NPC[i].old_x;
			Map[Scene].NPC[i].y=Map[Scene].NPC[i].old_y;
		}
	
		//障碍物检测
		int n0 = ((Map[Scene].NPC[i].y-24)/32 ) * Map[ Scene ].Width + ((Map[Scene].NPC[i].x+8)/32 );
		int n1 = ((Map[Scene].NPC[i].y-24)/32 ) * Map[ Scene ].Width + ((Map[Scene].NPC[i].x+24)/32 );
		int n2 = ((Map[Scene].NPC[i].y-8)/32 ) * Map[ Scene ].Width + ((Map[Scene].NPC[i].x+8)/32 );
		int n3 = ((Map[Scene].NPC[i].y-8)/32 ) * Map[ Scene ].Width + ((Map[Scene].NPC[i].x+24)/32 );
		if( Map[ Scene ].Data[n0] >= BLAK || Map[ Scene ].Data[n1] >= BLAK || Map[ Scene ].Data[n2] >= BLAK || Map[ Scene ].Data[n3] >= BLAK )
		{
			Map[Scene].NPC[i].x=Map[Scene].NPC[i].old_x;
			Map[Scene].NPC[i].y=Map[Scene].NPC[i].old_y;
		}
		else 
		{
			Map[Scene].NPC[i].old_x=Map[Scene].NPC[i].x;
			Map[Scene].NPC[i].old_y=Map[Scene].NPC[i].y;
		}

		//遇到敌人
		if( Map[Scene].NPC[i].Enemy==1 &&\
			abs(Hero.x+SX*32-DX - Map[ Scene ].NPC[i].x)<=40 &&\
			abs(Hero.y+SY*32-DY - Map[Scene].NPC[i].y)<=40 )
		{
			int WAY[4]={2,3,1,0};
			Map[Scene].NPC[i].Way=WAY[Hero.Way];	//NPC转方向
			ShowDialog(i, Map[Scene].NPC[i].ID, Map[Scene].NPC[i].TalkNum); //先和NPC对话
			int Sulit=Fight(Map[Scene].NPC[i],3);	//进打斗画面
			PressKey(VK_RETURN,1);
			if( Sulit==0 )  //胜利
			{
				Map[Scene].NPC[i].Show=0;
				ShowDialog(i, Map[Scene].NPC[i].ID, 1);
				if( Map[Scene].NPC[i].ID==20006 ) //得到圣剑
				{
					GameHeader( GetTalk(99003,0) );
					Flag_GotoPalace=1; //可以进神殿了
				}
				if( Map[Scene].NPC[i].ID==40006 ) //爆机
				{
					ShowDialog(5, 30003, 0);
					ShowDialog(11,30004, 0);
					GameHeader(GetTalk(99002,0), RGB(255,0,0));	
					ChangePalette(MainPal,NullPal,-1);
					//PostMessage(hWnd, WM_CLOSE, 0, 0);
					GameTitle();
				}
			}
			if( Sulit==1 ) Map[Scene].NPC[i].Active = 5; //逃跑成功
			if( Sulit==2 ) GameTitle();	//死亡
		}
	}
	else if( Map[Scene].NPC[i].Active>1 ) Map[Scene].NPC[i].Active--; //打斗时间延时
		MainMove();
		Flip();
}

//******************************************************************
//初始化DirectDraw环境
BOOL InitDDraw(void)
{
	DWORD			 dwFlags;
	DDSURFACEDESC	 ddsd;
	DDSCAPS			 ddscaps;
	HRESULT          ddrval;

	//创建DirectDraw对象
	DirectDrawCreate(NULL, &lpDD, NULL);

	//设置协作级别为全屏模式
	dwFlags = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN;
	lpDD->SetCooperativeLevel(hWnd, dwFlags);

	//设置显示模式为640X480 256色
    lpDD->SetDisplayMode( ScreenX, ScreenY, ScreenColor);
    
	// 创建主页面
    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
			  DDSCAPS_FLIP |
			  DDSCAPS_COMPLEX;
    ddsd.dwBackBufferCount = 1;
    ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
    if( ddrval != DD_OK )
	{
		return initFail("lpDDSPrimary");
	}

	//创建缓冲页面
    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
	if( ddrval != DD_OK )
	{
		return initFail("lpDDSBack");
	}
	
	// 创建调色板
	lpDDPal = DDLoadPalette(lpDD, "pic\\title.bmp");
	InitPalette( TitlePal ); //初始化调色板
	if (lpDDPal) lpDDSPrimary->SetPalette( lpDDPal );

	//创建背景页面
	CreateBitmap(lpDDSBackGround,ScreenX,ScreenY,"pic\\title.bmp");
    
	// 创建调色板
	lpDDPal = DDLoadPalette(lpDD, "pic\\player.bmp");
	InitPalette( MainPal ); //初始化调色板
	if (lpDDPal) lpDDSPrimary->SetPalette( lpDDPal );

	//创建主角页面
	CreateBitmap(lpDDSSpirit,96,192,"pic\\player.bmp",DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSSpirit,RGB(255,238,187));
	Hero.Surface=lpDDSSpirit;
	
	//创建Npc页面
	char *Npc_FileName[]={"pic\\npc01.bmp","pic\\npc02.bmp","pic\\npc03.bmp","pic\\npc04.bmp","pic\\npc05.bmp", 
						  "pic\\npc06.bmp","pic\\npc07.bmp","pic\\npc08.bmp","pic\\npc09.bmp","pic\\npc10.bmp",
						  "pic\\npc11.bmp","pic\\npc12.bmp","pic\\npc13.bmp","pic\\npc14.bmp","pic\\npc15.bmp"};
	for( int i=0; i<NPCS; i++)
	{
		CreateBitmap(lpDDSNpc[i],64,128,Npc_FileName[i], DDSCAPS_SYSTEMMEMORY);
		DDSetColorKey(lpDDSNpc[i],RGB(255,238,187));
	}
	
	//创建地图小花页面1
	CreateBitmap(lpDDSMap1,32,320,"pic\\map1.bmp", DDSCAPS_SYSTEMMEMORY);

	//创建地图小花页面2
	CreateBitmap(lpDDSMap2,640,1536,"pic\\maps.bmp", DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSMap2,RGB(255,238,187));

	//创建对话框页面
	CreateBitmap(lpDDSDialog, 640,96, "pic\\talkbar.bmp", DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSDialog,RGB(255,238,187));

	//创建状态页面
	CreateBitmap(lpDDSStateBar, 420, 320, "pic\\sbar.bmp", DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSStateBar,RGB(255,238,187));
	
	//创建打斗页面
	CreateBitmap(lpDDSFightBar, 448, 112, "pic\\fightbar.bmp", DDSCAPS_SYSTEMMEMORY);
	//DDSetColorKey(lpDDSStateBar,RGB(255,238,187));

	//创建爆炸页面
	CreateBitmap(lpDDSBomb, 540, 50, "pic\\bomb.bmp", DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSBomb,RGB(255,238,187));

	//创建物品页面
	CreateBitmap(lpDDSGoods, 384, 192, "pic\\goods.bmp", DDSCAPS_SYSTEMMEMORY);
	DDSetColorKey(lpDDSGoods,RGB(255,238,187));

	//创建主菜单页面
	CreateBitmap(lpDDSMainMenu, 150, 200, "pic\\mainmenu.bmp", DDSCAPS_SYSTEMMEMORY);

	//设置定时器
	SetTimer(hWnd,1,400,NULL);
	srand( (unsigned)time( NULL ) ); //初始化随机指数

	return TRUE;
}

//**********************************
//初始化失败的处理函数
BOOL initFail(char *str)
{
    FreeDDraw();
    MessageBox( hWnd, str, "error", MB_OK );
    DestroyWindow( hWnd );
    return FALSE;

} /* initFail */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -