2017-03-20 15 views
0

私はCocos2d-x v3の新機能を使用しています。最近、私が作成したアニメーションでSpriteを動かすために、リスナーキープレス機能を使用しようとしていました。すべてのコードエラーなしでコンパイルしますが、スイッチのケースで指定されたキーを押してもゲームが実行されると、ウィンドウは一時停止し、action.hヘッダーファイルが表示され、クラスの "void setTarget"メソッドが強調表示されます。それはエラーがnullptrだったと言っています "おそらく私はどこかで変数を初期化するのを忘れましたか?Cocos2dでstored stored animationを使用するには?

私のヘッダーはそうのようになります。

#ifndef __HELLOWORLD_SCENE_H__ 
    #define __HELLOWORLD_SCENE_H__ 

    #include "cocos2d.h" 
    using namespace cocos2d; 

    class HelloWorld : public cocos2d::Layer 
    { 
private: 
    Sprite* sarah; 
    Animate* walking; 
    Action* action; 

    public: 

    static cocos2d::Scene* createScene(); 


virtual bool init(); 
void menuCloseCallback(cocos2d::Ref* pSender); 

CREATE_FUNC(HelloWorld); 

    void onKeyPressed(EventKeyboard::KeyCode keyCode, Event *eventer); 
void onKeyReleased(EventKeyboard::KeyCode keyCode, Event *eventer); 
    Sprite* GetSprite(); 
    Animate* GetAnimation(); 

}

#endif // __HELLOWORLD_SCENE_H__ 

、私に問題を引き起こしている私のcppの中の部分がそうのようになります。

void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode, Event * event){ 

    auto action1 = event->getCurrentTarget()->getActionByTag(1); 
    auto node = event->getCurrentTarget(); 

    switch (keyCode){ 
    case EventKeyboard::KeyCode::KEY_LEFT_ARROW: 
    action1->setTarget(node); 
    node->runAction(action1); 

    default: 
    break; 
} 

}

void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode,Event *event) { 
     auto action1 = event->getCurrentTarget()->getActionByTag(1); 
     auto node = event->getCurrentTarget(); 
    Vec2 loc = event->getCurrentTarget()->getPosition(); 

switch (keyCode){ 
     case EventKeyboard::KeyCode::KEY_UP_ARROW: 
    action1->getTarget()->stopActionByTag(1); 
    node->setPosition(--loc.x, --loc.y); 
default: 
    break; 
} 
私のスイッチケースで

}

sarah = Sprite::create("standing.png"); 
sarah->setAnchorPoint(Vec2(0, 0)); 
sarah->setPosition(100, 100); 



Vector<SpriteFrame*> walkingframeskleft; 
walkingframeskleft.reserve(3); 
walkingframeskleft.pushBack(SpriteFrame::create("walk2.png", Rect(0, 0, 65, 81))); 
walkingframeskleft.pushBack(SpriteFrame::create("walk3.png", Rect(0, 0, 65, 81))); 
walkingframeskleft.pushBack(SpriteFrame::create("walk4.png", Rect(0, 0, 65, 81))); 

Animation* walkinganimation = Animation::createWithSpriteFrames(walkingframeskleft, .1f); 
walking = Animate::create(walkinganimation); 
action = RepeatForever::create(walking); 
action->setTag(1); 
this->addChild(sarah); 


auto listener = EventListenerKeyboard::create(); 
listener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed,this); 
listener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased,this); 
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, sarah); 


    return true; 

}

私は、左矢印キーが私の知る限りとして

+0

私は正しいことを指しているCC_CallBack_2で私が使った "これ"の考えがちょっと考えられましたか? – Cosmik11

答えて

0

を開始するために働くだろう場合、私はちょうどテストしたかったので、設定していますあなたのエラーは、実行しようとする瞬間にあなたのアクションがnullであるという事実によって引き起こされます。ある

があるため:あなたはこの行を使用してアクションを作成した後 :

action = RepeatForever::create(walking); 

アクションは、自動解放プールに追加されます。したがって、すぐに使用しないでください(スプライトで実行してください)。action-> release();それが削除されます。したがって、コードで後で使用する(または再利用する)アクションを作成する場合は、作成後に手動で保持し、再度使用しないことを確認したら解放してください。

action = RepeatForever::create(walking); 
action->retain(); 

このようにして、release()を自分で呼び出すまで、アクションは解放されません(削除されます)。

関連する問題