【Swift】【Xcode】子供がエレベータのボタンが好きで何度も押したがるのでア プリ作った
1歳4ヶ月過ぎた我が子はますますいろんなことに興味を持ち始めてみて、特に最近では大人がやること全てをマネしたがる模様。
お出かけ時に駅やデパートでエレベータのボタンなんかを見ると、もうベビーカーから身を乗り出して「俺に押させろ」を言わんばかりで叫び始めるので、そういうときは抱っこしてエレベータのボタンを押させる。
とりあえず最初は他のお客さんに迷惑かからないかなと心配だったけど、最近では「今は開くボタンを押そうね」と指示すれば、他の階数のボタンを押しまくったり「閉じる」ボタンを押してお客さんを扉で挟んでしまうみたいなことは無いので安全です。
あとはスイカとかパスモで電車の改札の「ピッ」というやつ、あれをやらせないと聞かなくなりましたね。
とりあえず、こういうのを家でもやらせたら面白いんじゃないかと思って、おもちゃとして自作できないかと考えた際に、前者のエレベータであれば簡単にiPad用アプリとして実装できるので早朝まだ子供が寝てる間に作ってみました。
開くボタンと閉じるボタンを実装、開くを押せば開くボタンが黄色く点灯して赤い扉がゆっくり開いて、閉じるを押せば閉じるボタンが黄色く点灯して赤い扉がゆっくり閉じます。
まあそれだけだとあじけないので、扉の奥にラベルを置いておいて、猫の画像を絵文字で表示しておきました。
こうすることで、一応いないいないバア的な遊びにも使えます。
なお、子供は異様なほどアンパンマンが好きなので(我が子はアンパンマンの顔を見る度に「アンバ!」と叫んで興奮します)、この猫をアンパンマンの画像に替えれば、かなりイケルような気がしています。
コード
すごい単純ですし、遊びで作っただけで本格的にApp Storeに並べるくらいまでブラッシュアップするつもりはないので、とりあえずコード載せておきます。
ちなみに、ドアの動作設定が楽そうなのでゲームプロジェクトで書いてます。
GameScene.swift
import UIKit import SpriteKit // ボタン開を生成. let myButton = UIButton() // ボタン閉を生成. let myButton2 = UIButton() //オブジェクト let myLabel = SKLabelNode(fontNamed:"Hiragino Kaku Gothic ProN") var door = SKShapeNode(rectOfSize: CGSizeMake(100, 250)) var door2 = SKShapeNode(rectOfSize: CGSizeMake(100, 250)) class GameScene: SKScene { override func didMoveToView(view: SKView) { /* Setup your scene here */ self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) self.backgroundColor = UIColor.blackColor() myButton.frame = CGRectMake(0,0,100,100) myButton.backgroundColor = UIColor.grayColor(); myButton.layer.masksToBounds = true myButton.setTitle("◀️▶️", forState: UIControlState.Normal) myButton.titleLabel!.font = UIFont(name: "Helvetica-Bold",size: CGFloat(40)) myButton.layer.cornerRadius = 20.0 myButton.layer.position = CGPoint(x: self.view!.frame.width/4, y:100) myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside) self.view!.addSubview(myButton); myButton2.frame = CGRectMake(0,0,100,100) myButton2.backgroundColor = UIColor.grayColor(); myButton2.layer.masksToBounds = true myButton2.setTitle("▶️◀️", forState: UIControlState.Normal) myButton2.titleLabel!.font = UIFont(name: "Helvetica-Bold",size: CGFloat(40)) myButton2.layer.cornerRadius = 20.0 myButton2.layer.position = CGPoint(x: (self.view!.frame.width-self.view!.frame.width/4), y:100) myButton2.addTarget(self, action: "onClickMyButton2:", forControlEvents: .TouchUpInside) self.view!.addSubview(myButton2); myLabel.text = "🐱" myLabel.fontSize = 100 myLabel.position = CGPoint(x:150, y:150) self.addChild(myLabel) door.fillColor = UIColor.redColor() door.position = CGPoint(x: 100, y:150) self.addChild(door) door2.fillColor = UIColor.redColor() door2.position = CGPoint(x: 200, y:150) self.addChild(door2) } func onClickMyButton(sender : UIButton){ myButton.backgroundColor = UIColor.yellowColor(); myButton2.backgroundColor = UIColor.grayColor(); let moveA = SKAction.moveTo(CGPoint(x: 50, y: 150), duration: 0.5) let moveB = SKAction.moveTo(CGPoint(x: 250, y: 150), duration: 0.5) door.runAction(moveA) door2.runAction(moveB) } func onClickMyButton2(sender : UIButton){ myButton.backgroundColor = UIColor.grayColor(); myButton2.backgroundColor = UIColor.yellowColor(); let moveA = SKAction.moveTo(CGPoint(x: 100, y: 150), duration: 0.5) let moveB = SKAction.moveTo(CGPoint(x: 200, y: 150), duration: 0.5) door.runAction(moveA) door2.runAction(moveB) } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ } }
あと、最初から自分のiPad miniで遊ぶ用にしか考えてなかったので、ドアとか猫とかの表示位置はipad mini以外だと変な位置に表示されます。
ボタンの方はちゃんとスクリーンサイズ取得してから補正してるのですが。
あと、初心者すぎてSKのときのボタンの定義の仕方がよくわからなかったのでUIButtonで定義してます。
ラベルとかドアのイメージとかはSKLabelNode、SKShapeNodeで定義してるのですが。。。
SKButtonNodeとか無いんですね。。。
だから座標系がSKとUIで混在してるという。。。
結果
使い方を子供に教えて見せたのですが、やっぱりボタンを押す感触がiPadからで
は物理的に得られないからでしょうか、ちょっと遊んだらすぐに飽きてしまった
模様。
物理的な感触の体験が得られないのはやっぱりiPadとかiPhoneアプリの限界を感
じます。
しかもボタン押すよりも、動いているドアを捕まえようとしていて、こちらの意
図どおりに遊んでくれません。
また、猫の絵文字に特段興味を引かれなかった様子です。
これをアンパンマンの画像に替えればそれなりの効果はあるのでしょうかね。
なお、子供用のおもちゃとして自分オンリーの実機に転送しただけで、これをア
ップル側に申請してApp Storeに並べようという意図は今のところありません。
が、これに階数ボタンセットしておにごっことかかくれんぼとかの要素とちょっ
としたクイズ要素入れれば、教育用アプリとして活用できそうな気もするので、
なんたらエレベータ、みたいなタイトルで、申請用のゲームアプリ作ってもいい
なあ。