Xcode開発に於けるfloat型やdouble型の値の余剰

ゲームの代表的存在でもある任天堂社のスーパーマリオブラザーズを始めとして、 特にレトロな2D横スクロールアクションゲームでは無限スクロールは必須の機能です。 本ブログにも横スクロールの実装について記事を幾つか配信しもしました。

2DゲームフレームワークSpriteKit

ゲームうさ犬が行く開発中画面
ゲームうさ犬が行く開発中画面

XcodeでiPhoneアプリでも2Dゲームを開発するに当たって 有用なのがアップル社謹製フレームワーク SpriteKit です。 このフレームワークには様々なゲーム実装に関する機能が搭載されていますが、 座標もその一つです。 SpriteKitの座標に関してはUIViewと座標系が異なるため、 困惑する場合も多いのですが2D画面を構成するには欠かせません。

問題惹起

手元の開発iPhoneゲームで いつものようにSpriteKitの提供する座標系 SKView を用いている途中、気付いた点がありました。

スポンサーリンク
日付:2014年4月27日
開発機: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 は弧度法の πパイ を示し、此れに1/2を掛ければ弧度法で直角を表します。 回転数を求めたいオブジェクトをpUnitとすれば 此のオブジェクトの現在の回転角度プロパティ zRotation を直角で割ってやれば良く、 最終的に此れに於いて4の剰余を求めれば周回から直角で幾つ分余計に回っているかが分かる勘定です。 処が上記したようなプログラミング言語特有の規則から、 都度、型をキャストしています。 特にSwiftは型に厳しいとされているので都度のキャストは必須の処理となります。 此処ではfmod関数を使用していませんが、 求める値に自然数を想定するならば、 取り敢えずは此の方法でも何とか使えるようです。

Going USAINU(邦題: うさ犬が行く)
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 3.21
リリース: 2015年9月14日
更新: 2022年3月7日
サイズ : 19.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。