📄 rpg.cpp
字号:
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 + -