小弟 初学 vc,做了个贪吃蛇小游戏 但是有个问题我想在 在控制贪吃蛇移动是 可以让它向指定的防线移动比如说 按着 上健不放 就让蛇向上加速移动?请问该怎么实现 ?关键是怎么才能知道某个方向键是 一直按着不放的呢?我已经响应了 OnKeyDown()和OnkeyUp 但这两个的反应 都应该是 瞬时的呀?vc初学者 诚请高人指点 分数不多 见谅!!!

解决方案 »

  1.   

    OnKeyDown的时候设置一个Timer,OnKeyUp的时候删掉这个Timer,因此当你获得Timer消息的时候,一定是处于键按下的状态。每当收到一个Timer的时候就让蛇运动一下,想要加速的话就是每个Timer消息蛇的运动距离逐渐增大。
      

  2.   

    lz不妨这样设计:
    贪吃蛇的坐标肯定是要的:
    POINT position[MAX_POINT];  // MAX_POINT定义为贪吃蛇的最大长度,也就是贪吃蛇最多有几个点组成,如果某点不存在,则设置其x域为-1贪吃蛇是不停的移动的,只是移动的方向根据案件有所改变,不如就设置一个POINT变量,作为移动方向.
    POINT direction; // x,y域只能为1, 0, -1,表明移动的方向
    比如 direction.x = 1; direction.y = 0;表明向右移动有了移动方向后,根据lz的要求还需要速度.
    ULONG speed;有了方向跟速度,不妨再添加个步长吧?
    POINT step;   
    那么步长step.x = direction.x * speed;
           step.y = direction.y * speed;至于时间更新一直设置为固定数值,0.1秒够长?具体自己设计吧.
    SetTimer(..., ..., 100ms, TimerProc);  // 请msdn...#define POSITION_PRESENT(pt) (pt.x != -1) // 如果x域为-1,则表示该点不存在.VOID __stdcall TimerProc(...)
    {
        int i;    // timer中只需这两行代码就改变了当前坐标
        for(i = 0;
            i < MAX_POINT && POSITION_PRESENT(position[i]);
            i++)
        {
            position[i].x += step.x;
            position[i].y += step.y;
        }    // 剩余的就是GDI画图了,就是画几个方框,自己设计
        // DrawYourGameMap(...., position, ....);
    }// 至于加速度的问题
    当键盘按下的时候产生WM_KEYDOWN(由OnKeyDown()处理),如果一直按下,则不停产生WM_KEYDOWN,直至键盘释放产生WM_KEYUP(由OnkeyUp处理).
    所以你只需在WM_KEYDOWN(OnKeyDown()函数)中根据键盘状况进行处理:如果是长时间按下,则改变速度,并且更新方向(如果方向改变);如果只是按下一次,那么只需改变方向(如果方向改变).#define ACCMULATE   1 // 加速度,自己定义
    VOID OnKeyDown(..., LPARAM lParam)
    {
        if(lParam & (1 << 30))  // 可以在MSDN中输入WM_KEYDOWN搜索,结果便会知道lParam的第30位
                                    // 标明键盘先前状况.
                                // msdn:30 Specifies the previous key state. The value
                                // is 1 if the key is down before the message is sent,
                                // or it is zero if the key is up. 
        {
            // 先前是按下的,表明是长时间按下,那么需要改变速度
             speed.x += ACCMULATE;
            speed.y += ACCMULATE;
            // 更新步长
             step.x = direction.x * speed;
            step.y = direction.y * speed;
        }
        
        // 接着更新方向
         // ... 根据键值来设定direction.x跟direction.y
    }至于WM_KEYUP(OnKeyUp())就不必处理了.