如何在Cocos2d中使用执行存储的动画?

时间:2017-03-20 02:10:22

标签: c++ animation cocos2d-iphone cocos2d-x cocos2d-x-3.0

我对Cocos2d-x v3相当新,最近我试图使用监听器按键功能,以便让我的Sprite随着我为它创建的动画一起移动。所有代码编译时没有错误,但是当游戏运行时,如果我按下开关盒中的指定键,则窗口暂停,它将我带到action.h头文件并突出显示" void setTarget"它声明错误的类的方法" 这个是一个nullptr"也许我忘了在某个地方初始化一个变量?

我的标题如下:

    #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;

}

在我的交换机案例中我只设置了左箭头,因为我只是想测试一个键是否可以用

开头

1 个答案:

答案 0 :(得分:0)

据我所知,您的错误是由于您尝试运行时的操作为空而引起的。

那是因为: 使用以下行创建操作后:

action = RepeatForever::create(walking);

该操作会添加到自动释放池中。所以,如果你不立即使用它(在sprite上运行)action-&gt; release();将被调用它将删除它。因此,当您创建要在代码中稍后使用(或重复使用)的操作时,请确保在创建后手动保留它们,并在您确定不再使用它们时将其释放:

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

这样,在您自己调用release()之前,您的操作不会被释放(删除)。