📄 mygame.cpp
字号:
#define DIRECTINPUT_VERSION 0x0700
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <time.h>
#include <malloc.h>
#include <direct.h>
#include <ddraw.h>
#include "ddutil.h"
#include <dsound.h>
#include <dinput.h>
#include "resource.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#define ScreenX 640 //定义屏幕宽;
#define ScreenY 480 //定义屏幕高;
#define ScreenColorDepth 16 //屏幕色深;
#define MAPS 8 //地图总数;
#define NPCS 12 //Npc总位图数;
#define BATTLEBACKS 2 //战斗背景图数;
#define BATTLEANIS 4 //战斗动画数;
#define BATTLEEFFS 3 //战斗特效数;
#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}//释放指针的宏;
#define random(nMax) (rand()*nMax/RAND_MAX)
// 声明和ddraw相关的变量、函数
LPDIRECTDRAW lpDD; // DirectDraw对象;
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw主页面;
LPDIRECTDRAWSURFACE lpDDSBack; //缓冲页面;
LPDIRECTDRAWSURFACE lpDDSBackup; //备份页面;
LPDIRECTDRAWSURFACE lpDDSSurface; //地表层;
LPDIRECTDRAWSURFACE lpDDSObject; //对象层;
LPDIRECTDRAWSURFACE lpDDSPlayer; //玩家页面;
LPDIRECTDRAWSURFACE lpDDSPortrait; //玩家头像;
LPDIRECTDRAWSURFACE lpDDSNpc[NPCS]; //Npc页面数组;
LPDIRECTDRAWSURFACE lpDDSBattleback[BATTLEBACKS]; //战斗背景;
LPDIRECTDRAWSURFACE lpDDSBattleani[BATTLEANIS]; //战斗动画;
LPDIRECTDRAWSURFACE lpDDSBattleeff[BATTLEEFFS]; //战斗特效;
LPDIRECTDRAWSURFACE lpDDSBattlepanel; //战斗面板;
LPDIRECTDRAWSURFACE lpDDSSlot; //血、气槽;
LPDIRECTDRAWSURFACE lpDDSTalkbar; //对话面板页面;
LPDIRECTDRAWSURFACE lpDDSContinue; //继续对话页面;
LPDIRECTDRAWSURFACE lpDDSMenuback; //主菜单背景;
LPDIRECTDRAWSURFACE lpDDSListBox; //列表框页面;
LPDIRECTDRAWSURFACE lpDDSRectangle; //选项方框;
LPDIRECTDRAWSURFACE lpDDSScrollArrows; //箭头页面;
LPDIRECTDRAWSURFACE lpDDSHandcursor; //手形游标;
LPDIRECTDRAWSURFACE lpDDSWeapon; //武器图标;
LPDIRECTDRAWSURFACE lpDDSArmor; //防具图标;
LPDIRECTDRAWSURFACE lpDDSOptionBox; //选择框;
LPDIRECTDRAWSURFACE lpDDSMsgBox; //消息框;
int handfp; //lpDDSHandcursor的当前帧;
DWORD handTick; //控制lpDDSHandcursor的动画速度;
int nCursel; //控制游标;
// 声明和dsound相关的变量、函数
#define WAV_HDR_SIZE 44
#define SND_GATE 0
#define SND_PING 1
#define SND_STATIC 2
#define SND_WALK 3
BOOL SoundAble = TRUE; //是否允许播放声音;
LPDIRECTSOUND lpDSObj=NULL;
static Times=640;
char buf[256];
LPDIRECTSOUNDBUFFER auCursorMove; //菜单光标移动声音;
LPDIRECTSOUNDBUFFER auEquip; //武器装备与卸下声音;
LPDIRECTSOUNDBUFFER auRefreshment; //精力恢复声音;
LPDIRECTSOUNDBUFFER auDiscard; //丢弃物品声音;
LPDIRECTSOUNDBUFFER auCannot; //禁止操作声音;
LPDIRECTSOUNDBUFFER auMoney; //金钱;
LPDIRECTSOUNDBUFFER auAttack; //攻击;
LPDIRECTSOUNDBUFFER auFire; //火;
LPDIRECTSOUNDBUFFER auThunder; //雷;
LPDIRECTSOUNDBUFFER Back;
// 声明和dinput相关的变量、函数
LPDIRECTINPUT7 DI;
LPDIRECTINPUTDEVICE7 DIms;
#define KEYDOWN(key) (buffer[key] & 0x80) //定义一个宏,方便处理键盘数据
char buffer[256]; //键盘数据
HWND hWnd; //主窗口句柄;
BOOL bActive=TRUE; //应用程序是否活跃;
char *Talk; //游戏中所有对话数据;
int SX,SY; //所处场景的左上角坐标;
int OLDSX,OLDSY; //所处场景的旧左上角坐标;
int DX,DY; //生成场景的左上角坐标;
int OLDDX,OLDDY; //生成场景的旧左上角坐标;
int Scene; //所处场景;
DWORD dwnoenemy; //遇敌间隔;
BOOL KILLBOSS1; //杀死真田?
enum GAME_STATUS {
GAME_PLAY,
GAME_MAINMENU,
GAME_OVER,
};//枚举游戏状态;
GAME_STATUS g_game_status;
enum DIRECTION{
DOWN,
LEFT,
UP,
RIGHT,
};//枚举角色方向;
//********物品结构*********
typedef struct{
int ID; //编号
int type; //类型
char Name[32]; //名字
char About[100]; //功能
int Money; //价值
int Life, Power, Attack, Defence, Speed; //作用
}Item_Struct;
Item_Struct Items[20];
enum MANEUVERTYPE{
UNARMEDWEAPON,
ARMEDWEAPON,
UNARMEDARMOR,
ARMEDARMOR,
MEDICINE,
PLOT,
};//枚举操作类型;
MANEUVERTYPE ItemSelected; //选择物品类型;
//定义角色结构;
typedef struct{
int ID; //角色唯一编号;
char Name[32]; //角色名称;
BOOL exist; //角色是否存在;
BOOL active; //角色是否活动;
BOOL IsEnemy; //角色是敌人否;
int bitmap; //角色位图;
int lboundary; //角色活动左边界;
int rboundary; //角色活动右边界;
int uboundary; //角色活动上边界;
int dboundary; //角色活动下边界;
int x; //x坐标;
int y; //y坐标;
int oldx; //保留旧的x坐标;
int oldy; //保留旧的y坐标;
int talknum; //角色对话编号;
int nLevel; //角色等级;
int nExp; //角色经验值;
int nMoney; //角色所持金钱;
int nMaxLife; //角色最大生命;
int nCurLife; //角色当前生命;
int nPower; //角色怒气;
int nOriAtt; //角色原始攻击力;
int nAttack; //角色攻击力;
int nOriDef; //角色原始防御力;
int nDefence; //角色防御力;
int nOriSpeed; //角色原始速度;
int nSpeed; //角色速度;
unsigned short Weapon; //角色装备武器;
unsigned short Armor; //角色装备防具;
unsigned char Item[18]; //角色携带物品;
int speed; //速度;
int width; //宽度;
int height; //高度;
int picnum; //图片编号;
DIRECTION dir; //方向;
LPDIRECTDRAWSURFACE Surface; //角色页面关联;
int Battle; //角色战斗页面关联;
}ROLE_STRUCT;
ROLE_STRUCT role;
//定义地图结构;
typedef struct{
int width;
int height;
int Npcnum; //地图上的Npc数量;
unsigned short *Surface; //地表层数据指针;
unsigned short *Object; //对象层指针;
unsigned short *Obstacle; //障碍层数据指针;
unsigned short *Outlet; //出口层数据指针;
unsigned short *Item; //物品层指针;
ROLE_STRUCT *Npc; //地图上的Npc指针;
}MAP_STRUCT;
MAP_STRUCT map[MAPS];
//物品游标结构;
typedef struct{
int nSelected;
int nDispos;
}CURSOR_STRUCT;
CURSOR_STRUCT ItemCur;
int nTopItem; //物品列表最上物品;
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND InitWindow(HINSTANCE hInstance, int nCmdShow); // 创建主工作窗口;
void MainLoop(); //游戏主循环;
void DestroyWorld(); //释放游戏资源;
//下面是与Direct draw有关的函数;
BOOL InitDDraw(void); // 初始化DirectDraw并且打印字幕;
void UninitDDraw(void); // 卸载DirectDraw函数;
BOOL CreateBitmap(LPDIRECTDRAWSURFACE &lpTemp,int x,int y,char *BitmapFile, DWORD MemoryFlag=0);//创建页面
HRESULT restoreAll( void ); //恢复所有页面;
BOOL Blt(LPDIRECTDRAWSURFACE SS,int x,int y,LPDIRECTDRAWSURFACE DS,RECT rcRect,BOOL Flog);//位图拷贝;
void Bar(LPDIRECTDRAWSURFACE surf, int x1, int y1, int x2, int y2, WORD color);//填充实心矩阵;
void Flip(void); //换页;
BOOL initFail(char *str); //初始化失败的处理函数;
//下面是游戏相关函数;
RECT GetRect(int,int,int,int); //设置矩形;
int ReadLine(char *datas,int &n,char *Chs,int Seek=11); //读行函数;
DIRECTION Int2Dir(int n); //整数转化DIRECTION;
BOOL LoadMaps(); //读取地图;
BOOL LoadNpcData(); //读取Npc数据;
void LoadItemData(); //读却物品数据;
char *GetTalk(int ID,int Talk_Num); //找寻对话数据;
char *ReadWord(char *Temp, int &n1); //分段处理对话;
void LoadTalkText(); //读取对话数据;
void InitGameData(); //初始化游戏数据;
void MakeBackGround(); //生成背景;
void ProtagonistMove(); //处理主角移动;
void NpcMove(); //处理Npc移动;
void SceneSwitch(int msg); //切换场景;
BOOL AddItem(int nItem); //添加物品;
void DrawMenuback(); //画菜单背景;
void StatusDisplay(); //显示状态;
void ReCalAbi(); //重新计算主角能力;
void PopMsgWindow(); //弹出消息框;
void MsgDelay(DWORD delaytime); //消息延迟;
void DialogShow(int npc_num, int id, int talk_num); //对话;
void DealDialog(int dealtype, ROLE_STRUCT boss); //交易界面;
void BattleStatus(ROLE_STRUCT enemy, int back); //战斗状态;
int Battle(ROLE_STRUCT enemy, int back, int bossbattle);//战斗函数;
void Prize(ROLE_STRUCT enemy); //战果;
void SaveGame(int num); //存盘;
BOOL LoadGame(int num); //读盘;
void SLDialog(int flag); //存取界面;
char talktoken;//谈话人标志;
char endtoken;//谈话结束标志;
//*********************************
BOOL InitDDraw(void)//初始化Directx;
{
DWORD dwFlags;
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
HRESULT ddrval;
// 创建DirectDraw对象;
if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK) return FALSE;
//设置协作级别为全屏模式
dwFlags = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN;
if (lpDD->SetCooperativeLevel(hWnd,
dwFlags)!=DD_OK)
return FALSE;
// 设置显示模式;
if(lpDD->SetDisplayMode(ScreenX,ScreenY,ScreenColorDepth)!=DD_OK) return FALSE;
// 创建主页面;
ZeroMemory( &ddsd, sizeof( ddsd ) );
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");
}
//创建备份页面;
CreateBitmap(lpDDSBackup, ScreenX, ScreenY, " ");
//创建地表层页面;
CreateBitmap(lpDDSSurface, 640, 960, "Pic\\Surface.bmp");
//创建对象层页面;
CreateBitmap(lpDDSObject, 640, 352, "Pic\\Object.bmp");
DDSetColorKey(lpDDSObject, RGB(0,0,0));
//创建主角页面;
CreateBitmap(lpDDSPlayer, 96, 192, "Pic\\Player.bmp");
DDSetColorKey(lpDDSPlayer, RGB(0,0,0));
//创建主角头像页面;
CreateBitmap(lpDDSPortrait, 150, 200, "Pic\\Portrait.bmp");
DDSetColorKey(lpDDSPortrait, RGB(0,0,0));
//创建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\\Evil01.bmp",
"Pic\\Evil02.bmp", "Pic\\Boss.bmp"};
for (int i=0; i<NPCS; i++)
{
CreateBitmap(lpDDSNpc[i], 96, 192, Npc_FileName[i], DDSCAPS_SYSTEMMEMORY);
DDSetColorKey(lpDDSNpc[i],RGB(0,0,0));
}
//创建战斗背景页面;
char *BB_FileName[]={"Pic\\Background01.bmp", "Pic\\Background02.bmp"};
for (i=0; i<BATTLEBACKS; i++)
{
CreateBitmap(lpDDSBattleback[i], 640, 480, BB_FileName[i], DDSCAPS_SYSTEMMEMORY);
}
//创建战斗动画页面;
char *BA_FileName[]={"Pic\\Player_B.bmp", "Pic\\Evil01_B.bmp", "Pic\\Evil02_B.bmp", "Pic\\Boss_B.bmp"};
for (i=0; i<BATTLEANIS; i++)
{
CreateBitmap(lpDDSBattleani[i], 400, 500, BA_FileName[i], DDSCAPS_SYSTEMMEMORY);
DDSetColorKey(lpDDSBattleani[i], RGB(0,0,0));
}
//创建战斗特效页面;
char *BE_FileName[]={"Pic\\Effect01.bmp", "Pic\\Effect02.bmp", "Pic\\Effect03.bmp"};
for (i=0; i<BATTLEEFFS; i++)
{
CreateBitmap(lpDDSBattleeff[i], 288, 100, BE_FileName[i], DDSCAPS_SYSTEMMEMORY);
DDSetColorKey(lpDDSBattleeff[i], RGB(0,0,0));
}
//创建战斗面板页面;
CreateBitmap(lpDDSBattlepanel, 640, 120, "Pic\\Battlepanel.bmp");
DDSetColorKey(lpDDSBattlepanel, RGB(0,0,0));
//创建血、气槽页面;
CreateBitmap(lpDDSSlot, 110, 7, "Pic\\Slot.bmp");
DDSetColorKey(lpDDSSlot, RGB(0,0,0));
//创建对画面板页面;
CreateBitmap(lpDDSTalkbar, 640, 96, "Pic\\Talkbar.bmp");
DDSetColorKey(lpDDSTalkbar, RGB(0,0,0));
//创建继续对话页面;
CreateBitmap(lpDDSContinue, 46, 23, "Pic\\Continue.bmp");
DDSetColorKey(lpDDSContinue, RGB(0,0,0));
//创建主菜单背景页面;
CreateBitmap(lpDDSMenuback, 288, 144, "Pic\\Menuback.bmp");
//创建列表框页面;
CreateBitmap(lpDDSListBox, 185, 421, "Pic\\ListBox.bmp");
//创建箭头页面;
CreateBitmap(lpDDSScrollArrows, 20, 40, "Pic\\ScrollArrows.bmp");
DDSetColorKey(lpDDSScrollArrows, RGB(0,0,0));
//创建选项方框页面页面;
CreateBitmap(lpDDSRectangle, 100 , 45, "Pic\\Rectangle.bmp");
//创建手形游标页面;
CreateBitmap(lpDDSHandcursor, 64, 32, "Pic\\Handcursor.bmp");
DDSetColorKey(lpDDSHandcursor, RGB(0,0,0));
//创建武器图标页面;
CreateBitmap(lpDDSWeapon, 24, 24, "Pic\\Weapon.bmp");
DDSetColorKey(lpDDSWeapon, RGB(0,0,0));
//创建防具图标页面;
CreateBitmap(lpDDSArmor, 24, 24, "Pic\\Armor.bmp");
DDSetColorKey(lpDDSArmor, RGB(0,0,0));
//创建选择框页面;
CreateBitmap(lpDDSOptionBox, 76, 77, "Pic\\OptionBox.bmp");
DDSetColorKey(lpDDSOptionBox, RGB(0,0,0));
//创建消息框页面;
CreateBitmap( lpDDSMsgBox, 96, 96, "Pic\\MsgBox.bmp");
SetTimer(hWnd,1,400,NULL); //设置定时器;
srand((unsigned)time(NULL)); //初始化随机指数;
return TRUE;
}
void UninitDDraw(void)//卸载DirectDraw;
{
SAFE_RELEASE(lpDDSPrimary);
SAFE_RELEASE(lpDDSBackup);
SAFE_RELEASE(lpDDSPlayer);
SAFE_RELEASE(lpDDSSurface);
SAFE_RELEASE(lpDDSObject);
SAFE_RELEASE(lpDDSPortrait);
for(int i=0; i<NPCS; i++)
SAFE_RELEASE(lpDDSNpc[i]);
for(i=0; i<BATTLEBACKS; i++)
SAFE_RELEASE(lpDDSBattleback[i]);
for(i=0; i<BATTLEANIS; i++)
SAFE_RELEASE(lpDDSBattleani[i]);
for(i=0; i<BATTLEEFFS; i++)
SAFE_RELEASE(lpDDSBattleeff[i]);
SAFE_RELEASE(lpDDSBattlepanel);
SAFE_RELEASE(lpDDSSlot);
SAFE_RELEASE(lpDDSTalkbar);
SAFE_RELEASE(lpDDSContinue);
SAFE_RELEASE(lpDDSMenuback);
SAFE_RELEASE(lpDDSListBox);
SAFE_RELEASE(lpDDSScrollArrows);
SAFE_RELEASE(lpDDSRectangle);
SAFE_RELEASE(lpDDSHandcursor);
SAFE_RELEASE(lpDDSWeapon);
SAFE_RELEASE(lpDDSArmor);
SAFE_RELEASE(lpDDSOptionBox);
SAFE_RELEASE(lpDDSMsgBox);
SAFE_RELEASE(lpDD); //释放Ddraw指针;
}
//恢复所有页面
HRESULT restoreAll( void )
{
HRESULT ddrval;
ddrval = lpDDSPrimary->Restore ();
ddrval = lpDDSBack->Restore ();
ddrval = lpDDSBackup->Restore ();
ddrval = lpDDSSurface->Restore ();
ddrval = lpDDSObject->Restore ();
ddrval = lpDDSPlayer->Restore ();
ddrval = lpDDSPortrait->Restore ();
for (int i=0; i<NPCS; i++)
ddrval = lpDDSNpc[i]->Restore ();
for (i=0; i<BATTLEBACKS; i++)
ddrval = lpDDSBattleback[i]->Restore ();
for (i=0; i<BATTLEANIS; i++)
ddrval = lpDDSBattleani[i]->Restore ();
for (i=0; i<BATTLEEFFS; i++)
ddrval = lpDDSBattleeff[i]->Restore ();
ddrval = lpDDSBattlepanel->Restore ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -