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

📄 mygame.cpp

📁 本人初学C和directx时编的RPG游戏源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 + -