VisualC++游戏制作 SDK版本

游戏案例

  1. DNF
  2. 迷宫.
  3. 拳皇
  4. 射击打怪
  5. 星之卡比

辅助

微型游戏引擎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)
大图标:任务栏中程序图标

小图标:窗口上的图标
image.png

// 加载大图标
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

音效网站

豆丁音效素材
菜鸟图库mp3音效

转为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;
		}
  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值