游戏案例
辅助
微型游戏引擎TinyEngine
简易2d平面游戏框架
异型窗口
游戏背包的设计
2D Game Framework
美化
重新指定窗口所属窗口类的WNDCLASSEX结构体成员的值
DWORD SetClassLong(HWND hWnd, // 窗口句柄及间接给出的窗口所属的类
int nlndex, // 需要背修改替换的值
LONG dwNewLong) // 新的值 --注意结构类型的转化
// 实例:修改光标
SetClassLong(hwnd, GCL_HCURSOR , (LONG)LoadCursor(NULL, IDC_CROSS));
nlndex的值 | 说明 |
---|---|
GCL_CBCLSEXTRA | 设置与类相关的尺寸的字节大小。 设定该值不改变己分配的额外字节数 |
GCL_CBWNDEXTRA | 设置与类中的每一个窗口相关的尺寸的字节大小。设定该值不改变已分配额外字节数 查看如何进入该内存,参看SetWindowLOng |
GCL_HBRBACKGROUND | 替换与类有关的背景刷子的句柄 |
GCL_HCURSOR | 替换与类有关的光标的句柄 |
GCL_HICON | 替换与类有关的图标的句柄 |
GCL_HMODULE | 替换注册类的模块的句柄 |
GCL_STYLE | 替换窗口类的风格位。 |
GCL_MENUNAME | 替换菜单名字符串的地址。该字符串标识与类有关的菜单资源 |
GCL_WNDPROC | 替换与窗口类有关的窗口过程的地址 |
LOGO
U钙网
指针样式
初始样式
// 从文件中加载指针
wcex.hCursor = LoadCursorFromFile(".//res//Cursor.cur");
// 加载光标
wcex.hCursor = LoadCursor(hInstance, (LPCTSTR)IDC_CURSOR1);
或wcex.hCursor = (HICON)LoadImage(hInstance, (LPCTSTR)IDC_CURSOR1, IMAGE_CURSOR, 0, 0, LR_CREATEDIBSECTION);
在中途修改
// 函数原型:
HCURSOR SetCursor(HCURSOR hCursor);// 光标句柄
// 实例:
SetCursor(LoadCursor(NULL, IDC_CROSS));
窗口样式
HWND hwnd = CreateWindow(
TEXT("MainWindow"), // 类名
L"我的应用程序", // 窗口标题文字
WS_POPUP, // 设置为无边框全屏
0, //38, // 窗口相对于父级的x坐标
0, //20, // 窗口相对于父级的y坐标
GetSystemMetrics(SM_CXSCREEN), //480, // 窗口的宽度 GetSystemMetrics (SM_CXSCREEN):获取屏幕宽度
GetSystemMetrics(SM_CYSCREEN), //250, // 窗口的高度 GetSystemMetrics(SM_CYSCREEN):获取屏幕高度
NULL, // 没有父窗口
NULL, // 没有菜单
hInstance, // 当前应用程序的实例句柄
NULL); // 没有附加数据
图标样式
图标有两种,分别是大图标(wc.hIcon)和小图标(wc.hIconSm)
大图标:任务栏中程序图标
小图标:窗口上的图标
// 加载大图标
wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
或wc.hIcon = (HICON)LoadImage(hInstance, (LPCTSTR)IDI_ICON1, IMAGE_ICON, 0, 0, LR_CREATEDIBSECTION);
// 加载小图标
wc.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
或wc.hIconSm = (HICON)LoadImage(hInstance, (LPCTSTR)IDI_ICON1, IMAGE_ICON, 0, 0, LR_CREATEDIBSECTION);
现代化
旧的
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
新的
播放声音
PlaySound, mciSendString,mciSendCommand
音效网站
转为wav
FreeConvert.com
ConverterFactory
调用函数
#include "mmsystem.h"//导入声音头文件
#pragma comment(lib,"winmm.lib")//导入声音头文件库
BOOL PlaySound(
LPCTSTR pszSound, // 指定了要播放声音的字符串,如果该参数为NULL则停止正在播放的声音
HMODULE hmod, // 应用程序的实例句柄,当播放WAV资源时要用到该参数,否则它必须为NULL
DWORD fdwSound // 标志的组合,如下表所示. 若成功则函数返回TRUE,否则返回FALSE
);
- pszSound — 指定要播放的声音
- NULL 停止所有声音播放
- 音乐文件的路径(参数3必须有SND_FILENAME)
- 音乐文件资源ID(参数3必须有SND_RESOURCE)
- hmod — 指向包含要加载资源的可执行文件的句柄
- NULL
- 当前窗口实例句柄(官网上例子:GetModuleHandle(NULL))
- fdwSound — 用于播放声音的标志
- SND_FILENAME:通过文件名播放音乐
- SND_RESOURCE:通过资源标识符播放音乐**(音乐会编译进exe文件,不推荐使用)**
- SND_ASYNC:异步播放
- SND_LOOP:循环播放
| SND_APPLICATION | 用应用程序指定的关联来播放声音 |
| — | — |
| SND_ALIAS | pszSound参数指定了注册表或WIN.INI中的系统事件的别名 |
| SND_ALIAS_ID | pszSound参数指定了预定义的声音标识符 |
| SND_ASYNC | 用异步方式播放声音,PlaySound函数在开始播放后立即返回 |
| SND_FILENAME | pszSound参数指定了WAVE文件名 |
| SND_LOOP | 重复播放声音,必须与SND_ASYNC标志一块使用 |
| SND_MEMORY | 播放载入到内存中的声音,此时pszSound是指向声音数据的指针 |
| SND_NODEFAULT | 不播放系统声音
若无此标志,则PlaySound在没找到声音时会播放缺省声音 |
| SND_NOSTOP | PlaySound不打断原来的声音播出并立即返回FALSE |
| SND_NOWAIT | 如果驱动程序正忙则函数就不播放声音并立即返回 |
| SND_PURGE | 停止所有与调用任务有关的声音
若参数pszSound为NULL,就停止所有的声音
否则,停止pszSound指定的声音 |
| SND_RESOURCE | pszSound参数是WAVE资源的标识符,这时要用到hmod参数 |
| SND_SYNC | 同步播放声音,在播放完后PlaySound函数才返回。 |
PlaySound(".//filename.wav", NULL, SND_FILENAME | SND_ASYNC);
PlaySound(NULL,NULL,NULL,NULL);
代码备案
判断战斗人物状态
{
if (my.status == 1) // 我闲置
{
// 我闲置
myStatus = 0;
Hero_FightX = 200;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 6;
// 对方过来
if (Hero_FightX + 10 >= NPC_1_FightX)
{
tarStatus = 1;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
NPC_1_FightX -= FightWalkSpeed;
tarFrame--;
if (tarFrame <= 0)
tarFrame = 6;
}
// 对方攻击
if (Hero_FightX + 10 < NPC_1_FightX)
{
tarStatus = 2;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * tarStatus, FightWidth * tarStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 对手
tarFrame--;
if (tarFrame <= 0)
my.status = 1;
}
}
else if (my.status == 2) // 我攻击
{
// 我走过去
if (Hero_FightX + 10 <= NPC_1_FightX)
{
myStatus = 1;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
Hero_FightX += FightWalkSpeed;
myFrame++;
myFrame %= 6;
}
// 我攻击
if (Hero_FightX + 10 > NPC_1_FightX)
{
myStatus = 2;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 6;
}
Hero_FightX = 200, Hero_FightY = 300;
NPC_1_FightX = 700, NPC_1_FightY = 300;
// 对方闲置
tarStatus = 0;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth, FightWidth * tarFrame, FightWidth * tarStatus, FightWidth, RGB(0, 0, 0)); // 对手
tarFrame--;
if (tarFrame <= 0)
tarFrame = 6;
}
else if (my.status == 3) // 我倒了
{
// 我倒下
myStatus = 3;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 6;
// 对方闲置
tarStatus = 0;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth, FightWidth * tarFrame, FightWidth * tarStatus, FightWidth, RGB(0, 0, 0)); // 对手
tarFrame--;
if (tarFrame <= 0)
tarFrame = 6;
}
else if (my.status == 4) //对方倒了
{
// 我闲置
myStatus = 0;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 6;
// 对方倒下
tarStatus = 6;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth, FightWidth * tarFrame, FightWidth * tarStatus, FightWidth, RGB(0, 0, 0)); // 对手
tarFrame--;
if (tarFrame <= 0)
tarFrame = 6;
}
else if (my.status == 5) // 我闲置
{
// 我闲置
myStatus = 0;
Hero_FightX = 200;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 6;
// 对方过来
if (Hero_FightX + 10 >= NPC_1_FightX)
{
tarStatus = 1;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
NPC_1_FightX -= FightWalkSpeed;
tarFrame--;
if (tarFrame <= 0)
tarFrame = 6;
}
// 对方攻击
if (Hero_FightX + 10 < NPC_1_FightX)
{
tarStatus = 2;
SelectObject(bufdc, HFightNPC1);
MyTransparentBlt(mdc, NPC_1_FightX, NPC_1_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * tarStatus, FightWidth * tarStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 对手
tarFrame--;
if (tarFrame <= 0)
my.status = 1;
}
}
}
switch (my.status)
{
case IDLE:
myStatus = 0;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 5;
break;
case WALK:
// 向 NPC 移动
if (Hero_FightX < NPC_1_FightX - 10) // 假设最终距离 NPC 10 像素时停止
{
Hero_FightX += FightWalkSpeed;
}
else
{
my.status = ATTACK; // 准备攻击
}
myStatus = 1;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth* myFrame, FightWidth* myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
if (Hero_FightX + FightWalkSpeed < NPC_1_FightX)
{
my.status = ATTACK;
Hero_FightX += FightWalkSpeed;
}
myFrame++;
myFrame %= 5;
break;
case ATTACK:
myStatus = 2;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 5;
// 攻击完成后,重置状态为 IDLE
my.status = IDLE;
break;
case DEAD:
myStatus = 3;
SelectObject(bufdc, HFightPlayer);
MyTransparentBlt(mdc, Hero_FightX, Hero_FightY, FightWidth * 3, FightWidth * 3, bufdc, FightWidth * myFrame, FightWidth * myStatus, FightWidth, FightWidth, RGB(0, 0, 0)); // 人
myFrame++;
myFrame %= 5;
break;
}