在屏幕上使用UIButton进行游戏

时间:2014-12-24 02:35:09

标签: ios objective-c uibutton sprite-kit

我一直试图在屏幕上创建游戏近一个月,并且我认为我也可以发布我当前的代码,看看是否有人可以提供帮助。我已经阅读了很多教程并观看了一些很好的视频,但我的代码看起来总是如此不同以至于我偶然发现错误了几个小时。我试图创建的是一个按钮,在我的两个精灵碰撞后,你会回到起始页面(由故事板制作)。我可以创建一个按钮,将您带回到起始屏幕,但我希望能够帮助显示在碰撞检测之前不显示的代码以及在哪里为按钮声明所有内容。出于某种原因,我总是会遇到错误,因为无法正常使用它们并且它们没有被正确使用。任何帮助是极大的赞赏。我目前的代码:

Viewcontroller.h

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

@interface ViewController : UIViewController

@end

Viewcontroller.m

#import "ViewController.h"
#import "MyScene.h"

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

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

// Create and configure the scene.
MyScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;

scene.viewController = self;

// Present the scene.
[skView presentScene:scene];
}

- (BOOL)shouldAutorotate
{
return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
    return UIInterfaceOrientationMaskAll;
}
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

@end

MyScene.h

#import <SpriteKit/SpriteKit.h>

@interface MyScene : SKScene <SKPhysicsContactDelegate>

@property (strong, nonatomic) UIViewController *viewController;

@end

MyScene.m

#import "MyScene.h"

@interface MyScene()

@property (nonatomic) NSTimeInterval lastTimeSceneRefreshed;

@property (nonatomic) SKSpriteNode* squirrelSprite;
@property (nonatomic) SKSpriteNode* lightNut;
@property (nonatomic) SKSpriteNode* appleSprite;

@property NSTimeInterval lastTouch;

@property BOOL atFirstPosition;
@property CGPoint firstPosition;



@end

@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;
    [self buildBackground];
    [self startScrolling];

    _firstPosition = CGPointMake(self.frame.size.width * 0.817f, self.frame.size.height * .40f);
    _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];

    // Declare SKAction that waits 2 seconds
    SKAction *wait = [SKAction waitForDuration:3.0];

    // Declare SKAction block to generate the sprites
    SKAction *createSpriteBlock = [SKAction runBlock:^{
        SKSpriteNode *lightnut = [SKSpriteNode spriteNodeWithImageNamed:@"lightnut.png"];
        BOOL heads = arc4random_uniform(100) < 50;
        lightnut.position = (heads)? CGPointMake(257,600) : CGPointMake(50,600);

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

        SKAction *moveNodeUp = [SKAction moveByX:0.0 y:-700.0 duration:1.3];
        [lightnut runAction: moveNodeUp];
    }];

    // Combine the actions
    SKAction *waitThenRunBlock = [SKAction sequence:@[wait,createSpriteBlock]];

    // Lather, rinse, repeat
    [self runAction:[SKAction repeatActionForever:waitThenRunBlock]];

}
return self;
}

- (void)update:(CFTimeInterval)currentTime {
// Updating background nodes
// We don't want to update backgrounds each frame (60 times per second)
// Once per second is enough. This will reduce CPU usage
if (currentTime - self.lastTimeSceneRefreshed > 1) {
    [self backgroundNodesRepositioning];
    self.lastTimeSceneRefreshed = currentTime;
}
}

- (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)
{

}
}

-(void)goToHomeScreen {
[self.viewController.navigationController popToRootViewControllerAnimated:YES];
}

@end

如果我需要添加任何其他信息或我应该澄清的任何信息,请告诉我,谢谢!

1 个答案:

答案 0 :(得分:0)

  

我想帮助解决在碰撞检测之前不会显示的代码以及在哪里声明按钮的所有内容

使用NSNotificationCenter将UIButton隐藏属性设置为YES或NO。