0

画面をタップすると、ボックスがフローティングから重力の影響を受けるように切り替わるシンプルなアプリを作成しようとしています。ただし、箱を空中に浮かせる方法が見つからないようです。

このコードは、問題の半分を処理します。

    boxNode.physicsBody = [SCNPhysicsBody dynamicBody];

これにより、ボックスが空中から落下し、作成した床にぶつかります。SCNPhysicsBody にこれと反対のことをするものはありますか? おそらく、オブジェクトを浮かせたり、天井に向かって帆走したりしますか?

また、私はこのコードを書きました:

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {

    if (myBool == false) {
        myBool = true;
        NSLog(@"true");
    } else {
        myBool = false;
        NSLog(@"false");
    }


}
- (void)viewDidLoad
{
    [super viewDidLoad];

// touch recognizer
    UITapGestureRecognizer *screenTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    [self.view addGestureRecognizer:screenTap];

    // create box
    SCNBox *myBox = [SCNBox boxWithWidth:1.0 height:1.0 length:1.0 chamferRadius:0.1];
    SCNNode *boxNode = [SCNNode nodeWithGeometry:myBox];
    boxNode.position = SCNVector3Make(0.0, 0.0, 4.0);
    [myScene.rootNode addChildNode:boxNode];



    while (myBool == true) {

    boxNode.physicsBody = [SCNPhysicsBody dynamicBody];

    }


}

ただし、whileループが機能しない理由はわかりません。myBool が変更されたことを検出し、boxNode の物理を変更すると考えていましたが、そうではありません。

4

1 に答える 1

1

このviewDidLoadメソッドは、ビューが読み込まれるときに 1 回だけ呼び出されます。アプリが で初期化されている場合myBool = false、while ループは実行されません。ただし、この場合、myBooltrue の場合、while ループの実行が停止することはなく、ビューの読み込みが妨げられるため、ユーザーがビューをタップしてジェスチャ レコグナイザーをトリガーすることができなくなります。

以下はテストしていませんが、少なくとも出発点になるはずです。viewDidLoadシーンはコードに従って作成されます。重要なのは、シーンのphysicsWorld重力がゼロに設定されていることです (これはデフォルトで -9.8 です)。後でユーザーがビューをタップすると、重力がデフォルト値にリセットされ、ボックスが落下するはずです。

ヘッダファイルGameViewController.h

#import <UIKit/UIKit.h>
#import <SceneKit/SceneKit.h>

@interface GameViewController : UIViewController {
    SCNScene *myScene;
}

@end

GameViewController.m

#import "GameViewController.h"

@implementation GameViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // create a new scene
    myScene = [SCNScene scene];

    // create box
    SCNBox *myBox = [SCNBox boxWithWidth:1.0 height:1.0 length:1.0 chamferRadius:0.1];
    SCNNode *boxNode = [SCNNode nodeWithGeometry:myBox];
    boxNode.position = SCNVector3Make(0.0, 0.0, 4.0);
    [myScene.rootNode addChildNode:boxNode];

    boxNode.physicsBody = [SCNPhysicsBody dynamicBody];

    //'disable' scene gravity
    myScene.physicsWorld.gravity = SCNVector3Make(0, 0, 0);

    SCNView *scnView = (SCNView *)self.view;
    scnView.scene = myScene;
    scnView.allowsCameraControl = YES;
    scnView.autoenablesDefaultLighting = YES;
    scnView.backgroundColor = [UIColor blackColor];

    // add a tap gesture recognizer
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    NSMutableArray *gestureRecognizers = [NSMutableArray array];
    [gestureRecognizers addObject:tapGesture];
    [gestureRecognizers addObjectsFromArray:scnView.gestureRecognizers];
    scnView.gestureRecognizers = gestureRecognizers;
}

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
    myScene.physicsWorld.gravity = SCNVector3Make(0, -9.8, 0);
}

@end
于 2016-03-29T01:29:01.263 に答える