スイッチを切り替えると、床がせり出して自機(Player)が進めなくなるような仕掛けを作ります。床は2種類あり、それが交互にせり上がるようにします。
難しかった点
1,スイッチと床
初めはスイッチと床ともに通常のオブジェクトととしてタイルマップに設置してやろうとしたのですが、その場合だと床の配置がとてもメンドクサイのでタイルレイアーとして配置することにしました。

2、衝突判定
床がせりあがった時だけ衝突判定を行うために、先ほど見ていただいたように、タイルレイアーを分けています。
このタイルレイアーを使い床の上がり下がりを表現します。
具体的にはvisibleのYESとNOを切り替えます。
「衝突判定」は、このタイルレイアーが表示(visible=YES)されている時だけ有効になるようにコードを書いてあげるとうまくいきます。
3、ブーメランの判定
ブーメランがスイッチに当たった場合でも床の切り替えができるのですが、せり上がった床だけは「衝突判定」をしない方法を考えていました。元々、全ての衝突判定を一つのメソッドで行っていたのでブーメランだけで「衝突判定」を変えることが難しいと感じたので、ブーメラン用のメソッドを新たに作成しました。
ただ、コードが複雑にならないようにできるだけ、同じメソッドを使い回したいです。
4,床と自機が重なって動けなくなった時
床がせりあがった時に、そこに自機(Player)がいると動けなくなります。そのままだとバクになってしまいます。
ですので、一定の時間動けない状態が続いた際に下記のようなコードを呼び出して自機を移動させます。
1 2 3 4 5 6 7 8 |
CGSize winSize =[CCDirector sharedDirector].winSize; CGPoint point = ccp(winSize.width/2,winSize.height/2); //タイルマップの中心に向かうようにするためする CGPoint v = ccpNormalize(ccpSub(self.position, point)); CGPoint p = ccpMult(v, 30.0f); [self runAction:[CCMoveBy actionWithDuration:0.2f position:p]]; |
デモ動画

photo by:
muenzer