iPhone道路パズル

道路のパネルをはめ込んで、矢印君をゴールまで連れて行く、と言った感じでiPhoneゲームのサンプルコードを描いてみます。


今回使った画像


サンプルを動かしてみた動画

サンプルコード

#import “ViewController.h”

@interface ViewController () <UIAlertViewDelegate>

@property (weak, nonatomic) UIView *selected;

@property (weak, nonatomic) UIView *marker;

@property (weak, nonatomic) NSTimer *timer;

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

    self.view.backgroundColor = [UIColor colorWithRed:0.4 green:0.2 blue:0.7 alpha:1];

    

    [self createGrid];

    [self createRoadPanel];

    [self createStartGoal];

    [self createStartButton];

}

– (void)createGrid

{

    for (int i=0; i<5*5; i++) {

        float x = (i%5) * 50 + 35;

        float y = (i/5) * 50 + 50;

        

        CALayer *layer = [CALayer layer];

        layer.name = [@(i) stringValue];

        layer.frame = CGRectMake(x, y, 48, 48);

        layer.borderColor = [UIColor blackColor].CGColor;

        layer.borderWidth = 1;

        layer.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.5

                                 ].CGColor;

        [self.view.layer addSublayer:layer];

    }

}

– (void)createStartGoal

{

    // start

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@”name = %@”, @”0″];

    CALayer *startLayer = (CALayer*)[self.view.layer.sublayers filteredArrayUsingPredicate:predicate][0];

    

    UIImage *img = [UIImage imageNamed:@”road_mark”];

    UIImageView *arrow = [[UIImageView alloc] initWithImage:img];

    arrow.center = startLayer.position;

    [self.view addSubview:arrow];

    arrow.transform = CGAffineTransformMakeRotation(M_PI/2.0);

    arrow.userInteractionEnabled = NO;

    self.marker = arrow;

    

    // goal

    predicate = [NSPredicate predicateWithFormat:@”name = %@”, @”24″];

    CALayer *goalLayer = (CALayer*)[self.view.layer.sublayers filteredArrayUsingPredicate:predicate][0];

    UILabel *goal = [[UILabel alloc] init];

    goal.text = @”(G)”;

    goal.font = [UIFont systemFontOfSize:30];

    goal.textColor = [UIColor redColor];

    [goal sizeToFit];

    goal.center = goalLayer.position;

    [self.view addSubview:goal];

}

– (void)createRoadPanel

{

    UIImage *straightImg = [UIImage imageNamed:@”road_straight”];

    UIImage *curveImg = [UIImage imageNamed:@”road_curve”];

    

    UIImageView *straightPanel = [[UIImageView alloc] initWithImage:straightImg];

    straightPanel.tag = 1;

    straightPanel.frame = CGRectMake(0, 0, 48, 48);

    straightPanel.center = CGPointMake(100, 350);

    straightPanel.layer.cornerRadius = 5;

    straightPanel.layer.masksToBounds = YES;

    [self.view addSubview:straightPanel];

    

    UIImageView *curvePanel = [[UIImageView alloc] initWithImage:curveImg];

    curvePanel.tag = 2;

    curvePanel.frame = CGRectMake(0, 0, 48, 48);

    curvePanel.center = CGPointMake(220, 350);

    curvePanel.layer.cornerRadius = 5;

    curvePanel.layer.masksToBounds = YES;

    [self.view addSubview:curvePanel];

}

– (void)createStartButton

{

    UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];

    startButton.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];

    startButton.backgroundColor = [UIColor whiteColor];

    [startButton setTitle:@” START “ forState:UIControlStateNormal];

    [startButton sizeToFit];

    startButton.center = CGPointMake(160, 430);

    [self.view addSubview:startButton];

    

    [startButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];

}

– (void)start

{

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick:) userInfo:nil repeats:YES];

}

– (void)tick:(NSTimer*)sender

{

    float angle = [[self.marker valueForKeyPath:@”layer.transform.rotation.z”] floatValue]  M_PI/2.0;

    float x = 50 * cos(angle) + self.marker.center.x;

    float y = 50 * sin(angle) + self.marker.center.y;

    

    [UIView animateWithDuration:0.4 animations:^{

        self.marker.center = CGPointMake(x, y);

    } completion:^(BOOL finished) {

        UIView *check = [self.view hitTest:self.marker.center withEvent:nil];

        float panelAngle = [[check valueForKeyPath:@”layer.transform.rotation.z”] floatValue];

        switch (check.tag) {

            case 0:

                // miss

                [self gameover];

                break;

            case 11:

                break;

            case 12:

                if (panelAngle <= M_PI && panelAngle >= 0) {

                    self.marker.transform = CGAffineTransformRotate(self.marker.transform, –M_PI/2.0);

                } else {

                    self.marker.transform = CGAffineTransformRotate(self.marker.transform, M_PI/2.0);

                }

                break;

            default:

                break;

        }

    }];

}

– (void)gameover

{

    [self.timer invalidate];

    

    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@”” message:@”Game Over” delegate:self cancelButtonTitle:@”OK” otherButtonTitles:nil];

    [av show];

}

– (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    [self.view.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        [obj removeFromSuperview];

    }];

    

    [self createStartGoal];

    [self createRoadPanel];

    [self createStartButton];

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInView:self.view];

    [self.view.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if (CGRectContainsPoint([obj frame], p) && ([obj tag] == 1 || [obj tag] == 2)) {

            UIImageView *copy = [[UIImageView alloc] initWithImage:[obj image]];

            copy.frame = [obj frame];

            copy.tag = [obj tag] + 10;

            self.selected = copy;

            [self.view insertSubview:copy belowSubview:self.marker];

            

            copy.userInteractionEnabled = YES;

            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(turn:)];

            [copy addGestureRecognizer:tap];

        }

    }];

}

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInView:self.view];

    self.selected.center = p;

}

– (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    self.selected = nil;

}

– (void)turn:(UITapGestureRecognizer*)gr

{

    [UIView animateWithDuration:0.5 animations:^{

        gr.view.transform = CGAffineTransformRotate(gr.view.transform, M_PI/2.0);

    }];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end