c++头文件

T_config.h

  • 窗口菜单一些常量
  • enum

GAME_DIR游戏方向常量,其值为方向键对应的键值
TRANSFER图像绘制处理常量
GAME_STATE 游戏状态枚举常量定义
KM_ACTION 按键行为常量
LAYER_TYPE 图层类型

  • struct

typedef struct{}SPRITEINFO;游戏角色关键信息(每个新增角色必须设置全部值)
typedef struct{}LAYERINFO;地图每个图层信息
typedef struct {}MENUITEM;菜单项信息
typedef struct {}MENU_INFO;菜单信息

T_display.h

保存 恢复 改变分辨率

T_engine.h

  • 数据成员

public:
static HWND m_hWnd; // 窗口句柄
static HINSTANCE m_hInstance; // 实例句柄
static T_Engine* pEngine; // 本类静态指针(必须指向本类继承类)

protected:
ULONG_PTR ptrGdiplusToken; // 对GDI+的引用
LPCTSTR wndClass; // 窗口类名称
LPCTSTR wndTitle; // 窗口标题
int wndWidth, wndHeight; // 窗口宽高
int scrnWidth, scrnHeight; // 屏幕分辨率宽、高
WORD wIcon, wSmIcon; // 程序大图标及小图标
BOOL m_bFullScreen; // 是否全屏显示标志;
RECT m_rcOld; // 当前窗口尺寸
LONG style; // 窗口基本风格
LONG ex_style; // 窗口扩展风格
T_Display* p_disp; // 定义显示类指针
int IntervalTime; // 游戏帧刷新间隔时间
BOOL isAsleep; // 窗口是否处于非焦点状态
HBITMAP bufferBitmap; // 内存缓冲位图
HDC bufferDC; // 内存缓冲设备
bool keys[256]; // 记录键盘状态的数组
int GameState; // 游戏状态(为GAME_STATE常量值)

  • 成员函数

// 构造函数(更新: 2019-09-28)
T_Engine(HINSTANCE hInstance, LPCTSTR szWindowClass, LPCTSTR szTitle, WORD Icon = NULL, WORD SmIcon = NULL, int iWidth = WIN_WIDTH, int iHeight = WIN_HEIGHT, COLORREF bkColor = WIN_BKCLR); // 更新: 2019-09-28(添加窗口背景色参数)
// 析构函数
virtual ~T_Engine();
// 获取游戏帧刷新间隔时间
int GetInterval() { return IntervalTime; }
// 设置游戏帧刷新间隔时间
void SetFrame(int iTime) { IntervalTime = 1000 / iTime; }
// 获取窗口是否为焦点状态
BOOL GetSleep() { return isAsleep; }
// 设置窗口是否为焦点状态
void SetSleep(BOOL asleep) { isAsleep = asleep; }
// 设置窗口是否全屏幕显示
void SetFullScreen(BOOL isFull){ m_bFullScreen = isFull; }
// 获取当前的按键状态
bool CheckKey(WPARAM wParam){ return keys[wParam]; }
// 附加按键行为处理
void SubKeyAction(WPARAM wParam);
void SetBackColor(COLORREF bkcolor);// 更新: 2019-10-11(改变缓冲位图背景色)
// 被系统自动调用的回调函数
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
// 初始化处理
BOOL GameWinInit();
// 消息处理函数,将被回调函数调用
LRESULT GameEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// 引擎启动函数
void StartEngine();

public:
// 纯函数声明(具体游戏要重载这些函数并增加游戏功能代码)
// 游戏初始化
virtual void GameInit()=0;
// 游戏逻辑处理
virtual void GameLogic()=0;
// 游戏结束处理
virtual void GameEnd()=0;
// 根据GAME_STATE值显示游戏界面
virtual void GamePaint(HDC hdc)=0;
// 根据KM_ACTION值处理按键行为
virtual void GameKeyAction(int ActionType=KEY_SYS_NONE)=0;
// 根据KM_ACTION值处理鼠标行为
virtual void GameMouseAction(int x, int y, int ActionType)=0;

T_graph.h

  • 数据成员

