道路のパネルをはめ込んで、矢印君をゴールまで連れて行く、と言った感じで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