基于MFC对话框 想做一款2D横版游戏,类似GBA恶魔城,想问一些有关问题

基于MFC对话框 想做一款2D横版游戏,类似GBA恶魔城,想问一些问题
本人新手。但是想尝试一下做个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++ 数字图像处理开发入门与编程实践》