▼ 一つ前のコード Small Basic。やはり基本はゲーム作って楽しむべきなので、キーを押したらボールを発射する雛形 Small Basic では、発行ボタンですぐ WEB上に公開して、SilverLight によって動作させる事ができます。ローカルでは画像が使えますが、WEB 上ではメモリだけで動作させるコードにする必要があります。 ▼ SilverLight で実行 http://smallbasic.com/program/?BZN043 ▼ 動画のソースコード
' ウィンドウの背景色 GraphicsWindow.BackgroundColor = "White" ' ウインドウの位置 GraphicsWindow.Left = 100 GraphicsWindow.Top = 40 ' リサイズできないようにする GraphicsWindow.CanResize = 0 LoadImage_Url = "https://lh5.googleusercontent.com/-3IWAlBbUSYs/VLgFjekftnI/AAAAAAAAYKw/VM5FI7bYNzw/s800/142133580685821985693.jpeg" 'LoadImage_Url = "" LoadImage_Opacity = 50 LoadImage() ' ****************************************** ' 白いボール ' ****************************************** GraphicsWindow.BrushColor = "#ffffff" ' ボールの塗りつぶし色 Ball_Speed = 1 Ball_Size = 30 ' ボールの直径 Ball_Name = Shapes.AddEllipse(Ball_Size, Ball_Size) ' 初期位置 Ball_x = LoadImage_width / 2 - Ball_Size / 2 ' ボールの中心を画面の中心に Ball_y = Ball_Size * -1 ' ボールが隠れる位置( 直径ぶん、上辺の上 ) Shapes.Move( Ball_Name, Ball_x, Ball_y ) Sub Ball Ball_y = Ball_y - Ball_Speed If Ball_y > (Ball_Size * -2) Then Shapes.Move( Ball_Name, Ball_x, Ball_y ) ' TextWindow.WriteLine(Ball_y) Else Ball_y = Ball_Size * -1 EndIf EndSub ' ****************************************** ' 四角形 ' ****************************************** GraphicsWindow.BrushColor = "#00ff00" ' 四角形の塗りつぶし色 Rect_Speed = 0.5 Rect_Size = 40 ' 高さ Rect_Name = Shapes.AddRectangle(Rect_Size * 2, Rect_Size) ' 幅は、高さの倍 ' 初期位置 Rect_x = Rect_Size * -2 ' 箱が隠れる位置( 幅ぶん左 ) Rect_y = Rect_Size * 1 ' 箱一個ぶん下 Shapes.Move( Rect_Name, Rect_x, Rect_y ) ' 当たりアニメーション中フラグ Rect_Hit_Flg = 0 ' 0 は、通常時でアニメーション中では無い Sub Rect If Rect_Hit_Flg = 0 then Rect_x = Rect_x + Rect_Speed If Rect_x < LoadImage_width Then Shapes.Move( Rect_Name, Rect_x, Rect_y ) ' TextWindow.WriteLine(Rect_y) Else Rect_x = Rect_Size * -2 EndIf ' 当たり判定用の値を用意する Hit_x = Rect_x Hit_width = Rect_Size * 2 Hit_y = Rect_y Hit_height = Rect_Size ' 当たり判定のチェック Hit() ' 当たり判定からの結果をこちらの条件にセットする Rect_Hit_Flg = Hit_Flg ' 当たっていたら、ボールは先に初期化しておく If Rect_Hit_Flg <> 0 Then Ball_y = Ball_Size * -1 EndIf Else Shapes.Rotate(Rect_Name, 1000 - Rect_Hit_Flg) Rect_Hit_Flg = Rect_Hit_Flg - 1 ' アニメーションが終了すると初期位置に移動 If Rect_Hit_Flg = 0 Then Shapes.Rotate(Rect_Name, 0) Rect_x = Rect_Size * -2 EndIf EndIf EndSub ' ****************************************** ' 当たり判定 ' ****************************************** Sub Hit Hit_Flg = 0 ' 当たり判定は、四角形の居る位置( 高さ ) に、ボールが到達した時で If Hit_y <= Ball_y And Ball_y <= Hit_y + Hit_height Then If Hit_x <= Ball_x + Ball_Size And Ball_x <= Hit_x + Hit_width Then ' アニメーション回数 Hit_Flg = 1000 EndIf EndIf EndSub ' ****************************************** ' キーイベント ' ****************************************** GraphicsWindow.KeyDown = OnKeyDown Sub OnKeyDown If Ball_y <= (Ball_Size * -1) Then Ball_y = LoadImage_height EndIf EndSub ' ****************************************** ' アニメーションループ ' ****************************************** Loop: Program.Delay(1) Ball() Rect() Goto Loop ' ****************************************** ' グラフィックウインドウに画像を表示する ' LoadImage_Url : URL ' LoadImage_Opacity : 不透明度 ' ****************************************** Sub LoadImage If LoadImage_Url <> "" then LoadImage_pic = ImageList.LoadImage(LoadImage_Url) LoadImage_img = Shapes.AddImage(LoadImage_pic) Shapes.SetOpacity(LoadImage_img, LoadImage_Opacity) LoadImage_width = ImageList.GetWidthOfImage(LoadImage_pic) LoadImage_height = ImageList.GetHeightOfImage(LoadImage_pic) Else LoadImage_width = Desktop.Width * 0.8 LoadImage_height = Desktop.Height * 0.8 EndIf GraphicsWindow.Width = LoadImage_width GraphicsWindow.Height = LoadImage_height GraphicsWindow.DrawResizedImage(LoadImage_img, 0, 0, LoadImage_width, LoadImage_height) EndSub
処理の要点 当然ですが、ボール(弾)を増やしたり長方形(敵)を増やしたりする事を想定してサブルーチンを作成しています。その為、Hit サブルーチンは共用する為に専用の判定用座標変数にセットされた値でチェックするようにしています。四角形のアニメーションは、四角形の描画処理と同時持ちして、ボールが当たればボールを自由にして回転アニメーションを開始します。当たった直後、ボールはすぐ使えるようになります。 現実問題として、ボールの処理は単純なので配列で行ったほうがいいでしょう。長方形の処理はいろいろな敵の動作が必要になって来るのでサブルーチン毎の処理が必要になると思います。
タグ:Small Basic
|