一个 关于加速贪吃蛇 移动的问题??? 小弟 初学 vc,做了个贪吃蛇小游戏 但是有个问题我想在 在控制贪吃蛇移动是 可以让它向指定的防线移动比如说 按着 上健不放 就让蛇向上加速移动?请问该怎么实现 ?关键是怎么才能知道某个方向键是 一直按着不放的呢?我已经响应了 OnKeyDown()和OnkeyUp 但这两个的反应 都应该是 瞬时的呀?vc初学者 诚请高人指点 分数不多 见谅!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OnKeyDown的时候设置一个Timer,OnKeyUp的时候删掉这个Timer,因此当你获得Timer消息的时候,一定是处于键按下的状态。每当收到一个Timer的时候就让蛇运动一下,想要加速的话就是每个Timer消息蛇的运动距离逐渐增大。 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())就不必处理了. 求解MFC中CFile的Write函数在程序的Relesae和Debug版本有区别吗? 特征点检测 mfc中的gridview怎么实现 C如何调用静态链接库 窗口使用了窗口边界这句话怎么理解? 一个字符串的问题 如何通过点击自己建立的一个模态对话框上的按钮,来设定窗口的颜色,比如红色? 如何在子对话框的按钮函数中执行父对话框的菜单命令? 在CListCtrl中如何将LVS_EX_CHECKBOXES系统指定的风格换成自己的图标。多谢! 如何让一个对话框可以获得另一个对话框中某个控件所包含的信息? chm或pdf定位问题 如何截取字符串,并存到数组中!!!
贪吃蛇的坐标肯定是要的:
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())就不必处理了.