protected:
HBITMAP hBmp; // 已加载图像句柄
int ImageWidth; // 已加载图像宽
int ImageHeight; // 已加载图像高
public:
T_Graph(); // T_Graph类默认构造函数
T_Graph(wstring fileName); // 使用指定文件创建T_Graph对象
virtual ~T_Graph(); // T_Graph类的析构函数
HBITMAP GetBmpHandle(){ return hBmp; } // 获得已加载图像句柄
int GetImageWidth(){ return ImageWidth; } // 获得已加载图像宽
int GetImageHeight(){ return ImageHeight; } // 获得已加载图像高

  • 成员函数

public:
// 加载图像(支持BMP, GIF, JPEG, PNG, TIFF等格式)
bool LoadImageFile(wstring path);
void PaintImage(HDC hdc, int x, int y);
void PaintImage(HDC hdc, int x, int y, int width, int height);
void PaintImage(HDC hdc, int x, int y, int width, int height, BYTE alpha);
void Destroy(); // 释放资源
public:
static HBITMAP CreateBlankBitmap(int width, int height, COLORREF color);
// 把HBITMAP句柄转换为Bitmap类对象的函数
static Bitmap* HBITMAP_To_Bitmap(HBITMAP hbmp, HDC hdc);
// 绘制原始图像的局部区域,绘制时可以进行缩放并指定透明度和图像的旋转方式
// 参数in_hbitmap为要操作的原始位图句柄
// 参数destDC为要绘制的目标设备
// 参数destX、destY为绘制的目的地坐标位置
// 局部区域由参数srcX、srcY、regionWidth和regionHeight指定
// 参数ratio指定缩放比率,该值为1保持原样,小于1为缩小,大于1为放大
// 参数rotType指定旋转类型(该参数的值必须是TRANSFER常量值之一)
// 参数alpha为绘制时的透明度
static void PaintRegion(HBITMAP in_hbitmap, HDC destDC, int destX, int destY, int srcX, int srcY, int regionWidth, int regionHeight,float ratio, int rotType=0, BYTE alpha=255);
// 根据PaintRegion封装的一个专门用于绘制动画帧图像的函数
// 参数in_hbitmap为要操作的原始位图句柄
// 参数destDC为要绘制的目标设备
// 参数destX、destY为绘制的目的地坐标位置
// 参数FrameCount为动画帧总数
// 参数RowFrames为保存帧图图像每行帧图的数量
// 参数wFrame、hFrame为帧宽、高
// 参数ratio指定缩放比率,该值为1保持原样,小于1为缩小,大于1为放大
// 参数rotType指定旋转类型(该参数的值必须是TRANSFER常量值之一)
// 参数alpha为绘制时的透明度
static void PaintFrame(HBITMAP in_hbitmap, HDC destDC, int destX, int destY, int FrameCount, int RowFrames, int wFrame, int hFrame,float ratio=1, int rotType=0, BYTE alpha=255);
static void PaintBlank(HBITMAP hbmp, int width, int height, COLORREF crColor);
static void PaintBlank(HDC hdc, int x, int y, int width, int height, Color crColor);
static void PaintBlank(HDC hdc, int x, int y, int width, int height, COLORREF crColor, int alpLevel);
static void PaintText(HDC hdc, RectF fontRect, wstring text,REAL fontSize, wstring fontName,Color fontColor = Color::White, FontStyle style = FontStyleBold,StringAlignment align = StringAlignmentCenter);
};

T_menu.h

  • 数据成员

protected:
MENU_INFO menu_info; // 菜单信息
int m_index; // 当前焦点菜单索引号
bool isItemFocused; // 当前菜单是否获焦点
int lastIndex;
int key_index;
int MaxMenuItemLen; // 最长菜单文字长度
int bkImageAlpha; // 背景图片透明度
int bkColor; // 背景颜色
T_Graph gm_menuBkg; // 菜单背景
T_Graph BtnDIB; // 菜单图片
vector<MENUITEM> gm_menuItems; // 菜单项目
int GetMenuIndex(int x, int y); // 根据当前鼠标坐标计算菜单项索引号
StringAlignment GetAlignment();
FontStyle GetFontStyle();
AudioDXBuffer* m_MoveSound; // 菜单鼠标移过时的声音
AudioDXBuffer* m_ClickSound; // 菜单鼠标点击时的声音

  • 成员函数

