Swift Code in Swift - 2日間でゲームを作ってみた

Preview:

DESCRIPTION

Swiftを使って2日間でゲームを作る話

Citation preview

「Swiftでゲームを作ってみた2日間」  って話なんですけどね…

株式会社あくしゅ  代表取締役 山崎泰宏

自己紹介

!   山崎泰宏  

!   1977年北海道生まれ  

!   株式会社あくしゅ 代表取締役  !   2006年登記、現在新宿南口から徒歩10分くらいのところ  !   従業員13名(2014年6月現在)  

 

基本のドキュメンテーションは英語 会話は必要に応じて英語

Glocalized  Company

職場の風景

出社時間決まってないから  朝は誰もいません

開発環境はこんな感じ

飲み会の時間には  みんな集まります

ゲームの時間も  出社してくれます

今日はSwiftでゲームを作ってみた  って話しますけどね…

iOS  と全く関係ない  ソフトウェア技術会社です

クラウド基盤ソフトウェア  Wakame-­‐vdc

仮想ネットワーク技術

OpenFlow  1.3を駆使し  物理ネットワークの上で  仮想ネットワークを  自由自在にオーバレイするもの

データセンターの仮想化を  目指している会社

• Open  Source  License  (LGPL3)  • Ruby  

山崎の講演や執筆 !   NII  (国際情報学研究所)にてクラウド関連講義を担当  

今年度からAIITでも非常勤講師になる予定  

!   日経コンピュータ(2012/1~2012/3  計7回連載)  「今さら聞けないクラウドコンピューティング」  

!   その他クラウド関連の記事を  多数執筆  

ぜひご購入下さい!

とは言え、個人的には  ゲームとか作るのは好き(だった)

大学時代 (16年前) 1年生の時から、  「ネットワーク」+「3次元」の技術に  没頭していた

1998年頃    1年目で作って  学内に公開した  通信対戦ゲーム

OpenGLに手を出す

暇人なのでゲームエンジンとか作ってた。

地味に表現力を上げて行きました

形状 材質

関節 最適化

当時はまだプレステ1の時代

Virtual  Sound  Horror  House  (1999)

光と影の表現を加えて、やっとここまで来た…

しかも、Virtual  Realityっぽく (1)  HMDでぐるぐる見回せる

(3)障害物に当たると  Hapticsな感じがする

(2)  3Dサウンドが鳴る

現実空間と融合した方が面白そう

実際の展示風景 (2001年)

物理的な動きで箱の中を表現

遊び心も忘れずに

某教授にそそのかされて

Swiftのセッション  やりませんか?

やりませんか?

ゲームプログラミングなんて12年ぶりくらいだよ!

残された学習時間は2日間  (延べだと12時間はある)

Swiftを真面目に勉強すると絶対にバテて死ぬ

生存戦略

とりあえずの方針

!   コードリーディングしまくれ!  !   Swiftの事なんて知らなくて良いんだ!  

気になるところを改造したり、  まずはコピペできるコードを探せ!  自分の知識辞書を作れ!  

!   読まないやつは大体書けない  ! FlappyBirdモドキのサンプルが素敵だった!  

!   悩むな!コードを書け!  !   書きたくなってから文法を調べろ!

FlappySwift

!   https://github.com/fullstackio/FlappySwift

FlappySwift !   単純なゲームではあるが、  

コードは思っていたより短かった  

! SpriteKitと言うゲームエンジンを使っている  !   Objective-­‐C時代から存在していたものらしい  !   シーングラフとイベントベースの制御エンジン  !   アクションを巧妙に定義して  

アニメーションやスクロールなどをさせている

!   物理演算の機能を使って衝突判定をしている  

スクロール

① ②

戻す 戻す

コードにするとこんな感じ 画像のロード

画像幅分だけ左へ移動

画像幅分だけ左へ瞬間移動

これらの動作を  永遠に繰り返す

2枚以上の画像を並べ  それぞれにこのアクションを適用する

衝突判定

各キャラクターごとにBounding  Areaを設定し、何と衝突検査するかを指定するだけ

衝突したらこの関数が呼ばれるので、  何と何が衝突したのかをif判定すれば良い

移動と操作 このバカな鳥は、重力の影響を受ける

画面のどこかをタッチした瞬間に、  重力方向の速度をキャンセルし、  上向きの力積を与えられ、空中でジャンプする

Swiftって言うか  SpriteKitの使い方が分かった感じ。  

とてもよく出来てる。

良く言えば、  少なくともSwift読むのは超簡単。  

理解できなかったのはSpriteKitの仕様の方。

何を作るか?

左右に走り続ける不憫な男がいるので  タップしてジャンプさせる。    空中に浮いているブロックの乗って  どんどん上に登っていくゲーム。

ブロックを下からすり抜けて登れるようにしたいので、物理演算に頼らず、自前

の衝突判定を入れた方が良さそう

さあ新規プロジェクトを  作るぞ!

ゲーム用のプロジェクトがあるので、迷わず選択

得意なOpenGLもある!  迷わず選択

※ESはよく知らないんですが

スケルトンコードが出た!

…ん? 全部コメントアウトされてるように見える…

\(T_T)/ 動いてないのかよ! Metalも同じだった

出鼻をくじかれ、  気分が乗らなくなってきた

ので、とりあえず絵を描こう!

取り込んで…

バラバラにして…

背景を抜いて…

大満足♥

FlappySwiftのコードをパクって  参考にして、走るアニメを作成

ここまでで1日終了。  とりあえず翌日に完成したデモをどうぞ

シーンの構成要素

!   Man  !   走る人  

!   Blocks  !   浮かんでいるブロック群  

!   Background  !   背景

前回処理時間との  差分を出す

基本的には、この差分時間を使って移動距離などを計算する

衝突判定

•  Manのx座標がブロックの範囲内で、  y座標がブロック上面より上にあるとき、  移動先がブロック上面より下になる場合に  衝突したと判定する  •  衝突したらy座標を固定し、  •  落下のベクトルを0にする  

実際はブロックの範囲を少し大きめに取って  判定している

感想とまとめ

!   とりあえずゲーム作るのは簡単だった  !   今回やらなかった物理演算も簡単で楽しそう  !   2日間でもそれなりのものが、すぐにできる  

!   言語仕様  !   Rubyに近い感じがする  !   ?  が割りと良さ気  

!   コンパイルとランタイムでのコードチェックの役割が  とても良い感じ  

!   ゲームライブラリが良く出来てる