2013年07月28日

敵の動作処理を少しずつ作成

また随分と日が空いてしまいましたが例のごとく影で開発を進めていたりなんてことはまったくなく、ほとんど進んでいません。久しぶりにgithubのcommit履歴から。

7月13日、アリの動作処理実装(未テスト)。
同日、Test Targetの作成。
7月14日、ゲームデータのキャラクター間の相互参照を解消。
同日、Unit Testの環境設定。
同日、アリの動作処理。状態遷移を整理。
7月15日、アリの動作処理実装。当たり判定と画像表示位置にオフセットを設定する処理追加。

敵キャラの動きの部分を作り始めてみようと思い、まずは地面を歩くタイプの敵キャラのアリから実装を始めてみました。

アリの動作は次のような感じです。
  1. 画面右側から左方向へ移動
  2. 立ち止まって弾を発射
  3. 画面右方向へ移動
  4. 以降、弾発射と右方向への移動を繰り返し

あと、移動をするときは地面を歩くので次のようなルールに従うものとします。
  1. 地面の上、または天井の下に接したところを歩く(天井の下を歩くときは画像を上下反転)
  2. ブロック1/2個分の段差は乗り越えることができる
  3. 乗り越えられない段差にぶつかったらそこで移動を止める

もうちょっとプログラミングチックに書くとこんな感じ。(面倒なので地面の上を歩いている時に限定して書きます)
  1. キャラクターの左端の足元のブロックと右端の足元のブロックを検索する
  2. 左右どちらかのブロックがない場合は、ある方のブロックの上に移動する(例えば左側が穴が空いているときは右側のブロックの上に移動する
  3. 左右のブロックの高さが1/2個分を超えている場合、近い方のブロックの上に移動する
  4. 左右のブロックの高さが1/2個分以下の場合は横方向はそのままで縦方向は高い方に合わせて移動する(地面にめり込むのを防ぐため)

さらに、上での足元のブロックを検索すると一言で書いていますが実際には次のような条件を満たしているものを探す処理になります。(ここも面倒なので左端の足元の場合だけ書きます)
  1. キャラクターの左端の座標がブロックの左端の座標から右端の座標の間にある
  2. ブロックの下端の座標がキャラクターの上端の座標より下にある
  3. 上の条件を満たすブロックの内、上端の座標が一番上にある

で、思ったよりも結構複雑な感じになりました。普段ならば実際に敵キャラを配置して動かしてテストをするところですが、全部の条件をためしてみるのはめんどくさそうなので、直に数値を突っ込んでテストをすることに。どうせならUnitTestとかいうのを試してみようと思って挑戦してみました。

あれこれと苦労したことを書き留めておけば何かの役に立つかと思ったのですが、すでに全部書いてありました。

cocos2dでSenTestingKitをつかったUnitTestを行う場合の注意点とか

7月27日、チョウの動作実装。

なんか無駄に長くなってめんどくさくなってきたので、この辺からは適当に。

チョウは上下に移動しながら左へ移動。あと定期的に3-way弾を左方向に発射。

7月27日、テントウムシの動作実装。

テントウムシは普通にまっすぐと左に移動しながら自機を狙う1-way弾を発射。

7月27日、ミノムシの動作処理実装。

ミノムシは移動せずに全方位に弾を発射。ただ、移動しないとは言いながら画面のスクロールに合わせて左に動いているので、普通に弾を全方位に撃つと左方向の弾が詰まって右方向の弾が詰まったように出てしまいました。

普通の弾は背景のスクロールとは無関係に移動させているのですが、ミノムシの撃つ弾は弾のスピード+スクロールのスピードで移動するようにしました。


なんか最近だれ気味ですが、ちょっと気合を入れなおして来週からはまた週一更新をするようにしたいです。
ラベル:とりとま
posted by かねだ at 22:32| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2013年07月07日

久しぶりにプログラミング、タイルマップに対応

この前まで敵キャラの画像を作ってばかりいたので随分久しぶりにプログラミングをしたのような気がします。

今週はTiledというフリーソフトを使って作成したタイルマップから敵とか障害物の位置を読み取ってステージ上に配置する処理を作成しました。

スクリーンショット 2013-07-07 18.10.06.png

Tiledを使えば1枚の画像を細かいタイルに分割して配置したタイルマップを作成することができます。

※参考サイト:Cocos2D 2.Xでタイルベースゲームの作成チュートリアル

タイルマップをcocos2dで読み込むと1個のノードとして扱われるので、そのまま1枚の画像として表示することもできます。が、敵キャラなんかをそのまま画像として表示してもしょうがないのでマップ上の敵キャラ画像は非表示にしておいて代わりに敵キャラクラスを作っていおいてタイルの位置にそのインスタンスを作成することになります。

障害物に関しては敵キャラと違って動くわけではないので1枚画像として表示していればいいのですが、当たり判定の処理とかを敵キャラの場合と同じにしたかったので、敵キャラと同じように障害物クラスを作成しました。なんとなく、これは普通のやり方と違うような気もしています。

障害物をキャラクターとして扱えば当たり判定自体は一本化できるので楽ができるのですが、一個だけ問題点として地面のタイルの切れ目に隙間がちらつくというバグが発生してしまいました。

原因は簡単に言うとfloatの演算誤差によって隣のタイルと1ドットずれて隙間ができることがあるというものでした。

例えば32x32ドットのサイズの地面のタイルを幅384ドットの画面に敷き詰める場合、まず初期表示として(0,0),(32,0),(64,0),...,(384,0)の位置にタイルを配置します。その後、マップがスクロールして32ドット左に動いた時に新しい新しい地面を再び(384,0)の位置に配置することになります。

ただ、実際には毎秒60フレームで各処理を更新しているので、丁度32.0ドット移動した時というわけではなく、32.00123ドットみたいな数値のときに次のタイルを配置することになってりします。この場合、次のタイルの位置は(384.00123,0)になるのですが、このときに誤差が発生するということがありました。

座標の計算にはfloatを使用しています。実際には2進数で管理しているのですが、とりあえず説明を簡単にするために扱える有効桁数を10進で7桁とします。そうすると、32.00123は7桁なのでOKなのですが、384.00123は8桁なので下1桁が落とされて384.0012と0.00003の誤差が発生してしまいます。

通常この程度の誤差は無視できるし、実際0.00003ドットの位置に表示なんてできることはなく、四捨五入で切り捨てられるものです。ところが、タイルの座標が丁度四捨五入の境目付近に来た時に問題が発生します。例えば、あるタイルが(10.49998,0)の位置にあり、その隣のタイルが(42.50001,0)の位置にある場合、四捨五入の結果、それぞれ(10,0),(43,0)の位置に配置されることになり、タイル間の距離が33ドットになって隙間ができることになります。

しょうがないので、障害物はそれぞれ独立したキャラクターになっているはいるのですが、画像を表示する位置は自分が持っている座標の位置ではなく、タイルマップ全体の位置からの相対距離で決めるようにしました。こうすることで四捨五入で切り捨てか切り上げかの判定に使う変数を共通化できるのでズレを防ぐことができます。


なんか無駄に文章が長くなった上にわかりづらいですが今週はこんな感じでした。来週は敵キャラの動きの部分を実装していくつもりです。
ラベル:とりとま
posted by かねだ at 21:54| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2013年07月01日

久しぶりに更新、でもほとんど進んでない

2週間空けての更新になります。実は裏でこっそりと作業を進めていたりなんてことはまったくなく、ほとんど進んでいません。

とりあえず敵キャラ画像ラスト。

ハエ
Enemy_39_01.png
ラスボスにするつもりですがそんなに強そうに見えませんね。ラストはでかくて派手なのにしようかとも思ったのですが、私の画力ではかっこ良くできそうもないので、むしろ小さめにして弾を当たりにくくして難易度を上げてみる方向にしてみました。

画像も揃ってきたのでそろそろプログラムの方の制作。と思っていたのですが、その前に現在背景画像の配置をスクリプトで行なっていたものをタイルマップを使うように変更してみようとしています。

今はこんな感じのスクリプトファイルを作って、どこにどの背景とかを配置するかを決めています。数字は種別とか座標とかそんなんです。

enemy 1 400 200
block 2 16 16 1
block 2 32 0 1
back 4 0 200 0 0
block 2 32 0 1
……


これをTiledというフリーソフトを使ってこんな感じにGUIでペタペタ配置していくように方向転換。
スクリーンショット 2013-06-30 22.56.27.png

スクリプトをテコテコ作っていくのは苦労しそうだからタイルマップにしたいと思っていたんですが、障害物との当たり判定とか考えなおさないといけないのでちょっと二の足を踏んでいました。
今回床とか天井を這って歩くタイプの敵キャラを作るので、手戻り発生させないようにタイルマップへの移行を先にやっておくことにしました。

ちなみにこの辺のサイトを参考にしました。
http://www.raywenderlich.com/ja/40094/cocos2d-2-xでタイルベースゲームの作成チュートリアル

7月からはとくに仕事も忙しくないだろうから来週くらいから本格的に開発を進められたらと思っていたり。
ラベル:とりとま
posted by かねだ at 00:05| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。