5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

cocos2d-xのバグを直したらmergeされた話

cocos2d-xで割と大規模なゲーム開発をしております。


チームでRPGなどを開発していると、

Bルート3面最終面に出てくるナイトが10%の確率で2ターン溜め攻撃するんだけど、
溜め攻撃の最中の1ターン分だけナイトを点滅させるようにしてくれない?

などとピンポイントなオーダーがディレクターから飛んできます。


プログラマはこういう事態を予期しておき、敵キャラの技のスクリプトは全てLuaで記述できるようにしておきます。

このようなスペシフィックな注文が来たときに、待ってました!と言わんばかりにわしわしと技のスクリプトに処理を書き込むわけです

local actions = CCArray:create() -- 空の配列作って
actions:addObject(CCFadeTo:create(0.05, 128)) -- 0.05秒で透明度128に
actions:addObject(CCFadeTo:create(0.05, 255)) -- 0.05秒で透明度255に
local sequence = CCSequence:create(actions) -- それらをアクションにして
user:runAction(CCRepeat:create(sequence, 10)) -- それを10回繰り返す動きを適応


点滅をはじめとして、ちょっとした表現のクォリティアップをいとも簡単に行えてしまうのがcocos2dの良いところですよね!


満を持して実行してみると、エラーを吐く。なんだこれは!何も間違ってないぞ!
バージョンは2.0.3

...9C-411D-A8EC-E8454ECC9071/YourFantasticGame.app/charge_attack.lua:5: error in function 'create'.
argument #2 is 'CCFiniteTimeAction'; 'CCActionInterval' expected.

エラーの原因

悩むこと数分、cocos2d-xのLua-Binding自体が怪しい、という結論にいたり、内部のコードを読み始めるわけです。


cocos2d-xのドキュメントと見比べてみると、Lua-BindingでCCRepeatのcreateに渡している型がドキュメントと異なっている!

ドキュメントによると、繰り返すアクションをCCFiniteTimeActionとして受け取らないといけないのに、そのサブクラスであるCCActionIntervalとして受け取っている!

CCSequence#createはCCFiniteTimeActionを返す仕様になっているため、引数エラーが出てしまったというわけです。なるほど納得!

つまりこんな感じで直した

http://cdn-ak.f.st-hatena.com/images/fotolife/g/gigi-net/20130304/20130304195232_original.png

Pull Requestから始まるコミュニケーション

というわけで修正して、Pull Requestを送ってみたら

f:id:gigi-net:20130304193416p:plain
Fix CCRepeat#create is recieved bad argument on Lua binding. by giginet · Pull Request #2030 · cocos2d/cocos2d-x


マージされた!!!!

f:id:gigi-net:20130304193430p:plain
Fix CCRepeat#create is recieved bad argument on Lua binding. · 8f4340f · cocos2d/cocos2d-x

実写アイコンに颯爽と並ぶぎぎねっとアイコン


これで晴れてcocos2d-xコミッターです!やったね!

まとめ

というわけで、なかなかハマる人も少ない現象だとは思いますが、まとめてみました。

Forumとか見てるとScript-Binding周りはまだまだバギーみたいなので、報告すると喜ばれると思います。

初めて知り合い以外にまともなPull Request送ってみましたが、感謝されるとなかなか嬉しいですな。