Scene受け渡し時の画面サイズの初期化

キャラクターが空を飛んでいるのを表現するのに iPhoneの画面を超えて縦横無尽に飛び回る状況を作り出したい為に上方に上限を設けぬ実装を鑑み Spritekitに於ける座標系を考察したのが以下列挙する本ブログの両記事です。

処が此処に問題の内在が発覚しました。 時折デバッグの為に変数を出力して検討するのは誰もが実行する処でしょう。 2017年5月5日記事 SpriteKitに於ける時間軸に基づく背景グラデーションの独自実装 に記したようにゲームに於いてキャラクターが上空に飛翔すればするほど 宇宙空間に近いた表現で空色を濃く染め上げるのに背景色を変化させたのですが 此の時必要なのはキャラクターの縦軸の位置変数であるのは言う迄もありません。 其の変数とした honmaruPosYRatio の算出法は以下コードとなります。

スポンサーリンク
日付:2014年4月14日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:うさ犬が行く
float honmaruPosYRatio = flyingHonmaru.position.y / self.frame.size.height;
iPhoneアプリ「うさ犬が行く」アイテム取得画面
iPhoneアプリ「うさ犬が行く」アイテム取得画面

flyingHonmaru なるキャラクターオブジェクトの位置属性のY軸数値を キャラクターの存在するゲーム空間の高さで割る道理となります。 目論見では此のゲーム空間の高さ self.frame.size.height は無限に広がる高さ空間の筈でした。 処が何処で此の変数を出力しても其の値は 568 としか表示されないのでした。 此れは無論iPhoneの一部機種の所与の縦解像度以外の何者でもありません。 従って思った通りの効果が得られず背景色は予想外の速さで暗黒を示し 内在する問題が発覚したのでした。

其処で案出したのがゲーム初期に無限と迄は行かずとも 充分に大きな値の高さ空間を与えることにて其の浮動小数点定数 spaceHeight を以下の如く設定しました。

float spaceHeight = 10000.0f;

するとキャラクターの高さ位置変数の算出法は以下に示され 此の割合を以て空色を染め上げれば宜しい勘定となります。

float honmaruPosYRatio = flyingHonmaru.position.y / spaceHeight;

2016年7月9日の記事 に於ける実装では受け渡すSceneを ViewController で以下の如く実装しました。 Sceneを縦に大きく取ってキャラクターが何処迄も天高く舞い上がれる余裕を取る計算です。

- (void)viewDidLoad {   [super viewDidLoad];   SKScene *scene = [UIGMyScene sceneWithSize:CGSizeMake(500, 10000)];

しかしシミュレータ等で確認するにどうやら縦に10000ほどと広く数字を取っても無駄な様で 内部では如何なる状態なのかSceneを受け渡された側に於いて以下のコードで コンソール出力し検討してみます。

-(id)initWithSize:(CGSize)size {     if (self = [super initWithSize:size]) {     NSLog(@"SELF SIZE Width, Height:%f, %f", self.size.width, self.size.height);     NSLog(@"SELF VIEW BOUNDS SIZE Width, Height:%f, %f", self.view.bounds.size.width, self.view.bounds.size.height);

ログ出力を見ると {500, 10000} になっているものの何も処理をしていません。 更に -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event メソッドに於いてログを見ると既に {320, 568} になってしまっており、どうやら強制的に変換されている様な状態が窺えます。

NSLog(@"Honmaru PositionX:%f, PositionY:%f", flyingHonmaru.position.x, flyingHonmaru.position.y);

何故問題を内在したまま捨て置いてかと言えば上記コードで得られるコンソール出力が 以下の如く568以上で出力されている様な状況にて此れが勘違いを招いたのでした。

2014-04-14 15:58:03.205 USAINU GOES[1141:60b]  Honmaru PositionX:0.000000, PositionY:1333.439819 2014-04-14 15:58:03.206 USAINU GOES[1141:60b]  Anchor Point:0.500000,-1.854966 2014-04-14 15:58:03.207 USAINU GOES[1141:60b]  Frame Origin:-160.000000,1053.620605 2014-04-14 15:58:04.953 USAINU GOES[1141:60b]  Honmaru PositionX:0.000000, PositionY:1305.206421 2014-04-14 15:58:04.954 USAINU GOES[1141:60b]  Anchor Point:0.500000,-1.800092 2014-04-14 15:58:04.955 USAINU GOES[1141:60b]  Frame Origin:-160.000000,1022.452393

しかし此のコンソール出力を良く良く見れば Frame Origin、即ち原点からは丁度568の半分ほどしか離れていませんし Anchor PointのY座標がマイナスであるにしろ1、即ち100%を超えてしまっていることから誤りを判断出来た次第。

原因の発生箇所が判明すれば対処法も案出出来ようと言うもの、 ゲーム画面足るSceneの初期化を 2016年7月9日の記事2016年7月11日の記事 に於ける座標系で見た処の FrameやBoundsを用いるためデバイスサイズに限定されるであろうものから デバイスサイズを超えるのが確かな任意の値で初期化してやります。

/* 修正前 */ SKScene * scene = [UIGMyScene sceneWithSize:skView.bounds.size]; /* 修正後 */ SKScene *scene = [UIGMyScene sceneWithSize:CGSizeMake(500, 10000)];

上記の如く修正すれば以て目論見通りの動きを示したものです。

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 に対応。