【问题标题】:update sprite position with schedule function使用调度功能更新精灵位置
【发布时间】:2013-12-16 10:31:59
【问题描述】:

在我的游戏中,我有一个动画精灵。我在我的游戏中添加了 box2d 来增加重力。现在我想使用 schedule 函数更新我的精灵的位置。我让它与 Objective-C 一起工作,但我希望它是一个多平台游戏,所以现在我在 C++ 中尝试它。

在我的初始化中,我有以下行:

this->schedule(cocos2d::SEL_SCHEDULE(View::tick(1.0f)));

和方法打勾:

void View::tick(float dt) {
world->Step(dt, 10, 10);
for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
if(b->GetUserData() != NULL) {
}
}
}

我在 init 的行中收到以下错误:“无法从类型 'void' 转换为成员指针类型 'coco2d::sel_schedule' (aka void coco2d::CCobject::*)(float)

我现在不知道该怎么办。我试图用谷歌搜索,但每个人都使用objective - c 或schedule_selector(显然不再起作用)

提前致谢

【问题讨论】:

  • 在哪个类中定义 schedule 方法..

标签: c++ sprite cocos2d-x


【解决方案1】:

您可能不应该使用 schedule 函数来更新单个精灵。

在您的场景类中,覆盖 update(...) 的虚拟方法:

virtual void update(float dt)
{
    CCLOG("This was called.");
    // Do updates for everything in the scene you need to call on a tick.
}

另外,覆盖 onEnter() 和 onExitTransitionDidStart()。首先,调用 scheduleUpdate 来设置你的场景自动被调用。第二,调用 unscheduledUpdate(当场景退出时)停止更新。

void IntroScene::onEnter()
{
   CCScene::onEnter();
   scheduleUpdate();
}

void IntroScene::onExitTransitionDidStart()
{
   CCScene::onExitTransitionDidStart();
   unscheduleUpdate();
}

这样做可以让您明确控制在什么情况下要更新的内容……在更新周期中您只有一个函数被调用。

但是,如果你真的想这样做:

像这样声明您的自定义更新程序:

void IntroScene::myUpdate(float dt)
{
   CCLOG("Also called");
}

这样安排:

schedule(schedule_selector(IntroScene::myUpdate), 1.0f);

像这样取消计划:

unschedule(schedule_selector(IntroScene::myUpdate));

** 注意 ** 据我所知,您只能“调度”从 CCNode 派生的对象。

这有帮助吗?

【讨论】:

  • 我按照您的建议尝试了它并且它有效:)。不过,我不只是更新 1 个精灵。我想更新每个精灵。 Atm 只有我的角色是一个动态的身体,所以只有 1 个移动的精灵。
  • 很高兴我能帮上忙。你也可以看看这个:github.com/NonlinearIdeas/RotatedFixtureDemo
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多