1

私は SpriteKit と Swift を初めて使用します (過去に iOS の Obj-C で多くのことを行いました) が、非常に基本的なものに苦労しています.. 画面にスプライトを配置する!

画面の中央にラベルを配置するのは簡単に思えます:

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

しかし、画面の左下または右上に配置しようとすると、表示されません:

//Bottom-left label
myLabel.horizontalAlignmentMode = .Left
myLabel.position = CGPoint(x: 0.0, y: self.size.height)

また

//Top-right label
myLabel.horizontalAlignmentMode = .Right
myLabel.position = CGPoint(x: self.size.width, y: self.size.height)

これは新しいプロジェクトであり、他のコードはありません。私は何を間違っていますか?

4

2 に答える 2

0

デフォルトでは、SpriteKit シーンは画面よりもはるかに多くの領域を占めることに注意してください。デフォルトのサイズは 1024 x 768 で、特に指定しない限り、すべてが普遍性のためにスケーリングされます。ビュー コントローラーで、シーンがどのように初期化されるかを確認できます。おそらく次のようなステートメントがあることがわかります

scene.scaleMode = .AspectFill

これが元ネタです。ドキュメントの Apple は、AspectFill scaleMode を使用すると何が起こるかを簡単に説明しています。

各次元の倍率が計算され、2 つのうち大きい方が選択されます。シーンの各軸は、同じ倍率でスケーリングされます。これにより、ビューの領域全体が満たされることが保証されますが、シーンの一部が切り取られる可能性があります。

他にも探索するスケール モードがあり、それらを試すことができますが、Aspect Fill にはその普遍性という大きな利点があります。

于 2015-08-24T17:55:25.270 に答える
0

作成時に SKScene のサイズを指定できます。通常、含まれている SKView のサイズを渡して、ビュー全体をカバーします。デバイスが回転すると、ビューのサイズが変更されます (アプリで新しい向きが許可されている場合)。SKScene のサイズが変更されたかどうかはわかりません。ただし、いずれにしても、シーン コンテンツの位置を更新して、たとえば、ラベルが新しい寸法で右上になるようにする必要があります。

ビューがシーンを表示するView Controllerは、メッセージviewWillTransitionToSize(_ size:,withTransitionCoordinator coordinator:)を受け取ります。このメソッドをサブクラス化して、表示している SKScene のカスタム メソッドにサイズが変更されているというメッセージを送信できます。self.frame次に、更新されるため、新しいサイズを使用してノードを簡単に再配置できます。

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

質問の核心に戻ります!シーンの右上にラベルを配置する方法は? シーンの原点が左下であることを考慮してください。SKLabelNode の場合、中心は実際には中心にあります。したがって、ラベルの寸法の半分だけオフセットします。

myLabel.position = CGPoint(x: self.size.width  - myLabel.size.width /2, 
                           y: self.size.height - myLabel.size.height/2)

ちなみに、スプライトベースのエンジン(Sprite Kit や Cocos2d など)を使った iOS ゲームで、同じデバイス(iPhone/iPad)でデバイスの回転や複数の画面サイズに対応しているゲームは見たことがありません。

于 2015-08-26T12:40:14.070 に答える