Lesson07 花火 解説

001:<HTML>
002:<HEAD>
003:<TITLE>lesson07 花火</TITLE>
004:<STYLE type="text/css">
005:<!--
006:FONT { font-size:15pt }
007:B { font-size:20pt }
008:-->
009:</STYLE>
010:<SCRIPT LANGUAGE="VBScript>
011:<!--
012:Option Explicit             '変数の宣言を強制する       リファレンス Option Explicit 参照
013:Const e=2.7182818           '定数の宣言 e は自然対数の底値  リファレンス Const 参照
014:Const pi=3.1416             '定数の宣言 piは円周率の値
015:Const g=0.5                 '定数の宣言 gは重力加速度に相当する値(大きくすると落下速度が速くなる)
016:Const k=0.05                '定数の宣言 kは空気の抵抗に相当する値(大きくすると移動速度が遅くなる)
017:Const tminterval=50         '定数の宣言 Sub tmプロシジャーのタイマーSetTimeOutの時間間隔を 10(ms) に設定
018:Dim vx(30)                  '配列変数宣言 30ヶの花火の水平方向の初速
019:Dim vy(30)                  '配列変数宣言 30ヶの花火の垂直方向の初速
020:Dim a(30)                   '配列変数宣言 30ヶの花火の軌道計算式を簡略化する計算途中の値
021:Dim t                       '変数宣言   時間に相当するカウント値 このプログラムでは0から69まで値を繰り返す
022:Dim ww, wh                  '変数宣言   ww:ウインドウの水平方向サイズ wh:ウインドウの垂直方向サイズ
023:Dim x1, y1                  '変数宣言   x1:花火が発生する水平方向位置 y1:花火が発生する垂直方向位置
024:init                        '起動時に Sub initプロシジャーコール
025:Sub init()
026:Dim i, j
027:Dim c, cl
028:    Randomize               'Randomize:乱数ジェネレータを初期化する  リファレンス Randomize 参照
029:    For i=1 to 30
030:        cl=""
031:        For j=1 to 3                               '乱数で16進6桁のカラーコード作成
032:            c=Right("0" & Hex(Int(256*Rnd)), 2)    'リファレンス Right Hex Int Rnd 参照
033:            cl=cl & c
034:        Next
035:        '次の行のDocument.Writeにより★の文字を30ヶ書き込む
036:        Document.Write "<Div id=""h" & i & """ Style=""Position:Absolute;Left:0;Top:0""><Font COLOR=""#" & cl & """>★</Font></Div>"
037:    Next
038:    tm                                             'Sub tm プロシジャーコール
039:End Sub
040:Sub tm()
041:Dim i
042:Dim v, d, r
043:    If t=0 Then
044:        ww=Document.Body.OffsetWidth    'wwにウインドウの水平方向サイズ(pixel値)を代入
045:        wh=Document.Body.OffsetHeight   'whにウインドウの垂直方向サイズ(pixel値)を代入
046:        r=Rnd-0.5
047:        x1=ww * (0.5 + 0.35*Sgn(r))     'x1に花火発生水平位置代入 r:正の時右側 負の時左側 リファランス Sgn 参照
048:        y1=wh * (0.1 + 0.4*Rnd)         'y1に花火発生垂直位置代入
049:        For i=1 to 30
050:            v=1+6*Rnd                   'v:花火の初速
051:            d=2*pi*Rnd                  'd:花火の方向
052:            vy(i)=v*Sin(d)-10           '花火初速の垂直方向値    リファレンス Sin 参照
053:            vx(i)=v*Cos(d)              '花火初速の水平方向値    リファレンス Cos 参照
054:            a(i)=g / (k*k) -vy(i) / k   '花火軌跡計算の途中値
055:        Next
056:    End If
057:    If t<50 Then
058:        '花火の水平方向の動き
059:        h1.Style.PixelLeft=vx(1)/k*(1-1/e^(k*t))+x1
060:        h2.Style.PixelLeft=vx(2)/k*(1-1/e^(k*t))+x1
061:        h3.Style.PixelLeft=vx(3)/k*(1-1/e^(k*t))+x1
062:        h4.Style.PixelLeft=vx(4)/k*(1-1/e^(k*t))+x1
063:        h5.Style.PixelLeft=vx(5)/k*(1-1/e^(k*t))+x1
064:        h6.Style.PixelLeft=vx(6)/k*(1-1/e^(k*t))+x1
065:        h7.Style.PixelLeft=vx(7)/k*(1-1/e^(k*t))+x1
066:        h8.Style.PixelLeft=vx(8)/k*(1-1/e^(k*t))+x1
067:        h9.Style.PixelLeft=vx(9)/k*(1-1/e^(k*t))+x1
068:        h10.Style.PixelLeft=vx(10)/k*(1-1/e^(k*t))+x1
069:        h11.Style.PixelLeft=vx(11)/k*(1-1/e^(k*t))+x1
070:        h12.Style.PixelLeft=vx(12)/k*(1-1/e^(k*t))+x1
071:        h13.Style.PixelLeft=vx(13)/k*(1-1/e^(k*t))+x1
072:        h14.Style.PixelLeft=vx(14)/k*(1-1/e^(k*t))+x1
073:        h15.Style.PixelLeft=vx(15)/k*(1-1/e^(k*t))+x1
074:        h16.Style.PixelLeft=vx(16)/k*(1-1/e^(k*t))+x1
075:        h17.Style.PixelLeft=vx(17)/k*(1-1/e^(k*t))+x1
076:        h18.Style.PixelLeft=vx(18)/k*(1-1/e^(k*t))+x1
077:        h19.Style.PixelLeft=vx(19)/k*(1-1/e^(k*t))+x1
078:        h20.Style.PixelLeft=vx(20)/k*(1-1/e^(k*t))+x1
079:        h21.Style.PixelLeft=vx(21)/k*(1-1/e^(k*t))+x1
080:        h22.Style.PixelLeft=vx(22)/k*(1-1/e^(k*t))+x1
081:        h23.Style.PixelLeft=vx(23)/k*(1-1/e^(k*t))+x1
082:        h24.Style.PixelLeft=vx(24)/k*(1-1/e^(k*t))+x1
083:        h25.Style.PixelLeft=vx(25)/k*(1-1/e^(k*t))+x1
084:        h26.Style.PixelLeft=vx(26)/k*(1-1/e^(k*t))+x1
085:        h27.Style.PixelLeft=vx(27)/k*(1-1/e^(k*t))+x1
086:        h28.Style.PixelLeft=vx(28)/k*(1-1/e^(k*t))+x1
087:        h29.Style.PixelLeft=vx(29)/k*(1-1/e^(k*t))+x1
088:        h30.Style.PixelLeft=vx(30)/k*(1-1/e^(k*t))+x1
089:       '花火の垂直方向の動き
090:        h1.Style.PixelTop =a(1)/e^(k*t)+g/k*t-a(1)+y1
091:        h2.Style.PixelTop =a(2)/e^(k*t)+g/k*t-a(2)+y1
092:        h3.Style.PixelTop =a(3)/e^(k*t)+g/k*t-a(3)+y1
093:        h4.Style.PixelTop =a(4)/e^(k*t)+g/k*t-a(4)+y1
094:        h5.Style.PixelTop =a(5)/e^(k*t)+g/k*t-a(5)+y1
095:        h6.Style.PixelTop =a(6)/e^(k*t)+g/k*t-a(6)+y1
096:        h7.Style.PixelTop =a(7)/e^(k*t)+g/k*t-a(7)+y1
097:        h8.Style.PixelTop =a(8)/e^(k*t)+g/k*t-a(8)+y1
098:        h9.Style.PixelTop =a(9)/e^(k*t)+g/k*t-a(9)+y1
099:        h10.Style.PixelTop =a(10)/e^(k*t)+g/k*t-a(10)+y1
100:        h11.Style.PixelTop =a(11)/e^(k*t)+g/k*t-a(11)+y1
101:        h12.Style.PixelTop =a(12)/e^(k*t)+g/k*t-a(12)+y1
102:        h13.Style.PixelTop =a(13)/e^(k*t)+g/k*t-a(13)+y1
103:        h14.Style.PixelTop =a(14)/e^(k*t)+g/k*t-a(14)+y1
104:        h15.Style.PixelTop =a(15)/e^(k*t)+g/k*t-a(15)+y1
105:        h16.Style.PixelTop =a(16)/e^(k*t)+g/k*t-a(16)+y1
106:        h17.Style.PixelTop =a(17)/e^(k*t)+g/k*t-a(17)+y1
107:        h18.Style.PixelTop =a(18)/e^(k*t)+g/k*t-a(18)+y1
108:        h19.Style.PixelTop =a(19)/e^(k*t)+g/k*t-a(19)+y1
109:        h20.Style.PixelTop =a(20)/e^(k*t)+g/k*t-a(20)+y1
110:        h21.Style.PixelTop =a(21)/e^(k*t)+g/k*t-a(21)+y1
111:        h22.Style.PixelTop =a(22)/e^(k*t)+g/k*t-a(22)+y1
112:        h23.Style.PixelTop =a(23)/e^(k*t)+g/k*t-a(23)+y1
113:        h24.Style.PixelTop =a(24)/e^(k*t)+g/k*t-a(24)+y1
114:        h25.Style.PixelTop =a(25)/e^(k*t)+g/k*t-a(25)+y1
115:        h26.Style.PixelTop =a(26)/e^(k*t)+g/k*t-a(26)+y1
116:        h27.Style.PixelTop =a(27)/e^(k*t)+g/k*t-a(27)+y1
117:        h28.Style.PixelTop =a(28)/e^(k*t)+g/k*t-a(28)+y1
118:        h29.Style.PixelTop =a(29)/e^(k*t)+g/k*t-a(29)+y1
119:        h30.Style.PixelTop =a(30)/e^(k*t)+g/k*t-a(30)+y1
120:    ElseIf t= 50 Then
121:       '花火を隠す
122:        h1.Style.PixelTop=-100
123:        h2.Style.PixelTop=-100
124:        h3.Style.PixelTop=-100
125:        h4.Style.PixelTop=-100
126:        h5.Style.PixelTop=-100
127:        h6.Style.PixelTop=-100
128:        h7.Style.PixelTop=-100
129:        h8.Style.PixelTop=-100
130:        h9.Style.PixelTop=-100
131:        h10.Style.PixelTop=-100
132:        h11.Style.PixelTop=-100
133:        h12.Style.PixelTop=-100
134:        h13.Style.PixelTop=-100
135:        h14.Style.PixelTop=-100
136:        h15.Style.PixelTop=-100
137:        h16.Style.PixelTop=-100
138:        h17.Style.PixelTop=-100
139:        h18.Style.PixelTop=-100
140:        h19.Style.PixelTop=-100
141:        h20.Style.PixelTop=-100
142:        h21.Style.PixelTop=-100
143:        h22.Style.PixelTop=-100
144:        h23.Style.PixelTop=-100
145:        h24.Style.PixelTop=-100
146:        h25.Style.PixelTop=-100
147:        h26.Style.PixelTop=-100
148:        h27.Style.PixelTop=-100
149:        h28.Style.PixelTop=-100
150:        h29.Style.PixelTop=-100
151:        h30.Style.PixelTop=-100
152:    End If
153:    t=(t+1) Mod 70                'tは0から1ずつ増加、tが69の次の時、t+1の値70の剰余0がtに代入される Mod
154:    SetTimeOut "tm", tminterval
155:End Sub
156:-->
157:</SCRIPT>
158:</HEAD>
159:<BODY BGCOLOR="mistyrose">
160:<BR><BR><BR><BR>
161:<TABLE align="center"><TR><TD>
162:    <FONT color="blue"><B>左がタマ屋</B><br>
163:    <FONT color="magenta"><B>右がハナ屋</B></FONT><BR><BR>
164:    <B>どっちが多く上がる?</B></FONT>
165:</TD></TR></TABLE>
166:<!--Copyright(c) 2002 Animation studio nezus QQQ All rights reserved.-->
167:</BODY>
168:</HTML>

Lesson07 解説 終わり