2014-11-28 7 views
2

Мне нужно сделать конечный экран для моего приложения после обнаружения столкновения. Каков самый простой способ сделать конечный экран нажатием кнопки в главном меню/в игре. Могу ли я использовать ViewController? Я прочитал много руководств, видео, а также все посты здесь:Использование контроллера представления для игры над сценой

Это мой текущий код (не все это лишь некоторые важные вещи):

@implementation MyScene 

static const int squirrelHitCategory = 1; 
static const int nutHitCategory = 2; 

- (instancetype)initWithSize:(CGSize)size { 
if (self = [super initWithSize:size]) { 
    self.physicsWorld.contactDelegate = self; 

    _squirrelSprite = [SKSpriteNode spriteNodeWithImageNamed:@"squirrel"]; 
    _squirrelSprite.position = _firstPosition; 
    _atFirstPosition = YES; 

    _squirrelSprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10]; 
    _squirrelSprite.physicsBody.categoryBitMask = squirrelHitCategory; 
    _squirrelSprite.physicsBody.contactTestBitMask = nutHitCategory; 
    _squirrelSprite.physicsBody.collisionBitMask = nutHitCategory; 

    _squirrelSprite.physicsBody.affectedByGravity = NO; 

    self.physicsWorld.contactDelegate = self; 

    [self addChild:_squirrelSprite]; 

    SKAction *wait = [SKAction waitForDuration:3.0]; 

     SKSpriteNode *lightnut = [SKSpriteNode spriteNodeWithImageNamed:@"lightnut.png"]; 

     lightnut.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(200,160)]; 

     lightnut.physicsBody.categoryBitMask = nutHitCategory; 
     lightnut.physicsBody.contactTestBitMask = squirrelHitCategory; 
     lightnut.physicsBody.collisionBitMask = squirrelHitCategory; 

     lightnut.physicsBody.affectedByGravity = NO; 

     self.physicsWorld.contactDelegate = self; 

     [self addChild: lightnut]; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch *touch = [touches anyObject]; 
// Check time since the last touch event 
if (touch.timestamp-_lastTouch >= .9) { 
    // Allow touch 
    NSLog(@"greater than or equal to 3 seconds"); 

    if (_atFirstPosition) 
    { 
     SKAction *moveNodeLeft = [SKAction moveByX:-207.8 y:0.0 duration:0.85]; 
     [_squirrelSprite runAction: moveNodeLeft withKey:@"moveleft"]; 
    } else { 
     SKAction *moveNodeRight = [SKAction moveByX:207.8 y:0.0 duration:0.85]; 
     [_squirrelSprite runAction: moveNodeRight withKey:@"moveright"]; 
    } 
    _atFirstPosition = !_atFirstPosition; 
    _squirrelSprite.xScale *= -1.0; 
} 
else { 
    // Ignore touch 
    NSLog(@"Seconds since last touch %g",touch.timestamp-_lastTouch); 
} 
// Store timestamp 
_lastTouch = touch.timestamp; 

} 

-(void)didBeginContact:(SKPhysicsContact *)contact 

{ 
NSLog(@"contact detected"); 
SKPhysicsBody *firstBody, *secondBody; 

firstBody = contact.bodyA; 
secondBody = contact.bodyB; 

if(firstBody.categoryBitMask == squirrelHitCategory || secondBody.categoryBitMask == nutHitCategory) 
{ 

} 
} 

Я хочу, чтобы мои чтобы быть простым, поэтому самый простой способ сделать это лучше всего. Спасибо!

ответ

1

Для моих игр я добавляю свойство UIViewController и назначаю его SKScene.

Затем вы можете добавить представление в виде дополнительного представления. Пример ...

SKScene *scene = [SKScene sceneWithSize:self.view.frame.size]; 
scene.viewController = self; 

Затем на сцене ...

[self.viewController addSubview:yourView]; 

Вот некоторые реализации моей собственной игры, чтобы помочь вам начать работу.

В вашей раскадровке или XIB в зависимости от того, что вы предпочитаете, вы добавляете представление с кнопками в качестве свойств вида. В моем случае у меня есть scoreLabel, menuButton и restartButton как свойства, и вы можете установить их как x.hidden = YES; как я хочу, запуская их в сцене, такие как ...

self.vc.menuButton.hidden = YES; 
self.vc.restartButton.hidden = YES; 

В вашем GameViewController (Какой подкласс UIViewController) ...

//header 
@interface GameViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 
@property (weak, nonatomic) IBOutlet UIView *hudView; 
@property (weak, nonatomic) IBOutlet UIButton *menuButton; 
@property (weak, nonatomic) IBOutlet UIButton *restartButton; 

@property (nonatomic) MazeScene *maze; 

@end 

//class 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Configure the view. 
    SKView * skView = (SKView *)self.view; 

    // Debug Options 
// skView.showsFPS = YES; 
// skView.showsNodeCount = YES; 
// skView.showsPhysics = YES; 

    // Create and configure the maze scene. 
    CGSize sceneSize = skView.bounds.size; 
    skView.ignoresSiblingOrder = YES; 

    MazeScene *maze = [[MazeScene alloc] initWithSize:sceneSize]; 
    maze.scaleMode = SKSceneScaleModeAspectFill; 
    maze.vc = self; 
    [skView presentScene:maze]; 
    _maze = maze; 
} 

В вашем SKScene ...

//header 
@interface MazeScene : SKScene <SKPhysicsContactDelegate> 

@property (nonatomic, weak) GameViewController *vc; 

@end 

//class 
-(id) initWithSize:(CGSize)size { 
    if (self = [super initWithSize:size]) { 
     //(GameViewController*) is a static cast of a subclass of UIViewController. 
     [self.view addSubview:((GameViewController*)self.vc).hudView]; 
     // [self restartGame] is a specific method for my game, don't worry about it 
     [self restartGame]; 
    } 
    return self; 
} 
+0

Есть ли хорошие учебники о том, как это сделать? Я все еще очень новичок в программировании на ios. Спасибо! – Ryanc

+0

@Ryanc Я обновил свой ответ с помощью своего собственного кода, чтобы помочь вам начать работу. У меня нет изображения моего раскадровки, но если вам нужна дополнительная помощь, дайте мне знать. – Scott

Смежные вопросы