public:
T_Menu();
virtual ~T_Menu(void);
// 设置菜单背景图片。透明度及背景颜色
void SetMenuBkg(wstring img_path, int alphaLevel=255, COLORREF backColor=RGB(0,0,0));
void SetBtnBmp(wstring img_path, // 设置菜单按钮图片
int btnWidth, // 图片按钮宽
int btnHeight); // 图片按钮高
void SetMenuInfo(MENU_INFO menuInfo);
void AddMenuItem(MENUITEM menuItem); // 添加菜单文字项目
//菜单绘制: btnTrans按钮透明度, 255不透明; startState是否绘制开始菜单
void DrawMenu(HDC hdc, BYTE btnTrans=255, bool startState=true);
int MenuMouseClick(int x, int y); // 菜单鼠标点击事件处理
void MenuMouseMove(int x, int y); // 菜单鼠标移动事件处理
int MenuKeyDown(WPARAM key); // 菜单按键事件处理
int GetMenuIndex(){ return m_index; } // 返回当前的m_index
void SetMenuIndex(int i){ m_index = i; } // 设置当前的m_index
void DestroyAll();
void SetMoveSound(AudioDXBuffer* ms_buffer);
void SetClickSound(AudioDXBuffer* mc_buffer);

T_Scene.h

typedef struct
{
int z_order; // 图层序号(序号越小图层离观众越近)
int type_id; // LAYER_TYPE常量值的图层类型标识号
T_Layer* layer; // 地图图层图像
}GAMELAYER;
// 游戏中的图层容器类型
typedef vector<GAMELAYER> SCENE_LAYERS;
class T_Scene
{
protected:
SCENE_LAYERS sceneLayers; // 保存游戏中全部图层的vector容器
T_Map* pBarrier; // 碰撞图层指针
T_Map* pMask; // 遮罩层指针
int SceneWidth, SceneHeight; // 整个场景的宽、高
int WinWidth, WinHeight; // 窗口的宽、高
int lastSceneX, lastSceneY; // 场景上一次的坐标位置
int SceneX, SceneY; // 场景当前的坐标位置
bool LayerChanged; // 图层是否发生变化
//图层排序比较函数(该函数必须为静态函数)
static bool SortByZorder(const GAMELAYER &l1, const GAMELAYER &l2);

public:
T_Scene();
virtual ~T_Scene(void);
//……………………………………………………………………………………
// 获取本类数据成员值的函数
//……………………………………………………………………………………
// 获取场景当前X坐标
int getSceneX(){ return SceneX; }
// 获取场景当前Y坐标
int getSceneY(){ return SceneY; }
// 获取场景上一次X坐标
int getlastSceneX(){ return lastSceneX; }
// 获取场景上一次Y坐标
int getlastSceneY(){ return lastSceneY; }
// 获取场景中地图障碍图层
T_Map* getBarrier(){ return pBarrier; }
// 获取场景中地图遮罩图层
T_Map* getMask(){ return pMask; }
// 场景中图层总数
int GetTotalLayers(){ return (int)(sceneLayers.size()); }
// 获取场景图层容器对象
SCENE_LAYERS* getSceneLayers(){ return &sceneLayers; }
//……………………………………………………………………………………
// 与场景操作相关的函数
//……………………………………………………………………………………
// 场景初始化
void InitScene(int scn_x, int scn_y,
int scn_width, int scn_height,
int win_width, int win_height);
// 设置场景左上角坐标
void SetScenePos(int x, int y);
// 将场景当前坐标按照参数指定的步长移动
void MoveScene(int speedX, int speedY);
// 根据参数指定的角色对象判断场景是否需要滚动
void ScrollScene(T_Sprite* player);
//……………………………………………………………………………………
// 与图层操作相关的函数
//……………………………………………………………………………………
// 添加图层
void Append(GAMELAYER gm_layer);
// 在指定的图层索引号前插入图层
void Insert(GAMELAYER gm_layer, int index);
// 删除指定图层
void Remove(GAMELAYER gm_layer);
// 删除全部图层
void RemoveAll();
// 根据图层索引号对图层进行排序
void SortLayers();
// 得到地图上非障碍的随机位置
POINT getRandomFreeCell();
//…………………………………………………………………………………
// 与地图文件解析有关的函数
//……………………………………………………………………………………
// 解析第一个参数指定的字符串中是否存在第二个参数指定的关键字
// 如果存在,解析关键字后的值并转换成整型,通过第三个参数输出
void GetTxtMapValue(wstring str, wstring keywords, int& value);
// 解析第一个参数指定的字符串中是否存在第二个参数指定的关键字
// 如果存在,解析关键字后的值并转换成字符串,通过第三个参数输出
void GetTxtMapValue(wstring str, wstring keywords, wstring& value);
// 解析第一个参数指定的CSV格式的地图数据字符串
// 将解析后的地图数据保存到第二个参数的data元素中
void parseCsvData(wstring csv_data, LAYERINFO& m_LayerInfo);
// 加载参数指定的地图文件,解析其中的地图数据,并保存到场景图层中
bool LoadTxtMap(const char* txtmap_path);
//……………………………………………………………………………………
// 负责整个场景绘制的函数
//……………………………………………………………………………………
void Draw(HDC hdc, int x, int y);

T_sprite.h

#define ROUND(x) (int)(x+0.5) //定义四舍五入的宏
class T_Sprite:public T_Layer
{
protected:
//……………………………………………………………………………………
// 与角色图像相关的属性
//……………………………………………………………………………………
T_Graph spImg; // 原始角色图片
T_Graph spOldImg; // 修改前角色图片
int frameCols; // 原始帧图片总列数
int frameRows; // 原始帧图片总行数
int rawFrames; // 原始帧图片总帧数
int totalFrames; // 当前帧图片总帧数
int forward; // 从前往后播放帧计数
int backward; // 从后往前播放帧计数
bool loopForward; // 是否从前往后播放帧
int* frameSequence; // 自定义动画帧序列
float frameRatio; // 帧图片放大或缩小比(1是原始,大于1放大,小于1缩小)
int frameRotate; // 帧图片旋转或翻转方式(取值为TRANSFER常量值)
BYTE frameAlpha; // 帧图片透明度(255不透明, 0完全透明)
//……………………………………………………………………………………
// 与角色状态相关的属性
//……………………………………………………………………………………
int dir; // 初始方向
int lastDir; // 上次方向
bool active; // 是否可活动
bool dead; // 是否死亡
int speed; // 初始移动速度
int level; // 初始游戏等级
int score; // 游戏分值
DWORD startTime; // 计时开始时间
DWORD endTime; // 计时结束时间
//……………………………………………………………………………………
// 与碰撞检测相关的属性
//……………………………………………………………………………………
RECT colideRect; // 碰撞检测矩形区域
int colideWidth; // 碰撞区域宽度
int colideHeight; // 碰撞区域高度
POINT mapBlockPT; // 碰撞到障碍时的位置

public:
//……………………………………………………………………………………
// 构造函数、析构函数及类名获取函数
//……………………………………………………………………………………
// 构造函数参数说明:
// frameWidth和frameHeight值都为0: 角色图像无动画
// frameWidth和frameHeight值都大于0: 角色图像包含帧动画
T_Sprite(wstring imgPath, int frameWidth = 0, int frameHeight = 0);
// 析构函数
virtual ~T_Sprite(void);
// 获取本类名
virtual string ClassName(){ return "T_Sprite"; }
//……………………………………………………………………………………
// 与图像相关的操作
//……………………………………………………………………………………
T_Graph* GetImage(){ return &spImg; } // 获得本类T_Graph对象
void SetImage(T_Graph* pImg){ spImg = *pImg; } // 设置本类T_Graph对象
void ResetImage(){ spImg = spOldImg; } // 恢复本类T_Graph对象
float GetRatio(){ return frameRatio; } // 获得缩放比
void SetRatio(float rat){ frameRatio = rat; } // 设置缩放比
// 根据缩放比计算帧图片宽、高
SIZE GetRatioSize()
{
SIZE ratioFrameSize;
ratioFrameSize.cx = ROUND(frameRatio*Width);
ratioFrameSize.cy = ROUND(frameRatio*Height);
return ratioFrameSize;
}
int GetRotation(){ return frameRotate; } // 获得图像转换方式
void SetRotation(int rot){ frameRotate = rot; } // 设置图像转换方式(rot为TRANSFER常量值)
BYTE GetAlpha(){ return frameAlpha; } // 获得透明度值
void SetAlpha(BYTE a){ frameAlpha = a; } // 设置透明度值
//……………………………………………………………………………………
// 与状态相关的操作
//……………………………………………………………………………………
int GetDir(){ return dir; } // 获得方向值
void SetDir(int d){ dir = d; } // 设置方向值
bool IsActive(){ return active; } // 是否可活动
void SetActive(bool act){ active = act; } // 设置是否可活动
bool IsDead(){ return dead; } // 死亡状态
void SetDead(bool dd){ dead = dd; } // 设置死亡状态
int GetSpeed(){ return speed; } // 获得速度值
void SetSpeed(int spd){ speed = spd; } // 设置速度值
int GetLevel(){ return level; } // 获得等级值
void SetLevel(int lvl){ level = lvl; } // 设置等级值
int GetScore(){ return score; } // 获得分值
void SetScore(int scr){ score = scr; } // 设置分值
//……………………………………………………………………………………
// 与计时相关的操作
//……………………………………………………………………………………
void SetEndTime(DWORD time){ endTime = time; } // 设置计时结束时间
DWORD GetEndTime(){ return endTime; } // 获得计时结束时间
void SetStartTime(DWORD time){ startTime = time; } // 设置计时开始时间
DWORD GetStartTime(){ return startTime; } // 获得计时开始时间
//……………………………………………………………………………………
// 与碰撞相关的操作
//……………………………………………………………………………………
// 计算扩大或收缩后的碰撞检测区宽高(px、py为正值放大、负值缩小,单位为像素)
void AdjustCollideRect(int px=0, int py=0);
// 获得缩放后的实际碰撞检测矩形区域
RECT* GetCollideRect();
// 检测角色碰撞, distance检测碰撞的距离
bool CollideWith(T_Sprite* target, int distance=0);
// 检测地图碰撞
bool CollideWith(IN T_Map* map);
// 获取碰撞到障碍时的位置
POINT GetMapBlockPT(){ return mapBlockPT; }
//……………………………………………………………………………………
// 与动画帧相关的操作
//……………………………………………………………………………………
// 往前或往后循环播放所有帧
void LoopFrame(bool ahead = true);
// 往前或往后循环播放一轮所有帧
bool LoopFrameOnce(bool ahead = true);
// 获取原始帧的长度
int GetRawFrames(){ return rawFrames; }
// 计算帧序列数组长度
int GetTotalFrames(){ return totalFrames; }
// 获取当前帧序列号
int GetFrame(bool ahead = true)
{
if(ahead == true)
return forward;
else
return backward;
}
// 设置当前帧序列号
void SetFrame(int sequenceIndex, bool ahead = true)
{
if(ahead == true)
forward = sequenceIndex;
else
backward = sequenceIndex;
}
// 设置新的帧序列
void SetSequence(int* sequence, int length)
{
frameSequence = sequence;
totalFrames = length;
}
//……………………………………………………………………………………
// 与鼠标相关的操作
//……………………………………………………………………………………
// 根据鼠标判断方向
int GetDir(POINT mousePT);
// 检查角色是否到达鼠标处
bool MoveTo(IN POINT mousePT, IN POINT desPT, IN RECT Boundary);
// 检查角色是否到达地图鼠标处
bool MoveTo(IN POINT mousePT, IN POINT desPT, IN T_Map* map);
//……………………………………………………………………………………
// 本类初始化及绘制函数
//……………………………………………………………………………………
// 初始化本类对象
void Initiate(SPRITEINFO spInfo);
// 本类对象绘制
void Draw(HDC hdc);
};
// 计算扩大或收缩后的碰撞检测区宽高(px、py为正值放大、负值缩小,单位为像素)
inline void T_Sprite::AdjustCollideRect(int px, int py)
{
if(px == 0 && py == 0)
{
return;
}
else
{
RECT tempRec={0, 0, colideWidth, colideHeight};
InflateRect(&tempRec, px, py); //收缩或扩大矩形区域
colideWidth = tempRec.right-tempRec.left;
colideHeight = tempRec.bottom - tempRec.top;
}
}
// 获得缩放后的实际碰撞检测矩形区域
inline RECT* T_Sprite::GetCollideRect()
{
int c_left, c_top;
if(frameRatio>0)
{
c_left = (GetRatioSize().cx-colideWidth)/2;
c_top = (GetRatioSize().cy-colideHeight)/2;
}
else
{
c_left = ((int)GetWidth()-colideWidth)/2;
c_top = ((int)GetHeight()-colideHeight)/2;
}
colideRect.left = (LONG)X+c_left;
colideRect.right = colideRect.left + colideWidth;
colideRect.top = (LONG)Y+c_top;
colideRect.bottom = colideRect.top + colideHeight;
return &colideRect;
}
// 检测本角色对象是否与目标角色碰撞(distance参数为检测距离)
inline bool T_Sprite::CollideWith(T_Sprite* target, int distance)
{
//计算参与碰撞检测的角色矩形区域
RECT targetRect = *(target->GetCollideRect());
RECT hitRec;
hitRec.left =targetRect.left-distance;
hitRec.top = targetRect.top-distance;
hitRec.right = targetRect.right+distance;
hitRec.bottom = targetRect.bottom+distance;
RECT thisRect = *(this->GetCollideRect());
int cw = abs(thisRect.right - thisRect.left);
int tw = abs(hitRec.right - hitRec.left);
int ch = abs(thisRect.bottom - thisRect.top);
int th = abs(hitRec.bottom - hitRec.top);
//方式一:同时满足4个条件
return thisRect.left <= hitRec.right &&
hitRec.left <= thisRect.right &&
thisRect.top <= hitRec.bottom &&
hitRec.top <= thisRect.bottom;
//方式二:同时满足2个条件
//return (abs((thisRect.left + cw/2)-(hitRec.left + tw/2))<(cw+tw)/2) &&
// (abs((thisRect.top + ch/2)-(hitRec.top + th/2))<(ch+th)/2);
}

T_layer.h

class T_Layer
{
public:
T_Layer(){};
virtual ~T_Layer(void){};
protected:
int Width, Height; // 图层的宽、高
int X, Y; // 图层的X、Y坐标
bool Visible; // 图层是否可见
int LayerTypeID; // 图层的标识(取值为LAYER_TYPE常量)
int zorder; // 图层的绘制顺序
public:
// 设置和获取图层的宽、高
void SetWidth(int width){ Width = width; }
int GetWidth(){ return Width; }
void SetHeight(int height){ Height = height; }
int GetHeight(){ return Height; }
// 设置和获取图层的X、Y坐标
void SetPosition(int x, int y){ X = x; Y = y; }
int GetX(){ return X; }
int GetY(){ return Y; }
// 设置和获取图层可见性
void SetVisible(bool visible){ Visible = visible; }
bool IsVisible(){ return Visible; }
// 设置和获取图层的标识(取值为LAYER_TYPE常量)
void SetLayerTypeID(int i){ LayerTypeID = i; }
int GetLayerTypeID(){ return LayerTypeID; }
// 设置和获取图层的绘制顺序
int getZorder(){ return zorder; }
void setZorder(int z){ zorder = z; }
// 图层移动
//dx_speed: 正值向右移动, 负值向左移动
//dy_speed: 正值向下移动, 负值向上移动
void Move(int dx_speed, int dy_speed){ X += dx_speed; Y += dy_speed;}
// 获取本类及派生类的类名
virtual string ClassName(){ return "T_Layer"; }
// 纯虚函数,由派生类具体实现
virtual void Draw(HDC hdc)=0;
};

T_Map.h

