我一直在尝试在cocosd 2x-x中编写/开发一个函数,当一个键被按下时,它会执行一个指定的动作 (在我的例子中是移动玩家精灵);由于Cocos2d-x没有特定的选项(只有OnKeyPressed和OnKeyReleased)。
我试图通过利用Coco 2d的SchedueledUpdate()来解决这个问题,它使用增量时间更新每一帧。
在Level1Scene.h中定义函数后:第一个月
我在Level1Scene.cpp中调用它,并尝试将其与名为 Knight 的玩家精灵关联:
void Level1::UpdateMove(float dt) {
if (::DirX == -1) {
Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(-10, 0);
}
if (::DirX == -1) {
Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(+10, 0);
}
if (::DirY == -1) {
Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(0, -10);
}
if (::DirY == 1) {
Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(0, +10);
}
}
如你所见,DirX和DirY都是全局int变量,它们的值被调用,然后指示游戏GetInstance-〉GetRunningScene()-〉GetChildByName(“Knight”),这个玩家精灵的位置会根据**bool Level 1::init()**中不同函数的按钮输入设置而减少或增加。
auto eventListener = EventListenerKeyboard::create();
eventListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event) {
switch (keyCode) {
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
::DirX = -1;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
::DirX = 1;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
::DirY = -1;
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
::DirY = +1;
break;
}
};
this->scheduleUpdate();
为什么不管用?
1条答案
按热度按时间wribegjk1#
在做了大量的A/B测试后,我发现主要问题来自更新功能不识别我所指的sprite。在做了一些挖掘后,我也解开了我的主要问题在于:
第一个月
这个函数显然有缺陷,并且不获取当前场景沿着指定的子对象(* 尽管使用了-〉setName(“Knight”)*。
为了解决这个问题,我在函数外部声明了三个全局变量:
之后,我在 init 函数中调用了全局knight变量:
以及键盘侦听器事件中的DirX和DirY:
请注意,我使用了带有计数器值的onKeyPressed和onKeyReleased来修复任何与移动相关的问题。
最后,在update函数中,我运行一个常量检查,以检查每帧更新玩家位置的值。
void级别1::更新(浮点日期){
}