2015-09-24 65 views
0

我有一個播放器類,有MoveUpMoveLeftMoveRight的功能。
MainScene.cpp(我唯一的場面至今),我有一個聽衆使用鍵盤聽衆的移動播放器

auto keyboardListener = EventListenerKeyboard::create(); 
keyboardListener->onKeyPressed = CC_CALLBACK_2(MainScene::keyPressed, this); 
keyboardListener->onKeyReleased = CC_CALLBACK_2(MainScene::keyReleased, this); 

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(keyboardListener, this); 

另外,我有一個指針player,通過

this->player = rootNode->getChildByName<Player*>("Player1"); 

還定義了,我有功能keyPressedkeyReleased in MainScene
keyPressed功能,我是調度功能與是否是:

if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_D) { schedule(schedule_selector(MainScene::MoveRight)); } 

但是有一個問題,當我試圖做同樣的事情與對象而不是精靈,並與位於分隔的類的功能,而不是內部的相同的文件。
如果我嘗試在MainScene::keyPressed運行這樣的代碼:

if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_W) { this->player->MoveLeft(5); } 

,只是每個按鍵(我希望它移動,直到我釋放鍵),如果我嘗試安排,或做一次player移動像這樣的東西,它不工作或有錯誤。

我試圖做一些與CallFuncCCCallFunc,但似乎沒有任何工作。
你能幫我嗎? :)

回答

0

爲什麼不在Player類中創建startMoving()和stopMoving()方法? 事情是這樣的:

void Player::init(){ 
    scheduleUpdate() 
} 

void Play::startMoving(){ 
    isMoving = true; 
} 

void Player::stopMoving(){ 
    isMoving = false; 
} 

void Player::update(float delta){ 
    if(isMoving){ 
     //move player here 
     sprite->setPositionX(sprite->getPositionX() + speed * delta); 
    } 
} 

,然後從的keyPressed /調用keyReleased給他們打電話?

+0

但是你的解決方案似乎不太理想,因爲更新函數將不得不檢查每個幀的每個關鍵幀。還有更多的寫作,因爲每個動作都需要一個布爾值 – Sagittario

+0

update()在每一幀都被調用,只是檢查布爾值不會真的增加幀渲染時間,除非你有數百萬個渲染時間(但GPU不會反正這麼多)。另外爲什麼要檢查每個密鑰?你只是聽聽鍵盤事件,當事情發生變化時,你正在更新「玩家」信息(正在移動,移動的方向和其他東西)。這就是我認爲應該完成的事情 - 玩家應該爲自己「照顧」自己,任何移動邏輯都應該放在自己身上。如果你有不同類型的對象要移動,你應該創建具有通用數據的類,其他人將擴展它。 – Makalele