  • 数据成员

protected:
int tile_width; // 图块宽
int tile_height; // 图块高
int map_cols; // 地图图块总列数
int map_rows; // 地图图块总行数
int first_gid; // 图块编号从0还是1开始
bool updated; // 地图图层是否更新
T_Graph* graph; // 保存图块图像或背景图像
HDC dc_buf; // 当前图层内存设备
HBITMAP hbmp_old; // 替换前的原始位图句柄
HBITMAP hbmp_layer; // 当前图层位图句柄
vector<vector<int>> layer_data; // 地图图层数据

  • 成员函数

public:
T_Map(LAYERINFO layerInfo); //使用地图数据构造
T_Map(wchar_t* imgFilepath); //使用背景图片构造
virtual ~T_Map(void);
int getTileWidth(){ return tile_width; } // 获得图块宽
int getTileHeight(){ return tile_height; } // 获得图块高
int getMapCols(){ return map_cols; } // 获取地图图块总列数
int getMapRows(){ return map_rows; } // 获取地图图块总行数
void setUpdate(bool updt){ updated = updt; } // 设置图层位图是否更新
bool getUpdate(){ return updated; } // 获取图层位图是否更新状态
virtual string ClassName(){ return "T_Map"; } // 获取当前类的类名
void setTile(int col, int row, int tileIndex); // 修改当前图层指定行、列的元素值
int getTile(int col, int row); // 获取当前图层指定行、列的元素值
void Redraw(HDC hdc); // 重新绘制当前图层全部图块
void Draw(HDC hdc); // 重载父类中的同名函数,处理图层绘制

T_util

