cocos2D-x游戏制作,添加了键盘响应之后在移动精灵的时候为什么它会加速?
现在正在学习cocos2d-x,之前加入了hookwindows键盘消息的代码,实现了键盘左右控制精灵移动,但是在移动精灵的过程中它会出现加速的情况。我的想法是想让他执行...
现在正在学习cocos2d-x,之前加入了hook windows键盘消息的代码,实现了键盘左右控制精灵移动,但是在移动精灵的过程中它会出现加速的情况。我的想法是想让他执行完自己的一次位移再开始下一次,不知道是不是因为一直按着键盘左或者右键之后会一直接收windows的WM_keydown消息导致的。。。
之后我在绘制精灵的Layer中添加了bool is_moving,想借此来控制,但是还是没有达到效果。
if(message==WM_KEYDOWN){
if(is_moving)//这货初始化为false
return;
is_moving = true;
switch (wParam){
case VK_LEFT:
//runaction
break;
case VK_RIGHT:
//runaction
break;
}
is_moving = false;//想要在完成动作之后置为false
}
总之就是想要在按住按键移动精灵的时候保持匀速。
之前接触windowsAPI的时候,也写过一个小迷宫游戏,但是也是在移动人物的时候人物慢慢加速,跪求这是什么原因啊。。。还有解决办法。。。
这个是响应键盘消息之后运动的代码,右键的差不多就不贴出来了:
void MatchStickLayer::onWin32KeyEvent(UINT message, WPARAM wParam, LPARAM lParam){
if(message==WM_KEYDOWN){
switch (wParam){
case VK_LEFT:{
if(m_Cposition.x-30<0)
break;
m_Cposition.x-=30;//这部分是判断是否超过墙壁
CCAction *action = CCMoveBy::create(0.5f,ccp(-30,0));
Matchstickman->runAction(action);
break;}
。。。。。。。。 展开
之后我在绘制精灵的Layer中添加了bool is_moving,想借此来控制,但是还是没有达到效果。
if(message==WM_KEYDOWN){
if(is_moving)//这货初始化为false
return;
is_moving = true;
switch (wParam){
case VK_LEFT:
//runaction
break;
case VK_RIGHT:
//runaction
break;
}
is_moving = false;//想要在完成动作之后置为false
}
总之就是想要在按住按键移动精灵的时候保持匀速。
之前接触windowsAPI的时候,也写过一个小迷宫游戏,但是也是在移动人物的时候人物慢慢加速,跪求这是什么原因啊。。。还有解决办法。。。
这个是响应键盘消息之后运动的代码,右键的差不多就不贴出来了:
void MatchStickLayer::onWin32KeyEvent(UINT message, WPARAM wParam, LPARAM lParam){
if(message==WM_KEYDOWN){
switch (wParam){
case VK_LEFT:{
if(m_Cposition.x-30<0)
break;
m_Cposition.x-=30;//这部分是判断是否超过墙壁
CCAction *action = CCMoveBy::create(0.5f,ccp(-30,0));
Matchstickman->runAction(action);
break;}
。。。。。。。。 展开
2个回答
展开全部
代码太少了,没有运动相关的看不出来什么问题。不过可以提醒你,runaction的运动是会叠加的,如果你在物体移动未结束的过程中又再次进行点击那么可能出现你说的这种情况。解决方法是,用stopactionbytag把之前的移动停止掉再重新设置移动。
追问
我把运动部分的代码补充进问题了,然后我就是想知道这是为什么会产生叠加?是因为我一直按住按键,然后windows重复处理WM_KEYDOWN消息了吗?然后用stopactionbytag解决我有点不明白,重新设置移动?
追答
你这段代码可以的因为你用!is_moving 做了移动判断,所以应该不用担心移动叠加的问题。但如果不加这句的话移动效果就会因为连续点击而叠加解决方法就是加一句把之前的移动清除,然后再开始新的移动。
你把这句加进来就可以啦.
Matchstickman->stopAllActions();
展开全部
void MatchStickLayer::onWin32KeyEvent(UINT message, WPARAM wParam, LPARAM lParam)
{
...
if(!is_moving){
CCAction *action = CCMoveBy::create(0.5f,ccp(-30,0));
CCCallFunc *a2=CCCallFunc::create(this,callfunc_selector(MatchStickLayer::movefinish));
CCSequence * s=CCSequence::create(action,a2,NULL);
Matchstickman->runAction(s);
is_moving=true;
}
...
}
void MatchStickLayer::movefinish(){
is_moving=false;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询