2016-03-29 21 views
0

Basit bir uygulama yapmaya çalışıyorum; ekrana dokunduğunuzda bir kutu yüzer konumdan yerçekiminden etkilenir. Kutuyu havada süzülmek için bir yol bulamıyorum.SceneKit'te anti-gravite fiziği

Bu kod burada yarım sorunu halleder:

boxNode.physicsBody = [SCNPhysicsBody dynamicBody]; 

Bu havanın dışarı düşmesi ve Oluşturduğum bir yere vurmak için kutuyu neden olur. SCNPhysicsBody'de bunun tersini yapacak bir şey var mı? Söyle, belki, nesnelerin yüzmesine veya sadece bir tavana doğru hareket etmesine neden olur mu?

- (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]; 

    } 


} 

süre döngü olsa çalışmıyor neden emin değilim:

Ayrıca, bu kodu yazdım. MyBool'un değiştirildiğini ve boxNode'un fiziğini değiştirdiğini algılayacağını düşünüyordum, ama değil.

cevap

1

viewDidLoad yöntemi yalnızca görünüm yüklendiğinde bir kez çağrılır. Uygulamanız myBool = false ile başlatılmışsa, while döngüsü asla çalışmaz. Ancak bu durumda, myBool doğruysa, döngü hiçbir zaman çalışmayı durduramaz, bu da görüntünün yüklenmesini engeller ve bu nedenle de kullanıcının jest tanıyıcıyı tetiklemek için görünüme dokunmasını engeller.

Aşağıdakileri test etmedim, ancak en azından size bir başlangıç ​​noktası vermelisiniz. Sahne, kodunuza göre viewDidLoad'da oluşturulur, önemli olarak sahne physicsWorld, yerçekimi sıfır olarak ayarlanır (bu varsayılan olarak -9.8). Daha sonra kullanıcı görüşe dokunduğunda, yer çekimini varsayılan değerine sıfırlar, bu da kutunun düşmesine neden olur.

başlık dosyası GameViewController.h

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

@interface GameViewController : UIViewController { 
    SCNScene *myScene; 
} 

@end 

ve

#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 
+0

GameViewController.m teşekkür ederiz! Bu kesinlikle yardımcı olur. myScene, handleSingleTap öğesinden erişilemez: myScene, viewDidLoad içinde bildirilmiş olsa da. Başka bir yere bildirebilir miyim? Üzgünüm, oldukça yeni. –

+0

Ah evet, üzgünüm, sadece 'myScene' bir örnek değişken olarak zaten bildirildiğini varsaydım. Yukarıdakileri günceller ... kod snippet'im zaten biraz çalışma gerektiriyordu. – lock

+0

Not: Düzenlenen sürümde 'myScene' sınıf arabirim tanımında bir örnek değişkeni olarak bildiriyoruz. Daha sonra 'viewDidLoad' yönteminde sahneyi bu değişkene atayarak onu sınıftaki tüm işlevler (ve diğer sınıflar) için erişilebilir hale getiririz. FWIW, eğer yeni başlamış olsaydım muhtemelen Swift'e giderdim. – lock