@Apple
@フォロワー #0
新プログラミング言語Swiftでを使って作られたFlappyBirdサンプルについて @FlappyBird @swift @code @Apple
iQi @回答 • 2014-06-06 13:54 • @フォロワー #2 • 1 回答 • 2621 Views
WWDC2014で発表された新しいプログラミング言語Swiftについて @code @swift @Apple
iQi @回答 • 2014-06-06 11:43 • @フォロワー #2 • 1 回答 • 2007 Views
0
FlappyBirdサンプルのソースは下記となります。
https://github.com/gscalzo/FlappySwift
AppDelegate.swiftなどもあり、ファイル数は5つくらいのSwiftファイルとなっています。全体の動きをつかむ...
FlappyBirdサンプルのソースは下記となります。
https://github.com/gscalzo/FlappySwift
AppDelegate.swiftなどもあり、ファイル数は5つくらいのSwiftファイルとなっています。全体の動きをつかむのも難しくなさそうです。
コードをいくら見ていても実際に自分が作りたいものとは厚くて高い壁があるものです。実際に動くソースを見て、そこから学んでいくのはいかがでしょう。
FlappySwiftはiOS用、MIT Licenseのオープンソース・ソフトウェアです。
GameScene.swift 一部抜粋
{{{
//
// GameScene.swift
// FlappyBird
//
// Created by Nate Murray on 6/2/14.
// Copyright (c) 2014 Fullstack.io. All rights reserved.
//
import SpriteKit
class GameScene: SKScene {
var bird = SKSpriteNode()
var skyColor = SKColor()
var verticalPipeGap = 150.0
var pipeTextureUp = SKTexture()
var pipeTextureDown = SKTexture()
var movePipesAndRemove = SKAction()
override func didMoveToView(view: SKView) {
// setup physics
self.physicsWorld.gravity = CGVectorMake( 0.0, -5.0 )
// setup background color
skyColor = SKColor(red: 81.0/255.0, green: 192.0/255.0, blue: 201.0/255.0, alpha: 1.0)
self.backgroundColor = skyColor
// ground
var groundTexture = SKTexture(imageNamed: "land")
groundTexture.filteringMode = SKTextureFilteringMode.Nearest
var moveGroundSprite = SKAction.moveByX(-groundTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.02 * groundTexture.size().width * 2.0))
var resetGroundSprite = SKAction.moveByX(groundTexture.size().width * 2.0, y: 0, duration: 0.0)
var moveGroundSpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveGroundSprite,resetGroundSprite]))
for var i:CGFloat = 0; i < 2.0 + self.frame.size.width / ( groundTexture.size().width * 2.0 ); ++i {
var sprite = SKSpriteNode(texture: groundTexture)
sprite.setScale(2.0)
sprite.position = CGPointMake(i * sprite.size.width, sprite.size.height / 2.0)
sprite.runAction(moveGroundSpritesForever)
self.addChild(sprite)
}
// skyline
var skyTexture = SKTexture(imageNamed: "sky")
skyTexture.filteringMode = SKTextureFilteringMode.Nearest
var moveSkySprite = SKAction.moveByX(-skyTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.1 * skyTexture.size().width * 2.0))
var resetSkySprite = SKAction.moveByX(skyTexture.size().width * 2.0, y: 0, duration: 0.0)
var moveSkySpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveSkySprite,resetSkySprite]))
for var i:CGFloat = 0; i < 2.0 + self.frame.size.width / ( skyTexture.size().width * 2.0 ); ++i {
var sprite = SKSpriteNode(texture: skyTexture)
sprite.setScale(2.0)
sprite.zPosition = -20;
sprite.position = CGPointMake(i * sprite.size.width, sprite.size.height / 2.0 + groundTexture.size().height * 2.0)
sprite.runAction(moveSkySpritesForever)
self.addChild(sprite)
}
・・・
}}}
https://github.com/gscalzo/FlappySwift
AppDelegate.swiftなどもあり、ファイル数は5つくらいのSwiftファイルとなっています。全体の動きをつかむのも難しくなさそうです。
コードをいくら見ていても実際に自分が作りたいものとは厚くて高い壁があるものです。実際に動くソースを見て、そこから学んでいくのはいかがでしょう。
FlappySwiftはiOS用、MIT Licenseのオープンソース・ソフトウェアです。
GameScene.swift 一部抜粋
{{{
//
// GameScene.swift
// FlappyBird
//
// Created by Nate Murray on 6/2/14.
// Copyright (c) 2014 Fullstack.io. All rights reserved.
//
import SpriteKit
class GameScene: SKScene {
var bird = SKSpriteNode()
var skyColor = SKColor()
var verticalPipeGap = 150.0
var pipeTextureUp = SKTexture()
var pipeTextureDown = SKTexture()
var movePipesAndRemove = SKAction()
override func didMoveToView(view: SKView) {
// setup physics
self.physicsWorld.gravity = CGVectorMake( 0.0, -5.0 )
// setup background color
skyColor = SKColor(red: 81.0/255.0, green: 192.0/255.0, blue: 201.0/255.0, alpha: 1.0)
self.backgroundColor = skyColor
// ground
var groundTexture = SKTexture(imageNamed: "land")
groundTexture.filteringMode = SKTextureFilteringMode.Nearest
var moveGroundSprite = SKAction.moveByX(-groundTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.02 * groundTexture.size().width * 2.0))
var resetGroundSprite = SKAction.moveByX(groundTexture.size().width * 2.0, y: 0, duration: 0.0)
var moveGroundSpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveGroundSprite,resetGroundSprite]))
for var i:CGFloat = 0; i < 2.0 + self.frame.size.width / ( groundTexture.size().width * 2.0 ); ++i {
var sprite = SKSpriteNode(texture: groundTexture)
sprite.setScale(2.0)
sprite.position = CGPointMake(i * sprite.size.width, sprite.size.height / 2.0)
sprite.runAction(moveGroundSpritesForever)
self.addChild(sprite)
}
// skyline
var skyTexture = SKTexture(imageNamed: "sky")
skyTexture.filteringMode = SKTextureFilteringMode.Nearest
var moveSkySprite = SKAction.moveByX(-skyTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.1 * skyTexture.size().width * 2.0))
var resetSkySprite = SKAction.moveByX(skyTexture.size().width * 2.0, y: 0, duration: 0.0)
var moveSkySpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveSkySprite,resetSkySprite]))
for var i:CGFloat = 0; i < 2.0 + self.frame.size.width / ( skyTexture.size().width * 2.0 ); ++i {
var sprite = SKSpriteNode(texture: skyTexture)
sprite.setScale(2.0)
sprite.zPosition = -20;
sprite.position = CGPointMake(i * sprite.size.width, sprite.size.height / 2.0 + groundTexture.size().height * 2.0)
sprite.runAction(moveSkySpritesForever)
self.addChild(sprite)
}
・・・
}}}
0
iBookでガイドを読めますのでダウンロードしてみましょう。
変数の宣言
varは変数、letは定数
{{{
var myVar = 42
myVar = 50
let myConst = 42
}}}
コントロール
if,switch,for-in,fo...
iBookでガイドを読めますのでダウンロードしてみましょう。
変数の宣言
varは変数、letは定数
{{{
var myVar = 42
myVar = 50
let myConst = 42
}}}
コントロール
if,switch,for-in,for,while,do-while
{{{
let individualScores = [76, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
}}}
関数とクロージャ
funcで関数の定義と代入
関数を定義して
{{{
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
}}}
代入もできる。
{{{
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
}}}
複数の戻り値
Object型に全てを詰めて返していた遠い記憶が今よみがえるw...
{{{
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
}
let total = count("some arbitrary string!")
}}}
オブジェクトとクラス
クラス定義してインスタンス化して利用
{{{
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
var shape = Shape()
shape.numberOfSides = 7
}}}
列挙型と構造型
{{{
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
}}}
プロトコルと拡張
Javaでいうとインタフェースとアブストラクトに近いけど、プロパティを追加するとコンパイルエラーになるから違うかな。
{{{
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
}}}
型アノテーション
変数に意味を持たせることができます。
{{{
var welcomeMessage: String
}}}
型セーフ、型インタフェース
型推論
{{{
let meaningOfLife = 42
let pi = 3.14159
let anotherPi = 3 + 0.14159
}}}
タプル
{{{
let http404Error = (404, "Not Found")
}}}
アサーション
{{{
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
}}}
コレクション型
配列、辞書など
{{{
var shoppingList: String[] = ["Eggs", "Milk"]
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
}}}
サブスクリプト
構造内部の辞書型や列挙型のアクセス方法としてサブスクリプトを定義できます。
{{{
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("six times three is \(threeTimesTable[6])")
}}}
継承
{{{
class SomeClass: SomeSuperclass {
// class definition goes here
}
class Bicycle: Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
}}}
オーバーライド
{{{{
class Car: Vehicle {
var speed: Double = 0.0
init() {
super.init()
maxPassengers = 5
numberOfWheels = 4
}
override func description() -> String {
return super.description() + "; "
+ "traveling at \(speed) mph"
}
}
}}}
getter/setter
getter/setterのオーバライドもできますね。
{{{
class SpeedLimitedCar: Car {
override var speed: Double {
get {
return super.speed
}
set {
super.speed = min(newValue, 40.0)
}
}
}
}}}
イニシャライザ
initを使ってイニシャライザを呼びます
{{{
struct Color {
let red = 0.0, green = 0.0, blue = 0.0
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
}}}
型キャスト
asを使って型の判定を行えます。
{{{
for thing in things {
switch thing {
case 0 as Int:
println("zero as an Int")
case 0 as Double:
println("zero as a Double")
}
}
var things = Any[]()
things.append(0)
things.append(0.0)
}}}
ネストした型
{{{
struct BlackjackCard {
// nested Suit enumeration
enum Suit: Character {
case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
}
}
}}}
ジェネリクス
型指定の引数
{{{
func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)
}}}
まとめ
どこかで見たことある書き方が多く、とても憶えやすそうな言語仕様ですね!
参考資料
Swift is an innovative new programming language:https://developer.apple.com/swift/
変数の宣言
varは変数、letは定数
{{{
var myVar = 42
myVar = 50
let myConst = 42
}}}
コントロール
if,switch,for-in,for,while,do-while
{{{
let individualScores = [76, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
}}}
関数とクロージャ
funcで関数の定義と代入
関数を定義して
{{{
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")
}}}
代入もできる。
{{{
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
}}}
複数の戻り値
Object型に全てを詰めて返していた遠い記憶が今よみがえるw...
{{{
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
var vowels = 0, consonants = 0, others = 0
for character in string {
switch String(character).lowercaseString {
case "a", "e", "i", "o", "u":
++vowels
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
++consonants
default:
++others
}
}
return (vowels, consonants, others)
}
let total = count("some arbitrary string!")
}}}
オブジェクトとクラス
クラス定義してインスタンス化して利用
{{{
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
var shape = Shape()
shape.numberOfSides = 7
}}}
列挙型と構造型
{{{
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades:
return "spades"
case .Hearts:
return "hearts"
case .Diamonds:
return "diamonds"
case .Clubs:
return "clubs"
}
}
}
let hearts = Suit.Hearts
}}}
プロトコルと拡張
Javaでいうとインタフェースとアブストラクトに近いけど、プロパティを追加するとコンパイルエラーになるから違うかな。
{{{
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
7.simpleDescription
}}}
型アノテーション
変数に意味を持たせることができます。
{{{
var welcomeMessage: String
}}}
型セーフ、型インタフェース
型推論
{{{
let meaningOfLife = 42
let pi = 3.14159
let anotherPi = 3 + 0.14159
}}}
タプル
{{{
let http404Error = (404, "Not Found")
}}}
アサーション
{{{
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
}}}
コレクション型
配列、辞書など
{{{
var shoppingList: String[] = ["Eggs", "Milk"]
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]
}}}
サブスクリプト
構造内部の辞書型や列挙型のアクセス方法としてサブスクリプトを定義できます。
{{{
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("six times three is \(threeTimesTable[6])")
}}}
継承
{{{
class SomeClass: SomeSuperclass {
// class definition goes here
}
class Bicycle: Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
}}}
オーバーライド
{{{{
class Car: Vehicle {
var speed: Double = 0.0
init() {
super.init()
maxPassengers = 5
numberOfWheels = 4
}
override func description() -> String {
return super.description() + "; "
+ "traveling at \(speed) mph"
}
}
}}}
getter/setter
getter/setterのオーバライドもできますね。
{{{
class SpeedLimitedCar: Car {
override var speed: Double {
get {
return super.speed
}
set {
super.speed = min(newValue, 40.0)
}
}
}
}}}
イニシャライザ
initを使ってイニシャライザを呼びます
{{{
struct Color {
let red = 0.0, green = 0.0, blue = 0.0
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
}}}
型キャスト
asを使って型の判定を行えます。
{{{
for thing in things {
switch thing {
case 0 as Int:
println("zero as an Int")
case 0 as Double:
println("zero as a Double")
}
}
var things = Any[]()
things.append(0)
things.append(0.0)
}}}
ネストした型
{{{
struct BlackjackCard {
// nested Suit enumeration
enum Suit: Character {
case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
}
}
}}}
ジェネリクス
型指定の引数
{{{
func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)
}}}
まとめ
どこかで見たことある書き方が多く、とても憶えやすそうな言語仕様ですね!
参考資料
Swift is an innovative new programming language:https://developer.apple.com/swift/