見出し画像

はじめてみよう。プログラミング! - Swift Playgroundsでアニメーション。

プログラミングの楽しさはコードを書くということだけではなくて、実際に絵が動いたりするとなんだかいい感じに思えます。Swift Playgroundsを使うと比較的簡単に"動く"プログラミングができるので楽しくなリます。

早速参考サイトのコード書いて実行してみましょう。テンプレートは「図形」を使っています。このテンプレートの中にいろんなクラスが作ってあるのでこれを使わないと、使えない機能があるので注意が必要です。

まず基本的な"円"を書いて色を指定します。

import Foundation

Canvas.shared.color = .white  // 背景の色

let circle = Circle(radius: 4.0) // 半径4.0の円

circle.color = #colorLiteral(red: 0.9372549019607843, green: 0.34901960784313724, blue: 0.19215686274509805, alpha: 1.0) // 色の指定

次に触ったところの座標を取得して円を動かします。

circle.onTouchUp {
   animate {
       circle.center = Point(x:circle.center.x ,y:circle.center.y)
   }
} // 円を移動します。


Canvas.shared.onTouchUp {
   circle.center = Canvas.shared.currentTouchPoints[0] //  触ったところの円の座標を取得
}

全体のコードです。

import Foundation

Canvas.shared.color = .white

let circle = Circle(radius: 4.0)

circle.color = #colorLiteral(red: 0.9372549019607843, green: 0.34901960784313724, blue: 0.19215686274509805, alpha: 1.0)

circle.onTouchUp {
   animate {
       circle.center = Point(x:circle.center.x ,y:circle.center.y)
}
Canvas.shared.onTouchUp {
   circle.center = Canvas.shared.currentTouchPoints[0]
}

実行すると

画像1


"円"の次は"棒"を動かしてみましょう。

Canvas.shared.color = .white

let line = Line(start: Point(x:-10,y:0), end: Point(x:10,y:0))

line.color = #colorLiteral(red: 0.9254901960784314, green: 0.23529411764705882, blue: 0.10196078431372549, alpha: 1.0)

let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in
line.rotation += 1})

円を動かした時との違いは

let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in
line.rotation += 1})

タイマーを使っているところです。これを使うとある間隔

withTimeInterval: 1 // この場合は”1”秒

で動き続きます。

次にボールを動かして、条件によってボールの方向を変えてみます。

まず、変数で条件となる数字を定義していきます。

Canvas.shared.color = .white

let witdth = 90.0 // ゲーム画面広さ
let height = 76.8 // ゲーム画面高さ

var ballrad = 2.0 // 半径

var valx = 2.0  // 動く距離
var valy = 2.0

let ball = Circle(radius: ballrad)
ball.center.x = 0
ball.center.y = 0
let witdth = 90.0 // ゲーム画面広さ
let height = 76.8 // ゲーム画面高さ

の中で動くようにします。これを出る場合は跳ね返るような仕組みにします。

そしてボールを作るコードです。半径が変数 ballradの円形を作り、初期の座標を(0,0)としています。

let ball = Circle(radius: ballrad)
ball.center.x = 0
ball.center.y = 0

次にボールを動かすコードです。

let timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true, block: { _ in
   ball.center.x += valx
   ball.center.y += valy
   
   if abs(ball.center.x) > witdth/2 - ballrad{
       valx *= -1
   }
   
   if abs(ball.center.y) > witdth/2 - ballrad{
       valy *= -1
   }

座標を動かす仕組みです。

ball.center.x += valx
ball.center.y += valy

ボールのx座標y座標0.05秒(withTimeInterval: 0.05)ごとに valxvalyずつ動かします。これでボールの動きが出ます。

範囲外に出た時は逆方向に方向を向けることで跳ね返る仕組みを作っています。

if abs(ball.center.x) > witdth/2 - ballrad{
  valx *= -1
}

if abs(ball.center.y) > witdth/2 - ballrad{
  valy *= -1
}

少しわかりにくいのでイラストで考えます。

画像2

ボールの中心座標で考えることが必要なので、例えば、ボールのx座標は

ball.center.x

ボーの円周が外に出る座標を考えると、今わかっているのは中心座標なのでが中心座標がwitdth/2から円の半径分を引いた座標にある場合に円周が端にあるということになるので以下の式が出来上がります。

witdth/2 - ballrad

その範囲を超える場合は動く方向を

valx *= -1

"-1"とすることで反対方向へと変更します。これで跳ね返ったように動作するようになります。

全体のコードです

Canvas.shared.color = .white

let witdth = 90.0
let height = 76.8

var ballrad = 2.0

var valx = 2.0
var valy = 2.0

let ball = Circle(radius: ballrad)
ball.center.x = 0
ball.center.y = 0

let timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true, block: { _ in
   ball.center.x += valx
   ball.center.y += valy
   
   if abs(ball.center.x) > witdth/2 - ballrad{
       valx *= -1
   }
   
   if abs(ball.center.y) > witdth/2 - ballrad{
       valy *= -1
   }


この記事が気に入ったらサポートをしてみませんか?