新版easyX图形库在VS2019中的几个问题及解决

        在最近的小学期中,笔者按照easyX教程通过Visual Studio2019进行游戏设计,过程中出现了不少新问题。笔者才疏学浅,对许多bug的形成原因不求甚解,现将解决方式整理以飨读者。

1.outtextxy函数的文本输出

 在Visual Studio2019中出现了:

error C2665: “outtextxy”: 2 个重载中没有一个可以转换所有参数类型

问题原因:Visual Studio2019采用Unicode字符集,MBCS编码无法正常通过。

解决方法:

        1.将字符串前加L,转换成Unicode字符。

	setbkmode(TRANSPARENT);	//背景调为透明
    outtextxy(Width * 0.48, High * 0.9, L"Score:");

       2. LPCTSTR 可以同时适应两种编码,需要使用 TCHAR 字符串及相关函数。

// 输出数值 1024,先将数字格式化输出为字符串(项目字符集)
TCHAR s[5];
_stprintf_s(s, _T("%d"), 1024);	//个人在VS2019里这么写,还看到有人不带_s,但我这里程序跑不了
outtextxy(10, 60, s);

2.mciSendString无法播放音乐

mciSendString(L"open D:\\planebattle\\game_music.mp3 alias bkmusic", NULL, 0, NULL);

代码段正确但是无法播放音乐。

解决方法:

        1.注意是否遗漏Windows Multimedia API引用。

#pragma comment(lib,"Winmm.lib")

         2.注意后续语句段的命令,将NULL参数修改为0。关于命令的修改可参考:(17条消息) 解决用mciSendString()函数不能播放音乐的问题_lyy0xfff的博客-CSDN博客_mcisendstring播放不出音乐

	mciSendString(L"open D:\\planebattle\\game_music.mp3 alias bkmusic", 0, 0, 0);
	mciSendString(L"play bkmusic repeat", 0, 0, 0);

        3.网易云部分音乐显示为MP3格式但是实际上不能播放,建议别用网易云下载 。

3.MouseHit、GetMouseMsg等函数的废弃 

在新版本的easyX中,用结构体ExMessgae保存鼠标信息,用peekmessage和getmessage函数替代了MouseHit和GetMouseMsg函数。

//旧版
while(MouseHit())
//新版(参考)
ExMessage m;
while (peekmessage(&m, EM_MOUSE, PM_NOREMOVE))

EM_MOUSE:鼠标信息 。

PM_NOREMOVE:在处理完消息后,不从消息队列中移除,也可以通过PM_REMOVE来将消息移除。

//旧版
MOUSEMSG m;
m = GetMouseMsg();
m.uMsg == WM_MOUSEMOVE
//新版(参考)
ExMessage m;
m = getmessage(EM_MOUSE);
m.message == WM_MOUSEMOVE

 4.在Visual Studio2019中的<conio.h>

这个比较简单,注意kbhit(),getch()等函数在VS2019中的正确书写形式,如 kbhit()->_kbhit(), getch()->_getch()等。

 附:ExMessage详解

标志描述
EM_MOUSE鼠标消息。
EM_KEY按键消息。
EM_CHAR字符消息。
EM_WINDOW

窗口消息。 

其中的EM_MOUSE详细描述如下:

WM_MOUSEMOVEEM_MOUSE鼠标移动消息。
WM_MOUSEWHEEL鼠标滚轮拨动消息。
WM_LBUTTONDOWN左键按下消息。
WM_LBUTTONUP左键弹起消息。
WM_LBUTTONDBLCLK左键双击消息。
WM_MBUTTONDOWN中键按下消息。
WM_MBUTTONUP中键弹起消息。
WM_MBUTTONDBLCLK中键双击消息。
WM_RBUTTONDOWN右键按下消息。
WM_RBUTTONUP右键弹起消息。
WM_RBUTTONDBLCLK右键双击消息。

  • 23
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以给您讲述用VS2019利用C++语言及easyX设计俄罗斯方块的概要分析和数据结构设计。 概要分析: 俄罗斯方块是一种经典的游戏,游戏有七种不同形状的方块,玩家需要将它们放置在一个10行20列的矩阵。当一行被填满时,这一行会被清除并得到相应的分数。游戏结束的条件是矩阵的方块堆积到了最高处。 设计思路: 为了实现俄罗斯方块游戏,我们需要设计以下几个部分: 1. 方块的数据结构:每个方块都由四个小方块组成,我们可以用一个4x4的数组表示每种方块的形状,用一个变量记录当前方块的位置,每次移动时更新这个变量即可。 2. 游戏界面的设计:游戏界面可以用一个10x20的数组表示,每个方块的状态可以用数字0或1表示,0表示该位置为空,1表示该位置有方块。 3. 游戏逻辑的实现:游戏逻辑主要包括方块的移动、旋转、堆叠、消除等功能。每个方块的移动可以通过更新方块位置变量来实现,旋转可以通过变换方块的形状数组来实现,堆叠和消除需要判断当前方块的位置是否合法以及是否可以消除一行来实现。 4. 界面交互的实现:界面交互主要包括键盘事件的处理、图形界面的绘制等。可以使用easyX库来实现游戏界面的绘制,使用Windows API来处理键盘事件。 数据结构设计: 方块的数据结构可以用一个结构体来表示,包括方块的形状数组和当前位置变量: ``` struct Block { int shape[4][4]; // 方块形状数组 int x, y; // 当前位置 }; ``` 游戏界面可以用一个二维数组来表示,每个元素可以用数字0或1表示该位置是否有方块: ``` int gameBoard[10][20]; ``` 游戏逻辑需要用到一些辅助函数来判断方块是否可以移动、旋转、堆叠、消除等,例如: ``` bool canMove(int dx, int dy); // 判断方块是否可以移动 bool canRotate(); // 判断方块是否可以旋转 bool canStack(); // 判断方块是否可以堆叠 int clearLines(); // 清除满行并返回得分 ``` 以上是俄罗斯方块游戏的概要分析和数据结构设计,希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值