読者です 読者をやめる 読者になる 読者になる

Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

線に沿う玉の運動を描く③

名前がばらばらなので統一してみようと思い,かっこ悪い名前ですが,やろうとしているものもカッコよいわけではないのでこうしました。
前のエントリは名前はそのままです
その1 
Powerpoint VBAで当たり判定を考える。 - chemiphys’s blog
その2
当たり判定の続き - chemiphys’s blog

どこから攻めていくのかを考えているところです。

まず,斜面のノードを線でつなぐということをマクロでやらせてみました。
f:id:chemiphys:20170115012614p:plain

元を滑らかな線にしないならば,そう難しいことはないんじゃないか,と思うきっかけになります。

もともと直線だけで結んで絵を描くのが好きな方なので,そちらも一考。

ただ,なめらかなものにこだわる際,方向のおおまかな判断に,この斜面のノードを直線で結んだものは役にたつ気がします。だいたいの増減を表してくれますからね。

一次導関数みたいなのを高校数学でならったことを思い出しました(゚▽゚*)

ちょっと見えてますが,重なり抽出の図形もノードを結んだ線を描かせました。

ここで問題となったのが,うまいことマクロが想定通り動かなかった。

いちおう使えなくはないので載せてみますが,

Sub c()
Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
Dim x As Shape, i As Long
Dim sLine As Shape

For Each x In ActiveWindow.Selection.ShapeRange 'TSlide.Shapes
    Debug.Print x.Name
    If x.Name = "円" Then Exit Sub
    For i = 1 To x.Nodes.Count - 1
        Set sLine = TSlide.Shapes.AddLine(x.Nodes(i).Points(1, 1), x.Nodes(i).Points(1, 2), x.Nodes(i + 1).Points(1, 1), x.Nodes(i + 1).Points(1, 2))
        sLine.Line.ForeColor.RGB = RGB(255, 0, 0)
        sLine.Name = x.Name & "_" & i
    Next
Next

End Sub

For Eachでスライド上の図形全部にまわそうとしたら,まわらなかったんです。

For Each x In TSlide.Shapes ~ Nextだと,もともとの円と斜面であるFFormという図形についてはがんばろうとしてくれるけど,ほかの細々とした図形はやってくれない。
Shapes.Countでは13個とかちゃんと反応してるのになぁ・・

しょうがないので,違いはわからないけど,図形たちを選んでおいて,ActiveWindow.Selection.ShapeRangeでやると,なんとか回ってくれました。

まずは,左から右の方向に動くアニメーションを考えることとします。いろんな可能性をそのままにやればいろいろ決まらないので,限定して考える。

さて,詳しく見てみると,
f:id:chemiphys:20170115014616p:plainf:id:chemiphys:20170115014624p:plain
右下がりの抽出図形では,Node1→Node2の方向で玉の移動方向を決めれそうな感じ。

右上がりの抽出図形では,
f:id:chemiphys:20170115014722p:plainf:id:chemiphys:20170115014730p:plain
途中のノードスタートになってしまいます。
名前をつけてみているので,様子がそれなりにわかります。
f:id:chemiphys:20170115015136p:plain
まず,途中ではあるけれど,x座標が一番小さいものをターゲットにできそうだということ。

曲線をまがるところを細かくノード分けされていると,正しい傾きをしめさないこと。

ある程度以上の幅を持たない場合はたとえばNode7~Node9というように,二つ分のノードで傾きを考えた方が妥当そうなことがありそうだということ。

つけている数値からわかるように,ノードが増える方向に見ていってさしつかえないだろうということ。

これらの有効と思われる情報が得られました。

これならなんとか方向を決めれそうです。


また,書きながら思ったんですが,元の斜面のノードごとに動きを把握するようにし,現在右向きなのか左向きなのかという大まかな情報と組み合わせていけば,

左向きになったときも傾きを求めるためにどのノードを捕まえればいいのか,補足できそうな気がするので,

ほんとこれってできるんじゃないだろうかと思えてくる。

明日はなんとか動かすところまでマクロ書きたいな。

そこまでいけるだろうか。(;´▽`A`` 出かけたりしないといけないからなぁ(;´・ω・)