2014年7月27日日曜日

ライフゲージを作ろう

ライフゲージやタイムゲージ(タイムバー)なんかは
cocos2dxではどう表現するんだろう。
『cocos2dx ライフゲージ』とかでググっても
ベストアンサー的なものが見つからず。
自分なりに考えてみたのでメモ。

ちなみに、以下のやり方は自分で適当に考えただけなので
他にもっと良いやり方があれば教えて下さい。

減っていく、あるいは増えていくゲージを表現するにはどうするか?

今回は時間の経過と共に減っていくタイムバーを製作するとして、
とりあえず、ゲージがマックス状態の画像を用意して、
その矩形を時間経過と共に
変形(トリミング)して行けば良いのではないか。

イメージ的にはこんな感じ。

cocos2dxでは画像をスプライトにして表示する場合は
Rectを使うので、それをマイナス1ずつ縮めていく関数を作って
schedule_selectorで毎秒呼び出し。
例えば、2分でゲージをゼロにするようにしたければ
ゲージの最大値の横幅÷120(秒)で1秒当たりの
ゲージの減り幅が算出できるので、計算敵には
(現在のゲージサイズ) - (ゲージの最大値の横幅/120)ということになる。

コード的にはこんな感じかしら。
(今回は画像もPlistから呼び出す仕様)

initでバー画像を表示させて
auto Stcache = SpriteFrameCache::sharedSpriteFrameCache();
Stcache->addSpriteFramesWithFile("States_all.plist");
auto stTime01 = Sprite::createWithSpriteFrameName("stTime_01");
stTime01->setTag(1);

CountDownでRectを縮めていく関数を作る
void HelloWorld::CountDown_Time(float dt)
{
Sprite* stTime01 = (Sprite *)this->getChildByTag(1);
float nowTime =
 stTime01->getContentSize().width 
                - (barsize - (barsize / 120));
//上記の変数 barsize はタイムゲージ(stTime01)の最大値を予め定義しておく
if (nowTime >= 0)
{
stTime01->setTextureRect(Rect(★, ★, nowTime, 90));
//Rect(★の部分にはテクスチャアトラスシート上でのライフゲージの開始位置X,Yが入る
}
}

sucedule_selectorで毎秒呼び出し。
//カウントダウンTimeを呼び出す
->schedule(schedule_selector(HelloWorld::CountDown_Time),1.0f);
※本当は毎秒呼び出しより0.1秒ベースで呼び出した方が
ゲージの減り方がなめらかなので、そこら辺は適当に調整。

今回はタイムバーなので時間経過で関数を呼び出しているけれど、
ライフゲージなどの場合は当たり判定でこの関数を呼び出せばOKというわけですな。

ついでにバーだけだとそっけないので上や下にフレームを追加して重ねる。


こんな感じで重ねれば素敵なバーのできあがり。
画像にはTimeじゃなくてLifeって入ってますな。
まぁ、そこらへんが気にせずに。


☆★というわけでcocos2d-xで制作しました★☆
☆★ライフゲージの見本がココにある!★☆

レッド・ザ・パニッシャー ―スタイリッシュレトロアクション―
カテゴリ: アクション
Google Playで詳細を見る

今なら(永久に)無料! 今すぐチェック!!

0 件のコメント:

コメントを投稿