Swift入門|Sprite Kitでアナログ時計を作成する


Apple、Appsレビューガイドラインに、Watchアプリで時計が主のアプリは承認されないことを追記 | Watch | Macお宝鑑定団 blog(羅針盤)
というニュースを横目に見ながらそろそろSwiftを触っておかなければということで時計アプリを作ってみることにしました。

ググったらアクションを作ってupdate内でアクションを適用というコードが多かったのですが、それだと時計の針が正確になりませんでした。
時間を正確に取るためNSDateをupdate内でいちいち宣言しています。何かいい方法はないでしょうか。。。

コードは以下の通りです。Xcodeは6.3 Swiftは1.2です。

import SpriteKit

class GameScene: SKScene {
let sHand=SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(2, 180));
let mHand=SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(5, 180));
let hHand=SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(5, 140));

var last:CFTimeInterval!;
var lastM:CFTimeInterval!;
var lastH:CFTimeInterval!;
var myDate:NSDate!;
var myComponetns:NSDateComponents!;
var myCalendar: NSCalendar!;
var _sec:Double!;
var _min:Double!;
var _hour:Double!;

func DegreeToRadian(Degree:Double)->CGFloat{
return CGFloat(Degree)/CGFloat(180.0*M_1_PI)
}

override func didMoveToView(view: SKView) {
/* Setup your scene here */

myDate = NSDate();
//カレンダーを取得.
myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!

//取得するコンポーネントを決める.
myComponetns = myCalendar.components(
NSCalendarUnit.CalendarUnitHour |
NSCalendarUnit.CalendarUnitMinute |
NSCalendarUnit.CalendarUnitSecond ,
fromDate: myDate)
_sec=Double(myComponetns.second * -6 );
_min=Double(myComponetns.minute * -6);
_hour=Double((myComponetns.hour-12) * -30);

//盤面
// ShapeNodeを作成.
let Circle = SKShapeNode(circleOfRadius: 190)

// ShapeNodeの座標を指定.
Circle.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

// ShapeNodeの塗りつぶしの色を指定.
Circle.fillColor = UIColor.whiteColor()
Circle.zPosition=CGFloat(-2.0)
// sceneにShapeNodeを追加.
self.addChild(Circle)
var cArr:[SKShapeNode]=[];
for i in 1...60 {

let memori=SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(1, 14));
// ShapeNodeの座標を指定.
memori.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

memori.position=CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
memori.zPosition=CGFloat(2.0)
memori.anchorPoint = CGPointMake(0.5, -12);

memori.zRotation = DegreeToRadian(Double(-6 * i))
//cArr.append(Circle2);
self.addChild(memori)

}

for i in 1...12 {

let memori=SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(5, 14));
// ShapeNodeの座標を指定.
memori.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

memori.position=CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
memori.zPosition=CGFloat(2.0)
memori.anchorPoint = CGPointMake(0.5, -12);

memori.zRotation = DegreeToRadian(Double(-30 * i))
//cArr.append(Circle2);
self.addChild(memori)

}

//四角形の描画
//秒
sHand.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
sHand.anchorPoint = CGPointMake(0.5, 0);
sHand.zRotation=DegreeToRadian(_sec);
self.addChild(sHand)

//分
mHand.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
mHand.anchorPoint = CGPointMake(0.5, 0);
mHand.zRotation=DegreeToRadian(_min+(6*(_sec/360)));
println(_min+(6*(_sec/360)))
self.addChild(mHand)

//時
hHand.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
hHand.anchorPoint = CGPointMake(0.5, 0);
hHand.zRotation = DegreeToRadian(_hour + (30*(_min/360)));
println(_hour)
self.addChild(hHand)

}

override func touchesBegan(touches: Set, withEvent event: UIEvent) {
/* Called when a touch begins */
}

override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
myDate = NSDate();
myComponetns = myCalendar.components(
NSCalendarUnit.CalendarUnitHour |
NSCalendarUnit.CalendarUnitMinute |
NSCalendarUnit.CalendarUnitSecond ,
fromDate: myDate)

_sec=Double(myComponetns.second * -6 );
_min=Double(myComponetns.minute * -6);
_hour=Double((myComponetns.hour-12) * -30);

sHand.zRotation=DegreeToRadian(_sec)
mHand.zRotation=DegreeToRadian(_min+(6*(_sec/360)))
hHand.zRotation=DegreeToRadian(_hour + (30*(_min/360)));

}
}
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中