床をジャンプして、上の階に上っていくアクションゲームを作っていこうと思います。その1では、基本的なところで、床、プレーヤーキャラクターの二つを組み込んでみました。(画像は.atlasフォルダにまとめて、Texture Atlasの仕組みを使っています。)
動作イメージ
XcodeからiOS7 iPhone Simulatorで動かすとこんな感じになります。
サンプルコード
#import “ViewController.h”
#import <SpriteKit/SpriteKit.h>
@interface JumpGameScene : SKScene
@property BOOL contentCreated;
@end
@implementation JumpGameScene
– (void)didMoveToView:(SKView *)view
{
if (!self.contentCreated) {
[self createSceneContents];
self.contentCreated = YES;
}
}
– (void)createSceneContents
{
[self createBlocks];
[self createPlayer];
}
– (void)createBlocks
{
// bottom
for (int i=0; i<13; i++) {
float x = i * 40;
float y = 20;
[self createBlockWithPoint:CGPointMake(x, y)];
}
// 2nd
for (int i=0; i<13; i++) {
if (i == 3 || i == 4 || i == 9 || i == 10) {
continue;
}
float x = i * 40;
float y = 120;
[self createBlockWithPoint:CGPointMake(x, y)];
}
// top
for (int i=0; i<13; i++) {
if (i == 7 || i == 8) {
continue;
}
float x = i * 40;
float y = 220;
[self createBlockWithPoint:CGPointMake(x, y)];
}
}
– (void)createBlockWithPoint:(CGPoint)p
{
SKTexture *blockTexture = [SKTexture textureWithImageNamed:@”block”];
SKSpriteNode *block = [SKSpriteNode spriteNodeWithTexture:blockTexture size:CGSizeMake(40, 40)];
block.position = p;
block.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:block.size];
block.physicsBody.dynamic = NO;
[self addChild:block];
}
– (void)createPlayer
{
SKSpriteNode *player = [SKSpriteNode spriteNodeWithTexture:nil size:CGSizeMake(50, 50)];
player.name = @”player”;
player.position = CGPointMake(100, 80);
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.size];
player.physicsBody.allowsRotation = NO;
player.physicsBody.linearDamping = 1.0;
[self addChild:player];
[self walk];
}
– (void)walk
{
SKNode *player = [self childNodeWithName:@”player”];
SKTexture *walkA = [SKTexture textureWithImageNamed:@”player-walkA.png”];
SKTexture *walkB = [SKTexture textureWithImageNamed:@”player-walkB.png”];
NSArray *frames = @[walkA, walkB];
SKAction *walk = [SKAction animateWithTextures:frames timePerFrame:0.2 resize:NO restore:NO];
SKAction *move = [SKAction moveByX:20 y:0 duration:0.35];
[player runAction:[SKAction repeatActionForever:[SKAction group:@[move,walk]]]];
}
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
SKNode *player = [self childNodeWithName:@”player”];
[player.physicsBody applyImpulse:CGVectorMake(0, 70)];
}
– (void)didSimulatePhysics
{
SKNode *player = [self childNodeWithName:@”player”];
if (player.position.x > CGRectGetMaxX(self.frame) + 40) {
player.position = CGPointMake(-40, player.position.y);
}
}
@end
@interface ViewController ()
@end
@implementation ViewController
– (void)viewDidLoad
{
[super viewDidLoad];
SKView *spriteView = [[SKView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetMaxY(self.view.frame), CGRectGetMaxX(self.view.frame))];
[self.view addSubview:spriteView];
SKScene *scene = [[JumpGameScene alloc] initWithSize:spriteView.frame.size];
[spriteView presentScene:scene];
}
– (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end