【Swift】【Xcode】初心者でも誰でも簡単にゲームアプリが作れる最低限のコードをまとめてみた
xcodeに関して初心者向けのアプリ開発のための書籍は数あれど、結局一通り読んでも、コードを書けなければ意味がない。
で、概念は理解できても、実際にコードを書く際に、どういう処理をどう宣言するかとか割と忘れてしまう。
同じラベルを使うのしても、UIKitとSpriteKitとでは微妙に違うところあるしなあ。。。
あと、分厚い書籍に載っているものを読んでも、結局どういうアプリを作りたいかで、全く使わない処理とかもあるから、無駄なページも多い。
というわけで、いつも自分で忘れてしまってまた調べなおしたりして時間がかかってる関数とか変数とかそういったものの処理をダーヤス.comのアプリ部の標準技術集に羅列してみました。
まあ自分用のメモなので、解説とか見た目とかぜんぜん気にしてない羅列方法で見づらいですが。。。
あと、基本的にSKSpriteKitでゲームアプリを作る際、最低限ここにかいてある処理を使うだけでも、マリオだろうがぷよぷよだろうがピンボールだろうが、なんでも作れると思います。
(2015年11月29日時点での話。この後もっと複雑なことを追記することもありますし、swiftは仕様が頻繁に変わるので、来年の今頃はまた書き方のルールが変わってるんでしょうね。)
問題はやっぱりインターフェースのデザインとか、上手な絵を描くこととかそういうことに尽きてくるのでしょうなあ。。。
誰かデザインができる方と一緒にアプリを作ってみたいです。
とりあえず上記ダーヤス.comのアプリ部に書いた内容を以下に転載です。見づらくても、まあcommand+Fで検索して使えば割と備忘録として活用できるかも。
◯SpriteKit
・ラベル
宣言
var scoreLabel: SKLabelNode = SKLabelNode(fontNamed:"Hiragino Kaku Gothic ProN")
位置決め
scoreLabel.position = CGPoint(x: 70, y: self.frame.size.height-50)
テキスト内容の変更
scoreLabel.text = "Score:\(score)"
フォントサイズの変更
scoreLabel.fontSize = 20
フォント色の変更
scoreLabel.fontColor = UIColor(red:1, green:1, blue:1, alpha:1)
(例えばscoreLabel.color = UIColor.whiteColor()みたいに書いてもエラー出ないのだけどこれだとフォントカラーが変わるわけでもないし背景色が変わるわけでもない。。謎。調べればいいだけなのだけど。)
画面に表示
self.addChild(scoreLabel)
画面から消す
scoreLabel.removeFromParent()
・タイマー
宣言
var timer:NSTimer!
タイマー開始
timer = NSTimer.scheduledTimerWithTimeInterval(1(タイマー周期。ここに変数を代入して色々タイミング変えてる。その際は一旦invalidate必要), target: self, selector: "stageCountDown"(開始させる関数とか), userInfo: nil, repeats: true)
タイマー停止
timer.invalidate()
・重力を発生させる
宣言,発生
self.physicsWorld.gravity = CGVector(dx: 0, dy: -2)
デリゲート設定
self.physicsWorld.contactDelegate = self
・ノードを出現させる
宣言
let thread = SKSpriteNode(color: UIColor.grayColor(), size: CGSize(width: 5, height: 50))
let thread = SKSpriteNode(imageNamed: "ball.png")(画像を読み込む場合)
let thread = SKShapeNode(circleOfRadius: 20)(円形のシェイプノードが作成できる)
thread.fillColor = UIColor.cyanColor()(シェイプノードの中身の色を水色にする)
位置決め
thread.position = CGPoint(x: self.size.width*0.5, y: 50)(これは中央の座標)
ノードに重力の影響を付加
let physicsBody = SKPhysicsBody(rectangleOfSize: thread.frame.size)(ノードと同じサイズにかかる重力)
physicsBody.dynamic = false(trueだと重力がかかる)
physicsBody.contactTestBitMask = 1(とりあえず0より大きい値でこう書いておくべき)
thread.physicsBody = physicsBodyノードに重力の影響を与える
・ノードに名前をつける
thread.name = "thread"(.tagみたいなものか。タグより使い易い印象)
・ノードを画面に表示
self.addChild(thread)
・ノードを画面から削除
thread.removeFromParent()
・ノード同士がぶつかった時の処理
func didBeginContact(contact: SKPhysicsContact) {}(ぶつかったらこの処理が実行される)
ぶつかった2つのノード情報を各々取得
let nodeA = contact.bodyA.node
let nodeB = contact.bodyB.node
if nodeA!.name == "thread" {}(一方のノード名がthreadだったら。。。このように名前で条件分岐できる)
・パーティクルを発生
let particle = SKEmitterNode(fileNamed: "MyParticle.sks")
self.addChild(particle!)
let removeAction = SKAction.removeFromParent()
let durationAction = SKAction.waitForDuration(1)
let sequenceAction = SKAction.sequence([durationAction,removeAction])(1秒発生させて消す一連のアクション)
particle?.runAction(sequenceAction)(一連のアクションを実行)
particle?.position = CGPoint(x: nodeB!.position.x, y: nodeB!.position.y)(パーティクル発生位置)
particle?.alpha = 1(パーティクルの濃さを1)
let fadeAction = SKAction.fadeAlphaTo(0, duration: 0.5)(0.5秒かけてフェードアウトする処理宣言)
particle?.runAction(fadeAction)(フェードアウト処理を実行)