ゲームの代表的存在でもある任天堂社のスーパーマリオブラザーズを始めとして、 特にレトロな2D横スクロールアクションゲームでは無限スクロールは必須の機能です。 本ブログにも横スクロールの実装について記事を幾つか配信しもしました。
2DゲームフレームワークSpriteKit
XcodeでiPhoneアプリでも2Dゲームを開発するに当たって 有用なのがアップル社謹製フレームワーク SpriteKit です。 このフレームワークには様々なゲーム実装に関する機能が搭載されていますが、 座標もその一つです。 SpriteKitの座標に関してはUIViewと座標系が異なるため、 困惑する場合も多いのですが2D画面を構成するには欠かせません。
問題惹起
手元の開発iPhoneゲームで いつものようにSpriteKitの提供する座標系 SKView を用いている途中、気付いた点がありました。
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:うさ犬が行く
問題が惹起したのは ゲーム背景のスクロールをSKviewの座標原点を移動させることで実現しようとして地面の無限スクロールを実装する際、 でした。 IF文の条件式にfloat値の剰余が0であるのを利用しようとした スクリプトからエラーが吐き出されたのです。 考えてみれば剰余には此方も整数を期待しますから、当然の気もします。
其処でネットを繰ると然るべき情報が見付かりましたが、 2014年当時のサイトは現在では閉じられていますので、 要点だけ記せば、 「float」や「double」などの浮動小数点型の値は「%」を使って余剰を求められない となります。 開発言語、 Objective-C でも剰余を表す算術演算子は % です。 ちなみに開発アプリ うさ犬が行く はApp Storeに並ぶ今こそSwiftでの実装ですが、 開発当初、Objective-Cでの実装でした。 余談ですが、未だ海の物とも山の物ともつかぬSwiftでの開発に主軸を移すのは 結構な冒険だったような記憶があります。
fmod関数の利用
解決策も其の情報ページには掲載されており、 浮動小数点型の値の余剰を求める場合は「fmod」関数などを使用する 、とありました。 fmod関数 はC言語に於ける浮動小数点数の剰余を求める関数です。 例えば使用例は以下記すようになります。
intResult = 10 <span class="pinkred">%</span> 3; // 結果は1
floatResult = fmod(10.3f, 3.0f); // 結果は1.3
此れを踏まえて うさ犬が行く の地面無限スクロールの実装は以下のようにしました。
if (fmod(UIGoriginX, 320) == 0) {
[self genGround:UIGoriginX];
NSLog(@"UIGorignX=%f", UIGoriginX);
}
順次増加する位置変数UIGoriginXがiPhone端末の横幅320を数えたら 新しく画面オブジェクトを生成する、と言う目論見のコードですが、 取り敢えずは此れで首尾良く運びました。
回転角の応用
さて、現在手元の環境では新しいゲームアプリを開発中ですが、 オブジェクトが現在何回転しているかを検知したい場面がありました。 度数法の90度角、即ち直角を何回重ねたか、 なる問いに答えて貰いたい訳です。 回転を扱うにはプログラミング言語では基本弧度法を用いますから、 浮動小数点数での計算は必須です。 因みに開発言語はSwiftです。 此れを求めるのには、以下のようにしました。
let rotateValue:CGFloat = CGFloat( Int( round( pUnit.zRotation / CGFloat( Float.pi * 0.5 ) ) ) % 4 )
Float.pi
は弧度法の
バージョン: 3.21
リリース: 2015年9月14日
更新: 2022年3月7日
サイズ : 19.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。