【Swift】運動会シーズンなので応援用の電光掲示板作ってみる
昔、ぶらり途中下車の旅だかなんだかで、電車の中で「居眠り中。起こさないで」みたいな電光掲示板の流れるメガネだかアイマスクだかを着用して寝ている人が出てきてとても感動したので、自分も秋葉原で電光掲示板作成キットを買ったのだけど、そのキットを紛失してしまって電光掲示板が作れなくなりました。
で、実は電光掲示板を作って子供の運動会で応援パネルとして使えば、面白いんじゃないかと思いました。
でもわざわざまた電光掲示板キットを買うのもお金が勿体無いです。
というわけでiPad用のアプリとして作ってみました。Swiftです。
ラベルを作ってそれをタイマーで右から左に流せば簡単だったのですが、電光掲示板といえばファミコンみたいなドット文字じゃないのかと思って、小さい正方形を組み合わせて文字にしました。
しかしそのうまいやり方がわからないので、試しに「エイタン」という文字を作るために一個一個座標で確認しながらそれっぽくなるまで
やっているわけです。。
あと、各ドットを、クラスをインスタンス化したもので構成しており、文字数多くなると同時に表示したときに多分かなり重くなってるんじゃないかと思います。
基本的には、右の画面外にドットを構成して左に流し、X座標が0未満になったドットをまた右の画面外に作って左に再度流しているだけです。
作った文字の座標は、別ファイルとかで配列データとして用意しておけばもっと簡単なコードになるのですが、全部そのままViewController.swiftにベタ打ちしているので、かなりアホっぽい感じになってしまいました。
あと、例えば「Hello」とか別の文字流したくなった時にまたコードいじらないといけないというかなり汎用性が低い状況になってます。
運動会に限らず、例えば友人がフェスとかに参加している時に友人を応援するために観客席から流したら喜ぶんじゃないですかね。
まあやられている方は恥ずかしいだけか。
以下コード。
import UIKit
class ViewController: UIViewController {
var dots: [dotFunc] = []
var shapeX: [Int] = []
var shapeY: [Int] = []
override func viewDidLoad() {
super.viewDidLoad()
self.setShape()
self.setTimer()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//ドットを設定
func setShape(){
//エ
for i in 1 ... 10 {
//位置
let px = CGFloat(10 * i + 330)
let py = CGFloat(100)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 10 {
//位置
let px = CGFloat(380)
let py = CGFloat(i * 10 + 100)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 14 {
//位置
let px = CGFloat(10 * i + 310)
let py = CGFloat(200)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
// イ
for i in 1 ... 8 {
//位置
let px = CGFloat(10 * i + 500)
let py = CGFloat(180 - i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 8 {
//位置
let px = CGFloat(550)
let py = CGFloat(130 + i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
// タ
for i in 1 ... 5 {
//位置
let px = CGFloat(10 * i + 630)
let py = CGFloat(150 - i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 5 {
//位置
let px = CGFloat(10 * i + 680)
let py = CGFloat(100)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 11 {
//位置
let px = CGFloat(10 * i + 630)
let py = CGFloat(220 - i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 5 {
//位置
let px = CGFloat(10 * i + 650)
let py = CGFloat(110 + i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
//ン
for i in 1 ... 3 {
//位置
let px = CGFloat(10 * i + 780)
let py = CGFloat(110 + i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 1 ... 10 {
//位置
let px = CGFloat(10 * i + 750)
let py = CGFloat(220 - i * 5)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
for i in 10 ... 15 {
//位置
let px = CGFloat(10 * i + 750)
let py = CGFloat(270 - i * 10)
let location = CGVector(dx: px,dy: py)
//速度
let velocity = CGVector(dx: -2,dy: 0)
let moveDot = dotFunc(location:location,velocity:velocity)
moveDot.createView()
self.view.addSubview(moveDot.view)
dots.append(moveDot)
}
}
//タイマー
func setTimer(){
_ = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
}
func update(){
for dot in dots{
dot.Wall()
dot.location.dx += dot.velocity.dx
dot.view.frame = CGRect(x:dot.location.dx,y:dot.location.dy,width:10,height:10)
}
}
}
class dotFunc{
var location:CGVector
var velocity:CGVector
var view:UIView
init(location:CGVector,velocity:CGVector){
self.location = location
self.velocity = velocity
self.view = UIView()
}
func createView(){
view.frame = CGRect(x:location.dx,y:location.dy,width:10,height:10)
view.backgroundColor = UIColor.greenColor()
}
func Wall(){
if location.dx < 0{
location.dx = CGFloat(800)
}
}
}
