×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

アナログ時計(その2)


前ページの続きです。

分針、時針も基本的には秒針と考え方は同じです。
秒針との違いは……

秒針:1秒で6度回転する。秒針の傾きは、秒×6度。
分針:1秒で6÷60度回転する。分針の傾きは、分×6度。
時針:1秒で6÷60÷60度回転する。時針の傾きは、時×30度+分÷60×30度。

ということです。
時針の傾きはについては、例えば○時30分なら、時針が○時と○+1時の間を指していないとさすがにおかしいので、分のぶんだけ足しました。

まず、秒針、分針、時針の長さと太さを変数で設定します。

byousinfutosa = 5
byousinnagasa = 250

hunsinfutosa = 8
hunsinnagasa = 280

jisinfutosa = 15
jisinnagasa = 200

それぞれの針の違いをわかりやすくするために、針を太めに変更しました。

分針の表示は、サブルーチン「tokeimove」内に書きます。

  GraphicsWindow.BrushColor = "green"
  hunsin = Shapes.AddRectangle(hunsinfutosa, hunsinnagasa)
  hunnow = Clock.Minute
  idouxh = hunsinnagasa * 0.5 * Math.Sin(hunnow * 6 * pai / 180)
  idouyh = hunsinnagasa * 0.5 * (1 - Math.Cos(hunnow * 6 * pai / 180) )
  Shapes.Rotate(hunsin, hunnow * 6)
  Shapes.Move(hunsin, tyusinX - hunsinfutosa + idouxh, tyusinY - hunsinnagasa + idouyh)

秒針との変更点は、
・針の色を「green」に指定。
・「hunnow = Clock.Minute」で、分を取得。

つづけて、時針です。

  GraphicsWindow.BrushColor = "red"
  jisin = Shapes.AddRectangle(jisinfutosa, jisinnagasa)
  jinow = Clock.Hour
  jikatamuki = jinow * 30 + hunnow * 30 / 60
  idouxj = jisinnagasa * 0.5 * Math.Sin(jikatamuki * pai / 180)
  idouyj = jisinnagasa * 0.5 * (1 - Math.Cos(jikatamuki * pai / 180) )
  Shapes.Rotate(jisin, jikatamuki)
  Shapes.Move(jisin, tyusinX - jisinfutosa + idouxj, tyusinY - jisinnagasa + idouyj)

秒針との変更点は、
・針の色を「red」に指定。
・「hunnow = Clock.Hour」で、時を取得。
・「jikatamuki = jinow * 30 + hunnow * 30 / 60」で、時針の傾きを変数として定義。

これでそれらしく動くようになります。
あと、普通アナログ時計は、針が時針、分針、秒針の順に重なるので、そこも考慮して……

GraphicsWindow.Title = "Analog"
GraphicsWindow.Width = 600
GraphicsWindow.Height = 600

byousinfutosa = 5
byousinnagasa = 250

hunsinfutosa = 8
hunsinnagasa = 280

jisinfutosa = 15
jisinnagasa = 200

tyusinX = 300
tyusinY = 300

Timer.Interval = 1000
Timer.Tick = tokeimove

Sub tokeimove
  GraphicsWindow.Clear()
  byounow = Clock.Second
  hunnow = Clock.Minute
  jinow = Clock.Hour
  pai = Math.Pi
  
  GraphicsWindow.BrushColor = "red"
  jisin = Shapes.AddRectangle(jisinfutosa, jisinnagasa)
  jikatamuki = jinow * 30 + hunnow * 30 / 60
  idouxj = jisinnagasa * 0.5 * Math.Sin(jikatamuki * pai / 180)
  idouyj = jisinnagasa * 0.5 * (1 - Math.Cos(jikatamuki * pai / 180) )
  Shapes.Rotate(jisin, jikatamuki)
  Shapes.Move(jisin, tyusinX - jisinfutosa + idouxj, tyusinY - jisinnagasa + idouyj)
  
  GraphicsWindow.BrushColor = "green"
  hunsin = Shapes.AddRectangle(hunsinfutosa, hunsinnagasa)
  idouxh = hunsinnagasa * 0.5 * Math.Sin(hunnow * 6 * pai / 180)
  idouyh = hunsinnagasa * 0.5 * (1 - Math.Cos(hunnow * 6 * pai / 180) )
  Shapes.Rotate(hunsin, hunnow * 6)
  Shapes.Move(hunsin, tyusinX - hunsinfutosa + idouxh, tyusinY - hunsinnagasa + idouyh)

  GraphicsWindow.BrushColor = "blue"
  byousin = Shapes.AddRectangle(byousinfutosa, byousinnagasa)
  idoux = byousinnagasa * 0.5 * Math.Sin(byounow * 6 * pai / 180)
  idouy = byousinnagasa * 0.5 * (1 - Math.Cos(byounow * 6 * pai / 180) )
  Shapes.Rotate(byousin, byounow * 6)
  Shapes.Move(byousin, tyusinX - byousinfutosa + idoux, tyusinY - byousinnagasa + idouy)
