SpriteKit.png
啟動Xcode和選擇新的項目文件從主菜單。選擇iOS \應用\ SpriteKit游戲模板并單擊“下一步”。
01.png
輸入你的游戲名稱品名,選擇iPhone設備運行一下:
02.png
SpriteKit物理和碰撞檢測
SpriteKit帶有一個物理引擎內置的,可以模擬真實的運動和碰撞檢測。我們打算用SpriteKit的物理引擎將我們的飛船,飛船和導彈之間的碰撞檢測。我們將在下面的步驟中建立我們的游戲:
1、加入游戲的主要角色(飛船)在屏幕上(1)
2、添加滾動的背景(1)
3、增加一個導彈,宇宙飛船可以碰撞(2)
4、顯示游戲結束屏幕時,飛船和導彈給重放選項碰撞(2)
添加的主要特征
#import "MyScene.h"
@implementation MyScene{
SKSpriteNode *ship;
SKAction *actionMoveUp;
SKAction *actionMoveDown;
}
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
self.backgroundColor = [SKColor whiteColor];
//Making self delegate of physics World
self.physicsWorld.gravity = CGVectorMake(0,0);
self.physicsWorld.contactDelegate = self;
}
return self;
}
@end
添加 飛船和剛體:
-(void)addShip{
//initalizing spaceship node
SKSpriteNode * ship = [SKSpriteNode new];
ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
[ship setScale:0.5]; ship.zRotation = - M_PI / 2;
//Adding SpriteKit physicsBody for collision detection
ship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ship.size];
ship.physicsBody.categoryBitMask = shipCategory;
ship.physicsBody.dynamic = YES;
ship.physicsBody.contactTestBitMask = obstacleCategory;
ship.physicsBody.collisionBitMask = 0;
ship.name = @"ship";
ship.position = CGPointMake(120,160);
[self addChild:ship];
actionMoveUp = [SKAction moveByX:0 y:30 duration:.2];
actionMoveDown = [SKAction moveByX:0 y:-30 duration:.2];
}
02.png
背景滾動
- (void)initalizingScrollingBackground
{
for (int i = 0; i < 2;i++) {
SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"bg"];
bg.position = CGPointMake(i *bg.size.width, 0);
bg.anchorPoint = CGPointZero;
bg.name = @"bg";
[self addChild:bg];
}
設置障礙物
// moveObstacle [?ɑbst?k(?)l] 障礙物
- (void)moveObstacle
{
NSArray *nodes = self.children;
for (SKNode *node in nodes) {
if (![node.name isEqual:@"bg"]&& ![node.name isEqual:@"ship"]) {
SKSpriteNode *ob = (SKSpriteNode *) node;
CGPoint obVelocity = CGPointMake(-OBJECT_VELOCITY, 0);
CGPoint amtToMove = CGPointMultiplyScalar(obVelocity, _dt);
ob.position = CGPointAdd(ob.position, amtToMove);
if (ob.position.x < -100) {
// 移除父節點
[ob removeFromParent];
}
}
}
}
定時器更新:
- (void)update:(CFTimeInterval)currentTime
{
if (_lastUpdateTime) {
_dt = currentTime - _lastUpdateTime;
} else {
_dt = 0;
}
_lastUpdateTime = currentTime;
if (currentTime - _lastMissileAdded >1) {
_lastMissileAdded = currentTime + 1;
// 添加導彈
[self addMissile];
}
// 移除背景
[self moveBg];
// 移除障礙物
[self moveObstacle];
}
end.png