基于MFC对话框 想做一款2D横版游戏,类似GBA恶魔城,想问一些有关问题
基于MFC对话框 想做一款2D横版游戏,类似GBA恶魔城,想问一些问题
本人新手。但是想尝试一下做个2D横版的小游戏。
一开始就遇到了一些问题,所以想问一下各位前辈。
1、比如我按下d键,人物向右边跑动。这个功能我实现了。但是有些缺陷。
就是我在OnKeyDown函数中设置一个计时器:
if (0x44==nChar)
{
SetTimer(1,15,NULL);
}
然后在OnTimer函数中用写显示图片的代码,但是发现,我按下d键的时候,人物一开始只播放了跑步的第一帧,过了大约半秒左右吧,才会连续播放后面的动画。
这就有点像在文本框按下一个按键,一开始只会显示一个字母,等过了一下才会连续显示一串字母。
我的播放图片的代码大概是这么写的:
我想问一下这个问题怎么解决?
2、就是我的人物要在一张背景图上移动,因为每次显示人物的动画,就要重绘窗口,背景图也会被擦掉。然后我就在上面这段代码KillTimer(1);前加了显示背景图片的代码。
buffer.DrawImage(m_pBg ,0,0);
gra.DrawImage(&bmp, 0, 0);
这样背景就不会被擦掉了,因为每次显示人物动画,这个背景也要被重绘。
但是发现,这样的话,人物就有闪烁。
这样的话,显示背景的代码应该放哪?
3、横版游戏的话,有些地形并不是平地,有斜坡什么的。
那一般要怎么实现人物在斜坡上走动?
网上查到好像可以用检测边缘的方法,但是不知道GDI+或者是CxImage中有没有检测边缘的函数。
或者各位前辈有更好的方法也可以说一下。
------解决方案--------------------
1、不要用OnKeyDown函数来检测按键。
在循环里用GetKeyState()来检测。
如果按键被按下,GetKeyState()<0;
2、用多线程来做,查资料学线程先吧。
3、百度查一下soble算子,顺便推荐一本书《Visual C++ 数字图像处理开发入门与编程实践》
本人新手。但是想尝试一下做个2D横版的小游戏。
一开始就遇到了一些问题,所以想问一下各位前辈。
1、比如我按下d键,人物向右边跑动。这个功能我实现了。但是有些缺陷。
就是我在OnKeyDown函数中设置一个计时器:
if (0x44==nChar)
{
SetTimer(1,15,NULL);
}
然后在OnTimer函数中用写显示图片的代码,但是发现,我按下d键的时候,人物一开始只播放了跑步的第一帧,过了大约半秒左右吧,才会连续播放后面的动画。
这就有点像在文本框按下一个按键,一开始只会显示一个字母,等过了一下才会连续显示一串字母。
我的播放图片的代码大概是这么写的:
CClientDC pDC(this);
Graphics gra(pDC.m_hDC);
CRect rect;
GetClientRect(&rect);
Bitmap bmp(rect.right,rect.bottom); //依窗口大小创建内存画布
Graphics buffer(&bmp);//Gaphics对象引用内存画布
buffer.Clear(Color::White);//清除内存画布并以白色填充
//上面这段代码是利用双缓冲显示图像,防闪烁
KillTimer(1);
if(m_nSrcCrouchImageX>448)
{
m_nSrcCrouchImageX=448;
}
buffer.DrawImage(m_pBitmap ,m_nPlayerX, 150, m_nSrcCrouchImageX, 0, 64, 64, UnitPixel);
gra.DrawImage(&bmp, 0, 0);
m_nSrcCrouchImageX+=64;
我想问一下这个问题怎么解决?
2、就是我的人物要在一张背景图上移动,因为每次显示人物的动画,就要重绘窗口,背景图也会被擦掉。然后我就在上面这段代码KillTimer(1);前加了显示背景图片的代码。
buffer.DrawImage(m_pBg ,0,0);
gra.DrawImage(&bmp, 0, 0);
这样背景就不会被擦掉了,因为每次显示人物动画,这个背景也要被重绘。
但是发现,这样的话,人物就有闪烁。
这样的话,显示背景的代码应该放哪?
3、横版游戏的话,有些地形并不是平地,有斜坡什么的。
那一般要怎么实现人物在斜坡上走动?
网上查到好像可以用检测边缘的方法,但是不知道GDI+或者是CxImage中有没有检测边缘的函数。
或者各位前辈有更好的方法也可以说一下。
------解决方案--------------------
1、不要用OnKeyDown函数来检测按键。
在循环里用GetKeyState()来检测。
如果按键被按下,GetKeyState()<0;
2、用多线程来做,查资料学线程先吧。
3、百度查一下soble算子,顺便推荐一本书《Visual C++ 数字图像处理开发入门与编程实践》