今日は、ダンジョンや町の扉を開け閉めする処理を考えていました。処理自体は前につくっていたものを見返しながら実装しました。今回は主によく使われそうな5つのイベントについての考えかたを紹介しています。初心者の私が独自で考えていたものなので、もっと良いやり方はあると思いますが、参考になる部分があれば幸いです。
Playerが扉の前でボタンを押すと開く
BOOL型の変数をを一つ準備。Playerが扉の前でボタンを押したら下記のような扉を移動させるメソッドを呼び出してあげる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
if (!isOpened) { //扉の動く先の場所 CGPoint pos = [self movePosition]; //CCMoveを使って、現在の場所から移動させてあげる。selfPositionは扉の場所 CCAction *action = [CCMoveTo actionWithDuration:0.4f position:ccpAdd(selfPosition,pos)]; [self runAction:action]; //これをYESにして、ボタンをもう一度押しても扉が動かないようにしている。 isOpened = YES; } |
具体的にはこのような処理になります。(動画)
Playerがボタンを押すと扉が開く
1、扉とスイッチのクラスを準備して、Tiledのマップ内に配置する。2、スイッチには、どの扉を開けるかをTiledのオブジェクトレイアーに記載しておく。

3、スイッチにPlayerが触れたときに、扉を開けるメソッドを呼び出してあげる。
例えばこのような感じの処理になります。
1 2 3 4 5 6 7 8 9 |
//スイッチのRectとプレイヤーのpositionが重なった時の処理 if (CGRectContainsPoint([self getRect], [self getPlayer].position)) { //扉を開けるメソッドを呼び出す。 [Gate openGate:openGateNmae]; } |
具体的にはこのような処理になります。(動画)
Playerがマップの敵を全て倒すと扉が開く
TileMap上に敵がいないかを調べ、いなかったら、扉を開けるメソッドを呼び出してあげる。オブジェクトは全てTileMap上に存在しているのでfor文を使って一つ一つ調べてやります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//tileMapは今表示しているCCTMXTiledMapクラス,Objectは全てのキャラクタやアイテムなどの基本となっているクラスです。 for (Object *character in tileMap.children){ //マップ上にEnemyクラスのオブジェクトがある場合は処理を終了。 if ([character isKindOf:@"Enemy"]) { break; } //上記のEnemyクラスがなかった場合、Gateクラスのgate1の名前のついた扉が開くメソッドを呼び出している。 if ([character isKindOf:@"Gate"]) { [(Gate*)character openGate:@"gate1"]; } } |
具体的にはこのような処理になります。(動画)
スイッチを押しているあいだ扉が開く処理
これはupdateメソッドの中で、スイッチを押しているときにだけ扉を開くメソッドを呼び出したらよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-(void)update:(ccTime)delta{ //isOpenedはスイッチを押している時だけYESになっています。 if (isOpened) { CGPoint point = [self moveLatticePoint]; CCAction *action = [CCMoveTo actionWithDuration:0.2f position:ccpAdd(selfPosition,point)]; [self runAction:action]; } } |
これに関してはPlayerだけでなく何か別のオブジェクトをのせても同じような反応になるようにします。
具体的にはこのような処理になります。(動画)
Playerがカギをを持っていたら扉が開く
これは処理は今までと同じ。条件文でカギを持っているかどうかを判断して、扉を開ける処理をするようにしてあげるとよさそう。
1 2 3 4 5 6 7 |
//例えば、0以上なら if (keyNumber > 0) { //この中に扉を開けるメソッドと //カギの数を減らすメソッドなりを書いてあげるいい。 } |
具体的にはこのような処理になります。(動画)
最後に
他にも色々な処理を考えています。(まだ実装ができていません)ただ本当にその処理が必要かどうかの全体のストーリーが何もできていないので、まずはそっちからしたほうがいいのかと考えていますが、とりあえず今の力で何ができるかを今月は色々試しています。
それにしてもキャラクターのクオリティが低いのがとても気になるが、できる範囲で綺麗にしていかないと。(続く)