  • 成员函数

public:
static HWND GetHWnd()
{
return FindWindow(WIN_CLASS, NULL);
}
static HINSTANCE GetHInst()
{
return GetModuleHandle(NULL);
}
static wchar_t * int_to_wstring(int i);
// 产生参数range指定范围的等额随机数
// 参数iArray为输出随机数的输出参数
// 参数iArray必须首先定义为元素个数等于range的数组
static void GetRandomNum(int range, int* iArray);
// 计算startPT到destPT之间
// 斜角移动时X轴与Y轴的分量值
// xRatio和yRatio为输出参数
static void GetBevelSpeed(
IN POINT startPT, IN POINT destPT,
OUT int& xRatio, OUT int& yRatio
);
// 根据输入的三个参数所指定的起点、终点坐标和移动速度
// 如果要保持两点直线移动且长边速度为指定移动速度
// 本函数计算出短边对应的分量速度
// xRatio与yRatio为输出参数, 即最终计算结果
// 本函数会自动判断方向:
// xRatio、yRatio为正值,表示朝右、下移动
// xRatio、yRatio为负值,表示朝左、上移动
static void GetBevelSpeed(
IN POINT startPT, IN POINT destPT, IN int Speed,
OUT int& xRatio, OUT int& yRatio
);

T_AI.h