EndSub

一応、ちゃんと動く時計になりました。

時計2

後は見易いように文字盤みたいなものを入れたりしたいですね。
ちょっとお洒落にしてみました。↓

GraphicsWindow.Title = "Analog"
GraphicsWindow.Width = 600
GraphicsWindow.Height = 600

byousinfutosa = 5
byousinnagasa = 250

hunsinfutosa = 8
hunsinnagasa = 280

jisinfutosa = 15
jisinnagasa = 200

tyusinX = 300
tyusinY = 300

GraphicsWindow.BrushColor = "LightCyan"
GraphicsWindow.FillEllipse(0, 0, 600, 600)
GraphicsWindow.BrushColor = "MintCream"
GraphicsWindow.FillEllipse(50, 50, 500, 500)

GraphicsWindow.BrushColor = "DarkSlateGray"
GraphicsWindow.FontSize = "25"
GraphicsWindow.DrawText(285, 7, "12")
GraphicsWindow.DrawText(430, 50, "1")
GraphicsWindow.DrawText(530, 150, "2")
GraphicsWindow.DrawText(565, 285, "3")
GraphicsWindow.DrawText(530, 420, "4")
GraphicsWindow.DrawText(430, 520, "5")
GraphicsWindow.DrawText(290, 560, "6")
GraphicsWindow.DrawText(147, 518, "7")
GraphicsWindow.DrawText(47, 415, "8")
GraphicsWindow.DrawText(15, 285, "9")
GraphicsWindow.DrawText(45, 150, "10")
GraphicsWindow.DrawText(140, 50, "11")

Timer.Interval = 1000
Timer.Tick = tokeimove

Sub tokeimove

  Shapes.HideShape(jisin)
  Shapes.HideShape(hunsin)
  Shapes.HideShape(byousin)
  
  byounow = Clock.Second
  hunnow = Clock.Minute
  jinow = Clock.Hour
  pai = Math.Pi
  
  GraphicsWindow.BrushColor = "LightSeaGreen"
  jisin = Shapes.AddRectangle(jisinfutosa, jisinnagasa)
  jikatamuki = jinow * 30 + hunnow * 30 / 60
  idouxj = jisinnagasa * 0.5 * Math.Sin(jikatamuki * pai / 180)
  idouyj = jisinnagasa * 0.5 * (1 - Math.Cos(jikatamuki * pai / 180) )
  Shapes.Rotate(jisin, jikatamuki)
  Shapes.Move(jisin, tyusinX - jisinfutosa + idouxj, tyusinY - jisinnagasa + idouyj)
  
  GraphicsWindow.BrushColor = "SeaGreen"
  hunsin = Shapes.AddRectangle(hunsinfutosa, hunsinnagasa)
  idouxh = hunsinnagasa * 0.5 * Math.Sin(hunnow * 6 * pai / 180)
  idouyh = hunsinnagasa * 0.5 * (1 - Math.Cos(hunnow * 6 * pai / 180) )
  Shapes.Rotate(hunsin, hunnow * 6)
  Shapes.Move(hunsin, tyusinX - hunsinfutosa + idouxh, tyusinY - hunsinnagasa + idouyh)

  GraphicsWindow.BrushColor = "LightCoral"
  byousin = Shapes.AddRectangle(byousinfutosa, byousinnagasa)
  idoux = byousinnagasa * 0.5 * Math.Sin(byounow * 6 * pai / 180)
  idouy = byousinnagasa * 0.5 * (1 - Math.Cos(byounow * 6 * pai / 180) )
  Shapes.Rotate(byousin, byounow * 6)
  Shapes.Move(byousin, tyusinX - byousinfutosa + idoux, tyusinY - byousinnagasa + idouy)
EndSub

時計3

背景を入れたので、サブルーチンで「GraphicsWindow.Clear()」を使うと背景ごと綺麗に消えてしまいます。
そこで

  Shapes.HideShape(jisin)
  Shapes.HideShape(hunsin)
  Shapes.HideShape(byousin)

を、サブルーチンの最初に入れてみました。
これで針だけを消すことができます。

次:音符を再生


▲TOPへ戻る