  • 成员函数

// 记录移动信息的结构体
struct MoveCoord
{
int oldX; // 移动前的X坐标
int oldY; // 移动前的Y坐标
int moveX; // 移动后的X坐标
int moveY; // 移动后的Y坐标
int BoundDir; // 在边界上的方向
};
class T_AI
{
private:
int dir_style; // 方向模式,其值必须是4或8
// 躲避方向
// 最高维与GAME_DIR的元素编号一致
// 第二维表示对应的躲避方向
static int EvadeDir[8][5];
// 计算参数sp指定的角色前进方向对应的碰撞检测区域
// 参数sp:待检测的角色对象
// 参数spSizeTimes:角色宽高的倍数,决定检测区域的范围
// 参数testRec:输出型参数,得到最终的检测区域
void GetHitRect(IN T_Sprite* sp, IN int spSizeTimes, OUT RECT& testRec);
// 根据移动方向、速度和指定的活动范围计算当前角色的移动位置
MoveCoord GetMoveCoord(T_Sprite* npc_sp, int dir, int speed, RECT boundary);
public:
T_AI(int d_style); // d_style的值必须是4或8
virtual ~T_AI(void);
// 根据移动方向、速度和指定的活动范围对角色做漫游处理
void Wander(T_Sprite* npc_sp, int npc_dir, int speed, RECT boundary);
// 根据移动方向、速度和指定的地图对象对角色做漫游处理
void Wander(T_Sprite* npc_sp, int npc_dir, int speed, T_Map* map);
// 角色躲避处理,第一个参数为躲避的对象,第二个参数为要回避的检测对象
void Evade(T_Sprite* npc_sp, T_Sprite* player);
// 角色放重叠处理,第一个参数为检测对象,第二个参数为检测对象所在的角色集合
void CheckOverlay(T_Sprite* npc_sp, vector<T_Sprite*> vSpriteSet);
};

T_Audio.h

class AudioDX; //由于要先引用,所以需先声明后定义
//……………………………………………………………………………
// wave格式的读取类
//………………………………………………………………………………………
ass AudioWave {
public:
AudioWave();
virtual ~AudioWave();
//打开并读取WAVE文件
bool Open(const wchar_t *path);
//读取并查询是否存在data区块
bool StartRead();
//读取指定数据
bool Read(unsigned long size, void *data, unsigned long *nread);
//释放占用的资源
bool Close();
//获取wave格式属性
WAVEFORMATEX *GetFormat() { return wfex; }
//获取区块大小
DWORD CkSize() const { return ckIn.cksize; }
protected:
WAVEFORMATEX *wfex; //wave格式结构体指针
HMMIO hmmio; //文件句柄
MMCKINFO ckIn; //MMCKINFO对象(查询用子块)
MMCKINFO ckInRIFF; //MMCKINFO对象(父块,从文件获取)
} ;
//………………………………………………………………………………………………
// AudioDXBuffer类
//……………………………………………………………………………………
class AudioDXBuffer
{
protected:
LPDIRECTSOUNDBUFFER SndBuf; // 缓冲区接口指针
LONG Volume; // 音量
LONG Pan; // 左右声道相对音量
DWORD Freq; // 频率
public:
AudioDXBuffer();
~AudioDXBuffer();
// 创建辅助缓冲区并设计基本属性
bool CreateBuffer(AudioDX &ds, WAVEFORMATEX *format, int size);
// 创建主缓冲区并将主缓冲区设定为WAVE格式
bool CreateMainBuffer(AudioDX &ds, int freq=22050);
// 读入WAVE文件,并将文件数据写入缓冲区
bool LoadWave(AudioDX &ds, const wchar_t *path);
// 释放所有资源
HRESULT Release();
// 恢复缓冲区
HRESULT Restore();
// 终止处理(恢复缓冲区并停止声音播放)
void Terminate();
// 播放声音(参数决定是否循环)
bool Play(bool loop=false)
{
if(SndBuf == NULL) return false;
if (FAILED(SndBuf->Play(0, 0, loop? DSBPLAY_LOOPING: 0)))
return false;
return true;
}
// 停止声音播放
bool Stop(){ return SndBuf->Stop() == DS_OK; }
// 判断缓冲区是否处于活跃状态
bool IsAlive() const { return SndBuf != 0; }
// 重载"->"操作符, 表示SndBuf对象
LPDIRECTSOUNDBUFFER operator ->() { return SndBuf; }
} ;
//…………………………………………………………………………………
// AudioDX类
//……………………………………………………………………………………
class AudioDX
{
public:
AudioDX();
~AudioDX();
// 创建DirectSound对象、设置合作级别并创建主缓冲区
bool CreateDS(HWND hWnd, int freq=22050);
// 释放DirectSound对象及DirectSound缓冲区对象
void ReleaseAll();
// 失去缓冲区内存时则复原
HRESULT RestoreAll();
// 重载"->"操作符, 表示ds对象
LPDIRECTSOUND operator ->() { return ds; }
protected:
LPDIRECTSOUND ds; // DirectSound对象
AudioDXBuffer dsbuf; // DirectSound缓冲对象
} ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值