2011年12月29日

ロケットを動かす Small Basicの練習

 前回までずっとラケットゲームの改良をやりましたが、限界かなぁ、と思いましたのでいったん終了します。
 ブロック崩しゲームに挑戦しようかな、とも思ったのですが、やはり難しいのでやめました。
 代わりに、昔はやった(30年以上前)インベーダーゲームの超手抜きバージョン(笑)に挑戦してみたいと思います。と言っても、どうやって作ればいいのかさっぱり見当もつきません。
 そこで、今まで作ってきたラケットゲームを土台に、それらしいものに近づけてみたいと思います。(完成まで行けるかどうか分かりません。その時はご容赦を…)
 今日は、まず自分のロケット(宇宙船?)を作ってみました。ただ左右に動くだけで何のゲーム性もありませんふらふら


GraphicsWindow.Title="ロケット自由自在 2011.12.28" …ウィンドウのタイトル表示
GraphicsWindow.BackgroundColor="Black" …バックカラーを黒(宇宙)に設定
'
gw=GraphicsWindow.Width …ウィンドウの幅をgwとする
gh=GraphicsWindow.Height …ウィンドウの高さをghとする
GraphicsWindow.BrushColor="LightSkyBlue" …塗りつぶし色をライトスカイブルーに指定
rbody=Shapes.AddRectangle(22,22) …22×22の四角形をrbodyとする
rtop=Shapes.AddTriangle(0,20,8,0,16,20) …座標(0,20)と座標(8,0)と座標(16,20)を結んだ三角形をrtopとする
rwing=Shapes.AddTriangle(0,25,15,0,30,25) …上と同じように、それぞれの座標を結んだ三角形をrwingとする
rpit=Shapes.AddEllipse(8,15) …横幅を8、縦を15とする楕円をrpitとする
GraphicsWindow.MouseMove=OnMouseMove …マウスに動きがあったら、OnMouseMoveサブルーチンに飛んで処理をする
Sub OnMouseMove …サブルーチン OnMouseMove
  rokettoX=GraphicsWindow.MouseX …マウスのX座標をrokettoXとする
  Shapes.Move(rtop,rokettoX-7,gh-40) …rtopをマウスの先端を中心に描く(動かす)
  Shapes.Move(rwing,rokettoX-14,gh-28) …rwingをマウスの先端を中心に描く(動かす)
  Shapes.Move(rbody,rokettoX-10,gh-25) …rbodyをマウスの先端を中心に描く(動かす)
  Shapes.Move(rpit,rokettoX-3,gh-19) …rpitをマウスの先端を中心に描く(動かす)
EndSub …サブルーチンの終了
 プログラムはこちらから

 ロケットの形は適当に図形を重ねてみました。
---------------------

posted by Shindo Izo at 12:10| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月02日

陰謀ダーゲームを作る Small Basicの練習

 明けましておめでとうございます。低レベルのプログラムしかできませんが、本年もよろしくお願いいたします。

 「ロケットゲーム」ではあまりにつまらない名前なので、某超有名なゲームにひっかけて「陰謀ダーゲーム」にします。「宇宙人の侵略陰謀を打ち砕け!」ってな感じです(笑)。
 と言っても内容は遙かに低レベルなものしかできそうにありません。無理せず自分の身の丈に合ったものをやるしかありません。(途中頓挫の可能性も大)
 さて、今日は、敵宇宙船の登場です。左から出没して右に消えていく、を繰り返すだけです。


GraphicsWindow.Title="陰謀ダーゲーム0.01 2012.1.1 Happy New Year!"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
'
ix=0'…インボーダーのX座標(初期値)
UchuuHyouji()'…宇宙表示サブに飛ぶ

rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,25,15,0,30,25)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
'
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
Loop:'…ループの始まりの標識
'
  '*** インボーダーの動作 ↓ ***
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
  Endif
  '
  ix=ix+.01'…インボーダーのX座標を0.01増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
Goto Loop'…ループの最初へ
'
'*** サブルーチン ↓ ***
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-14,gh-28)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix+5,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix+16,9)'…インボーダーの先端を動かす
EndSub


 プログラムはこちらから (ネット環境によっては表示が不自然になるかも知れません。PC上では問題ありません)

 さて、自軍の宇宙船の弾発射、敵戦艦の反撃、当たり判定、とか一体どうしたらいいのか、…、できるのか自信ありませんが、やれるところまでやっていこうと思っています。
 どうなることやら…、途中でこけたらごめんなさい(汗)たらーっ(汗)
--------------

ラベル:Small Basic
posted by Shindo Izo at 11:07| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月03日

陰謀ダーゲームを作る2 Small Basicの練習

 なんちゃってゲーム、「陰謀ダーゲーム」の続きですわーい(嬉しい顔)
 今日は、自機宇宙船からミサイル発射できるようにしてみました。案の定、頭が混乱してきましたちっ(怒った顔)
 難しいなぁ、と思ったところは、ミサイルを発射した後左クリックしても次の弾が発射できないようにすることでした。いいアイデアが浮かびません。
 しょうがなくフラグというテクを使いました。フラグというのは、ある状況にあるのかないのかの判定に使うものです。今日の場合、

 MissileFlag=1 … ミサイルが飛行中
 MissileFlag=0 … ミサイルが飛行していない時

です。ミサイル飛行中か否かの判定に使っています。ミサイル飛行中は左クリックを押しても次のミサイルは発射できないしくみです。

 プログラムはただミサイルを発射できる(左クリック)だけですので、インボーダーは知らん顔で飛んでます(笑)。緑色の字が新しく加えた、もしくは変更を加えた行です。↓


GraphicsWindow.Title="陰謀ダーゲーム0.02 2012.1.3 Happy New Year!"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
'
ix=0'…インボーダーのX座標(初期値)
MyMissileY=gh'…自機ミサイルの初期Y座標
MMdy=.1 '自機ミサイルの飛行スピード(調整用)
Idx=.01 'インボーダーの移動スピード(調整用)
UchuuHyouji()'…宇宙表示サブに飛ぶ

rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,25,15,0,30,25)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形

'
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
'
OnMouseMove() '初期画面で左上に図形が集中するのを避けるため
Shapes.Move(MyMissile,MyMissileX,MyMissileY) '初期画面で左上に図形が集中するのを避けるため
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'…ループの始まりの標識(メインルーチン)
'
  '*** インボーダーの動作 ↓ ***
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
  Endif
  '
  ix=ix+Idx'…インボーダーのX座標を0.01増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  '*** 自機の動作 ↓ ***
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
   
Goto Loop'…ループの最初へ
'
'-------------------- サブルーチン ↓ ---------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-14,gh-28)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix+5,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix+16,9)'…インボーダーの先端を動かす
EndSub


 プログラムはこちらから

 PC上ではミサイルの速さとかインボーダーの速さがちょうどいいんですが、アップロードしたものは速すぎます。どうやって調整したらいいのか今のところアイデアが浮かびませんふらふら
-------------------
ラベル:Small Basic
posted by Shindo Izo at 18:12| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月05日

陰謀ダーゲームを作る3 Small Basicの練習

 「陰謀ダーゲーム」の続きです。
 今日やったことは:

 1.自機宇宙船からミサイルを発射し、それがインボーダーに当たったかどうか判定
 2.当たった場合、インボーダーを爆発させる

の2点。当たりの判定は以前のラケットゲームと同じなのでそんなに難しくないのですが、爆発のグラフィックが難しかったです。色々試行錯誤してみましたが…。
 爆発した後しばらく表示され、やがて消えていき、ゲーム続行させるあたりがどうもうまいアイデアが浮かびません。(色つきが今日付け足した行)↓


GraphicsWindow.Title="陰謀ダーゲーム0.03 2012.1.4"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
'
ix=0'…インボーダーのX座標(初期値)
MyMissileY=gh'…自機ミサイルの初期Y座標
MMdy=.03 '自機ミサイルの飛行スピード(調整用)
Idx=0.005 'インボーダーの移動スピード(調整用)
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,25,15,0,30,25)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
'
'インボーダー爆発のグラフィック用
GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Red" '塗り色を赤色に
ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円

OnMouseMove() '初期画面で左上に図形が集中するのを避けるため
Shapes.Move(MyMissile,MyMissileX,MyMissileY) '初期画面で左上に図形が集中するのを避けるため
Shapes.Move(ibakuhatu1,ix-35,-50) '爆発用グラフィックをウィンドウの外に出す
Shapes.Move(ibakuhatu2,ix-15,-50) '爆発用グラフィックをウィンドウの外に出す
Shapes.Move(ibakuhatu3,ix-25,-50) '爆発用グラフィックをウィンドウの外に出す
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'…ループの始まりの標識(メインルーチン)
'
  '*** インボーダーの動作 ↓ ***
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
  Endif
  '
  ix=ix+Idx'…インボーダーのX座標を0.01増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  '*** 自機の動作 ↓ ***
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      ix=0 'インボーダーのX座標を0(左端)に戻す
      MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
      Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
      Goto Loop 'メインルーチンに戻る
    Endif
  
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
   
Goto Loop'…ループの最初へ
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-14,gh-28)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウの外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウの外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウの外へ)
EndSub


 プログラムはこちらから
http://smallbasic.com/program/?XCK783

 自機およびインボーダーのスピードをかなり落としましたが、なんか動きがきれいじゃないですね。それと、爆発のグラフィックが表示されるときとされないときがありますね。うーーん、難しいです。PC上でやれば全く問題ないんですが…。ウェイトをかけた方がいいのかな???
 泥縄式でやっているので、段々わけがわからなくなってきました。次はインボーダーにも弾を撃たせてみたいと思っています。複雑になってきて、頭がパンクするかも知れませんふらふら
------------------
posted by Shindo Izo at 20:41| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月11日

陰謀ダーゲームを作る4 Small Basicの練習

 またまた、「陰謀ダーゲーム」の続きです。
 今日やったことは:インボーダーからのミサイル発射と、その他の小さな改良ですが、ついに頭がパンクです(笑)。(色つきが付け足したり、変えたりしたところです)↓


GraphicsWindow.Title="陰謀ダーゲーム0.04 2012.1.7"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
ix=0'…インボーダーのX座標(初期値)
iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
iMissyleY=0'インボーダーのミサイルのY座標を0とする
iMdy=0.03 'インボーダーのミサイルのスピード調整用
MyMissileY=gh'…自機ミサイルの初期Y座標
MMdy=.03 '自機ミサイルの飛行スピード(調整用)
Idx=0.005 'インボーダーの移動スピード(調整用)
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,25,15,0,30,25)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
GraphicsWindow.BrushColor="Chocolate"
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Red" '塗り色を赤色に
ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'初期画面で左上に図形が集中するのを避けるための処理↓
OnMouseMove() 
MymissyleShokika() 'マイミサイルを画面の外に待機させる
iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる

'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'ループの始まりの標識(メインルーチン)
'
  '*** インボーダーの動作 ↓ ***
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の横幅を超えたら以下の処理
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  
  '
  '*** 自機の動作 ↓ ***
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
  
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'   
Goto Loop'…ループの最初へ
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-14,gh-28)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub


プログラムはこちらから

 上記プログラムはウェブ上での使用に合わせてます。PC上では非常に遅いです。
 自分でやっていて何をやっているのか分からなくなってきました。(脳みそが小さいので困ります。)スパゲッティプログラムの典型になりつつあります(汗)。次回はこけているかも知れませんがく〜(落胆した顔)
---------------------
ラベル:Small Basic
posted by Shindo Izo at 21:36| Comment(1) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月13日

陰謀ダーゲームを作る5 Small Basicの練習

 毎度当ブログにお立ち寄りくださいましてありがとうございます。ご参考になるものがあればいいのですが、何せ自己流、デタラメプログラミングですので申し訳ないです。
 私も、Small Basicを使ったプログラミングの講座を検索してみるのですが、なかなか見つけられません。あるにはあるのですが、私には難し過ぎたりします。
 いつか、こんなすばらしいソフトがSmall Basicでもできる、みたいな講座ができるといいですね。

 さて、陰謀ダーゲームのVer.0.05。敵が弾を撃ってきて、自機に当たったら爆発するプログラミングをしてみました。ですが、あまりにも規則的で、簡単に弾を避けられる感じになってしまいました。
 例によってグリーンの文字は今日付け足したところです↓。


GraphicsWindow.Title="陰謀ダーゲーム0.05 2012.1.13"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
Hajimari: '始まりの標識
GraphicsWindow.Clear() 'ウィンドウのクリアー
ix=0'…インボーダーのX座標(初期値)
iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
iMissyleY=0'インボーダーのミサイルのY座標を0とする
iMdy=0.03 'インボーダーのミサイルのスピード調整用
MyMissileY=gh'…自機ミサイルの初期Y座標
MMdy=.03 '自機ミサイルの飛行スピード(調整用)
Idx=0.005 'インボーダーの移動スピード(調整用)
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,25,15,0,30,25)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
GraphicsWindow.BrushColor="Chocolate"
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Red" '塗り色を赤色に
ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'初期画面で左上に図形が集中するのを避けるための処理↓
OnMouseMove() 
MymissyleShokika() 'マイミサイルを画面の外に待機させる
iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'ループの始まりの標識(メインルーチン)
'
  '1.インボーダーの動作 ↓
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-14 And iMissyleX<=rokettoX+14 Then 'もしインボーダーのミサイルが自機に当たる条件を満たしたら以下を処理
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      Goto Hajimari '始まりに戻る
    EndIf
  
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら以下の処理
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  
  '
  '2.自機の動作 ↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
  
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'   
Goto Loop'…ループの最初へ
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-14,gh-28)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub


プログラムはこちらから

 これをどうやってゲームっぽくするのか、今のところ見当もつきません。泥縄式です。
-------------------------------
posted by Shindo Izo at 20:10| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月19日

陰謀ダーゲームを作る5.5 Small Basicの練習

 インボーダー対自機の一騎打ち、までは何とかなりましたが、そこからがやはり難しく頓挫しております。
 段々敵の数を増やしていく、とかインボーダーのミサイルの頻度を増やす、とかインボーダーが段々降りてくる、とか固定基地からも撃ってくる、とか考えたのですがプログラムを組むのが難しそうですし、かなり大きなプログラムになってわけが分からなくなりそうでやめました。
 ない知恵を絞って考えたのが、前に作ったラケットゲームを中に組み込めば面白いんじゃないか、ということです。適当にコピーしてやれるんじゃないか…。ところがこれも簡単ではなく、途中でああでもない、こうでもないとやってます。
 でも、完成したら面白いんじゃないかと思います。インボーダーの攻撃を避けながら、インボーダーを打ち落とし、なおかつ落ちてくるボールも返していかないといけない、って感じになると思うので、ゲームになるんじゃないか、と勝手に想像してます。
 途中経過をアップしたいのですが、ある程度やってしまわないとプログラムが走らないので、今少しずつやってます。
----------------
posted by Shindo Izo at 11:29| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月23日

陰謀ダーゲームを作る6 Small Basicの練習

 いやー、まいりました。ラケットゲームはすでに完成していたので、適当に貼り付ければ何とかなるだろうなどと思っていたのですが、頭が安物で、手こずりました。
 何とか形にしたところです。

 陰謀ダーゲームver.0.06 :インボーダーが撃ってくる弾を避けつつ、ボールを打ち返し、できればインボーダーを打ち落とす、という設定です。今のところ、インボーダーを打ち落としても得点になりません。延々と繰り返すだけのゲームになってます。
 例によって緑の字が新しく付け足したところです。のはずです。(多分)。 説明は、ラケットゲームと重複するので、簡単にしてます。


GraphicsWindow.Title="陰謀ダーゲーム0.06 2012.1.23"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
'ラケットゲーム用
  score=0
  hiscore=0
  'wait=7
  kihonten=10
  bairitu=0
  stage=0
'
Hajimari: '始まりの標識
GraphicsWindow.Clear() 'ウィンドウのクリアー
GraphicsWindow.DrawText(gw/2-30,gh-80,"Stage."+stage)
'
'ラケットゲーム用初期設定↓
scorekaunto()
'wait=wait-1
bairitu=bairitu+1
stage=stage+1
x=Math.GetRandomNumber(gw-16)
y=0
deltaX=.02
deltaY=.02
tenjyou=0
tenjyouatumi=gh/10
'
'インボーダー、自機用初期設定↓
ix=0'…インボーダーのX座標(初期値)
iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
iMissyleY=0'インボーダーのミサイルのY座標を0とする
iMdy=0.03 'インボーダーのミサイルのスピード調整用
MyMissileY=gh'…自機ミサイルの初期Y座標
MMdy=.03 '自機ミサイルの飛行スピード(調整用)
Idx=0.005 'インボーダーの移動スピード(調整用)
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
GraphicsWindow.BrushColor="Chocolate"
iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Red" '塗り色を赤色に
ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
GraphicsWindow.BrushColor="Gold"
ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
OnMouseMove()
MymissyleShokika() 'マイミサイルを画面の外に待機させる
iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'★★★ループの始まりの標識(メインルーチン)★★★
'
  'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-50 Then '天井が下まで来たら…
    Sound.PlayChime()
    Program.Delay(100)
    Goto Hajimari
  EndIf
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y=gh-22 And x>=rakettoX-16 And x<=rakettoX+50) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten
    If score>=hiscore Then '現在スコアーがハイスコアーを越えたら…
      hiscore=score
    EndIf
    ScoreKaunto()
    Sound.PlayClick()
  EndIf
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
  score=0
  bairitu=0
  stage=0
  Goto Hajimari
EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たる条件を満たしたら以下を処理
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      Goto Hajimari '始まりに戻る
    EndIf
 
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら以下の処理
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
  '2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
 
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'  

Goto Loop'…ループの最初へ
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 100'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  Sound.PlayChimeAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
'ラケットゲーム用
  Sub ScoreKaunto 'スコアーを表示するサブ
    GraphicsWindow.FontSize=15
    GraphicsWindow.BrushColor="Black"
    GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
    GraphicsWindow.BrushColor="Orange"
    GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
  EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)
  GraphicsWindow.PenColor="#111130"
  tenjyou=tenjyou+tenjyouatumi
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
EndSub


 プログラムはこちらから

 pc上ではのろーいゲームなんですが、Webにアップするととっても速いゲームになってしまってます。画面の動作も安定しないし…。どうしたら改善するのか今のところ分かりません。
 大したことやってないんですが、段々ながーいプログラムになってきちゃいました。頭が飽和状態ですふらふら
-------------

posted by Shindo Izo at 12:08| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月27日

陰謀ダーゲームを作る7 Small Basicの練習

 陰謀ダーゲームver0.07。何とかゲームっぽくなるようにしました。ですが、まだ全体的に中途半端な状態です。
 ネットにアップすると何故かボールがロケットをすり抜けていまいます。原因は分かりません。PC上では問題なく動きます。
 それと、PCのスピードによってどのぐらい動きが変化するのか(重い感じになるのか、速すぎるゲームになるのか)が分かりません。PCによらないで作る方法は今のところ分かりません。
 緑の文字は今回加えたところ(もしくは変更を加えた所)です。赤の文字は、その数値をいじるとゲームのスピードが変化します。現在の所かなり遅いゲームになってます。(ネット上は速過ぎ)
 


GraphicsWindow.Title="陰謀ダーゲーム0.07 2012.1.27"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
Top:
  'ラケットゲーム用
  score=0
  hiscore=0
  kihonten=10
  bairitu=0
  stage=0
  deltaX=.01
  deltaY=.01
  '
  'インボーダー、自機用
  iMdy=0.02 'インボーダーのミサイルのスピード調整用
  Idx=0.005 'インボーダーの移動スピード(調整用)
  MMdy=.05 '自機ミサイルの飛行スピード(調整用)
'
Hajimari: 'ゲーム始まりの標識-------------------------------
  GraphicsWindow.Clear() 'ウィンドウのクリアー
  '
'ラケットゲーム用初期設定↓
  scorekaunto()
  bairitu=bairitu+1
  stage=stage+1
  GraphicsWindow.DrawText(gw/2-30,gh-80,"Stage."+stage)
  x=Math.GetRandomNumber(gw-16)
  y=0
  If deltaX<0 Then 'deltaXをプラスに変える
    deltaX=-deltaX
  EndIf
  If deltaY<0 Then 'deltaYをプラスに変える
    deltaY=-deltaY
  EndIf
  deltaX=deltaX+.005 'ボールのスピードアップ
  deltaY=deltaY+.005 'ボールのスピードアップ
  tenjyou=0
  tenjyouatumi=gh/10
'
'インボーダー、自機用初期設定↓
  ix=0'…インボーダーのX座標(初期値)
  iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
  iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
  iMissyleY=0'インボーダーのミサイルのY座標を0とする
  iMdy=iMdy+0.005 'インボーダーのミサイルのスピードアップ
  Idx=Idx+.001 'インボーダーの移動スピードアップ
  'MMdy=MMdy+.01 '自機ミサイルの飛行スピードアップ
  MyMissileY=gh'…自機ミサイルの初期Y座標
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
  GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
  rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
  rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
  rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
  rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
  MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
  GraphicsWindow.BrushColor="Chocolate"
  iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
  ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
  itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
  iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
  GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
  ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Red" '塗り色を赤色に
  ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
  ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
  GraphicsWindow.BrushColor="Gold"
  ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
  OnMouseMove()
  MymissyleShokika() 'マイミサイルを画面の外に待機させる
  iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
  Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'★★★ループの始まりの標識(メインルーチン)★★★
'
'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-gh/4 Then '天井が下まで来たら…
    Sound.PlayChime()
    Program.Delay(100)
    Goto Hajimari
  EndIf
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y=gh-22 And x>=rakettoX-18 And x<=rakettoX+52) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten
    If score>=hiscore Then '現在スコアーがハイスコアーを越えたら…
      hiscore=score
    EndIf
    ScoreKaunto()
    Sound.PlayClick()
  EndIf
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
  If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
    GameOverGamen() 'ゲームオーバー
    Goto Top '最初からゲームを始める
  EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーのX座標がウィンドウの幅を超えたら以下の処理をする
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たる条件を満たしたら以下を処理
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      Goto Top 'トップに戻る
    EndIf
 
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら以下の処理
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
'2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
 
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'  
Goto Loop'…ループの最初へ
'
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 130'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  Sound.PlayChimeAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
'ラケットゲーム用
  Sub ScoreKaunto 'スコアーを表示するサブ
    GraphicsWindow.FontSize=15
    GraphicsWindow.BrushColor="Black"
    GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
    GraphicsWindow.BrushColor="Orange"
    GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
  EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)
  GraphicsWindow.PenColor="#221140"
  tenjyou=tenjyou+tenjyouatumi
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
EndSub
'
Sub GameOverGamen 'ゲームオーバー画面
  'GraphicsWindow.Clear()
  GraphicsWindow.DrawText(50,30,"Game Over!")
  GraphicsWindow.DrawText(gw/2-40,60,"Your Score:"+score)
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.DrawText(gw/2-30,90,"Hi-Score:"+hiscore)
  GraphicsWindow.FontSize=20
  If stage=1 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Baby!!!")
  ElseIf stage=2 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Beginner!!!")
  ElseIf stage=3 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Good! But,You are Amateur!!!")
  ElseIf stage=4 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Wow! Wonderful!!!")
  ElseIf stage=5 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Professional!!!")
  ElseIf stage=6 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Maybe,You are Genius!!!")
  ElseIf stage>=7 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Unbelievable! You must be God!")
  Endif
  ' 
  Program.Delay(4000)'@
  '
EndSub


 プログラムはこちらから

 残念ながらボールがロケットをすり抜けてしまうのでゲームになっていません。
------------
ラベル:Small Basic
posted by Shindo Izo at 12:08| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年01月29日

陰謀ダーゲームを作る8 Small Basicの練習

 陰謀ダーゲームver0.08です。かなりゲームっぽくなってきました。ネット上だと速すぎてついて行けませんが、PC上だと私にちょうどよく、結構はまりました。是非やってみてくださいませ。
 今日の改造点は:

1.インボーダーが端に行くまでに打ち落とさないと、ー500点というシステムにしました。
2.ネット上だとボールがロケットをすり抜けてしまうのを改善しました。
3.インボーダーを打ち落としたら、+100点というシステムにしました。
4.得点か減点してら、真ん中に一時的に得点を表示するようにしました。
5.その他細々した点の改善をしました。

 段々長ーいプログラムになってきました。こんなはずじゃなかったんですが…。スパゲッティがもつれて団子になってきました。泥縄式でやらず、ちゃんと設計してやればもうちょっとましになるのでしょうが…。
 以下、緑の字が今回加えた(もしくは変えた)プログラム(のつもりですが、多すぎてわけがわからなくなってきました)。赤はスピード調整用です。↓



GraphicsWindow.Title="陰謀ダーゲーム0.08 2012.1.29"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
hiscore=0
Top:
  'ラケットゲーム用
  score=0
  kihonten=10
  bairitu=0
  stage=0
  deltaX=.01
  deltaY=.01
  '
  'インボーダー、自機用
  iMdy=0.02 'インボーダーのミサイルのスピード調整用
  Idx=0.005 'インボーダーの移動スピード(調整用)
  MMdy=.05 '自機ミサイルの飛行スピード(調整用)
'
Hajimari: 'ゲーム始まりの標識-------------------------------
  GraphicsWindow.Clear() 'ウィンドウのクリアー
  '
'ラケットゲーム用初期設定↓
  scorekaunto()
  bairitu=bairitu+1
  stage=stage+1
  GraphicsWindow.DrawText(gw/2-30,gh-80,"Stage."+stage)
  x=Math.GetRandomNumber(gw-16)
  y=0
  If deltaX<0 Then 'deltaXをプラスに変える
    deltaX=-deltaX
  EndIf
  If deltaY<0 Then 'deltaYをプラスに変える
    deltaY=-deltaY
  EndIf
  deltaX=deltaX+.005 'ボールのスピードアップ
  deltaY=deltaY+.005 'ボールのスピードアップ
  tenjyou=0 
  tenjyouatumi=gh/10 
'
'インボーダー、自機用初期設定↓
  ix=0'…インボーダーのX座標(初期値)
  iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
  iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
  iMissyleY=0'インボーダーのミサイルのY座標を0とする
  iMdy=iMdy+0.005 'インボーダーのミサイルのスピードアップ
  Idx=Idx+.001 'インボーダーの移動スピードアップ
  'MMdy=MMdy+.01 '自機ミサイルの飛行スピードアップ
  MyMissileY=gh'…自機ミサイルの初期Y座標
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
  GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
  rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
  rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
  rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
  rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
  MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
  GraphicsWindow.BrushColor="Chocolate"
  iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
  ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
  itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
  iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
  GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
  ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Red" '塗り色を赤色に
  ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
  ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
  GraphicsWindow.BrushColor="Gold"
  ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
  OnMouseMove() 
  MymissyleShokika() 'マイミサイルを画面の外に待機させる
  iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
  Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'★★★ループの始まりの標識(メインルーチン)★★★
'
'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-gh/4 Then '天井が下まで来たら…
    Sound.PlayChime()
    Program.Delay(100)
    Goto Hajimari
  EndIf 
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y>=gh-22 And x>=rakettoX-18 And x<=rakettoX+52) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten 
    ScoreKaunto()
    Sound.PlayClick()
  EndIf 
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
  If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
    GameOverGamen() 'ゲームオーバー
    Goto Top '最初からゲームを始める
  EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーがウィンドウの幅を超えたら…
    IchijiTokuten=-500
    score=score+IchijiTokuten
    '★
    IchijiTokutenHyouji()
    If score<0 Then
      score=0
    EndIf
    ScoreKaunto()
    '
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たったら…
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      GameOverGamen()
      Goto Top 'トップに戻る
    EndIf
  
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
'2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      score=score+IchijiTokuten
      ScoreKaunto()
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
  
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'   
Goto Loop'…ループの最初へ
'
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji'…宇宙表示サブ
  For i=1 To 130'…100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  IchijiTokuten=100
  IchijiTokutenHyouji()
  'Sound.PlayChimeAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  'Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  '
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
'ラケットゲーム用
Sub ScoreKaunto 'スコアーを表示するサブ
  GraphicsWindow.FontSize=15
  GraphicsWindow.BrushColor="Black"
  GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
  GraphicsWindow.BrushColor="Red"
  GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
  GraphicsWindow.PenColor="#221140" 
  tenjyou=tenjyou+tenjyouatumi 
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)  
EndSub 
'
Sub GameOverGamen 'ゲームオーバー画面
  GraphicsWindow.Clear()
  If score>hiscore Then
    hiscore=score
  EndIf
  GraphicsWindow.BrushColor="HotPink"
  GraphicsWindow.DrawText(50,30,"Game Over!")
  GraphicsWindow.BrushColor="GreenYellow"
  GraphicsWindow.DrawText(gw/2-40,60,"Your Score:"+score)
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.DrawText(gw/2-30,90,"Hi-Score:"+hiscore)
  GraphicsWindow.FontSize=20
  If score<1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Baby!!!")
  ElseIf score<2000 And score>=1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Beginner!!!")
  ElseIf score<3000 And score>=2000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Good! But,You are Amateur!!!")
  ElseIf score<4000 And score>=3000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Wow! Wonderful!!!")
  ElseIf score<5000 And score>=4000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"You are Professional!!!")
  ElseIf score<6000 And score>=5000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Maybe,You are Genius!!!")
  ElseIf score>=7000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2-20,"Unbelievable! You must be God!")
  Endif
  '  
  Program.Delay(4000)'@
  '
EndSub
'
Sub IchijiTokutenHyouji '一時的に得点を表示して消すサブ
  If IchijiTokuten<0 Then
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,IchijiTokuten)
    Sound.PlayChimesAndWait()
  Else
    GraphicsWindow.BrushColor="YellowGreen"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,"+"+IchijiTokuten)
    Sound.PlayChimeAndWait()
  EndIf
  GraphicsWindow.BrushColor="Black"
  GraphicsWindow.FillRectangle(gw/2-30,gh/2-10,50,20)
EndSub
 

プログラムはこちらから


 もうちょっと改善して行きたいと思っています。
----------------------------
ラベル:Small Basic
posted by Shindo Izo at 14:14| Comment(2) | 陰謀ダーゲーム | 更新情報をチェックする

2012年02月01日

陰謀ダーゲームを作る9 Small Basicの練習

 陰謀ダーゲームver0.09。もうそろそろこのゲーム終わりにしたいと思っています。
 かなり遅くしてみましたが、ネットでやると速すぎ、私の運動神経では難し過ぎます。それに不自然に画像が飛んでやりにくいです。もっとスローにし、優しくした方が面白いだろうと思われます。

 今日改善した点は、主に、
インボーダーを打ち落とすとボーナスとして、自機が増える
というものです。
 例によって緑の字が追加した所です(わけが分からなくなってますので、漏れているところもあると思います)。赤字はスピード調整用です。


GraphicsWindow.Title="陰謀ダーゲーム0.09 2012.2.1"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
hiscore=0
Top:
  score=0
  kihonten=10
  bairitu=0
  stage=0
  IchijiTokuten=0 'ボーナス得点やミスによる減点用
  kitaisuu=1 '自機機体数
  ibkaunto=0 'インボーダーの撃墜数
  'ゲームスピード調整用の値(ネット用)↓
    deltaX=.005 'ボール用
    deltaY=.005 'ボール用
    iMdy=0.01 'インボーダーのミサイルのスピード調整用
    Idx=0.002 'インボーダーの移動スピード(調整用)
    MMdy=.02 '自機ミサイルの飛行スピード(調整用)
  'ゲームスピード調整用の値(pc用)↓
    'deltaX=.01 'ボール用
    'deltaY=.01 'ボール用
    'iMdy=0.02 'インボーダーのミサイルのスピード調整用
    ' Idx=0.005 'インボーダーの移動スピード(調整用)
    'MMdy=.05 '自機ミサイルの飛行スピード(調整用)
'
Hajimari: 'ゲーム始まりの標識-------------------------------
  GraphicsWindow.Clear() 'ウィンドウのクリアー
  '
'ラケットゲーム用初期設定↓
  scorekaunto()
  bairitu=bairitu+1 'ステージが進むごとに得点倍率が上がる
  stage=stage+1
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw/2-30,gh-80,"Stage."+stage)
  x=Math.GetRandomNumber(gw-16) 'ボールの初期位置
  y=0 'ボールの初期位置
  If deltaX<0 Then 'deltaXをプラスに変える
    deltaX=-deltaX
  EndIf
  If deltaY<0 Then 'deltaYをプラスに変える
    deltaY=-deltaY
  EndIf
  deltaX=deltaX+.005 'ボールのスピードアップ
  deltaY=deltaY+.005 'ボールのスピードアップ
  tenjyou=0
  tenjyouatumi=gh/10
'
'インボーダー、自機用初期設定↓
  ix=0'…インボーダーのX座標(初期値)
  iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
  iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
  iMissyleY=0'インボーダーのミサイルのY座標を0とする
  'iMdy=iMdy+0.005 'インボーダーのミサイルのスピードアップ
  Idx=Idx+.001 'インボーダーの移動スピードアップ
  'MMdy=MMdy+.01 '自機ミサイルの飛行スピードアップ
  MyMissileY=gh'…自機ミサイルの初期Y座標
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
  GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
  rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
  rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
  rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
  rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
  MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
  GraphicsWindow.BrushColor="Chocolate"
  iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
  ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
  itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
  iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
  GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
  ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Red" '塗り色を赤色に
  ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
  ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
  GraphicsWindow.BrushColor="Gold"
  ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
  OnMouseMove()
  MymissyleShokika() 'マイミサイルを画面の外に待機させる
  iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
  Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
Loop:'★★★ループの始まりの標識(メインルーチン)★★★
'
'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-gh/4 Then '天井が下まで来たら…
    Sound.PlayChimeAndWait()
    Program.Delay(100) 'Net用時間調整@
    Goto Hajimari
  EndIf
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y>=gh-22 And y<=gh-20 And x>=rakettoX-18 And x<=rakettoX+52) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten
    ScoreKaunto()
    Sound.PlayClick()
  EndIf
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
  If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
    GameOverGamen() 'ゲームオーバー
    Goto Top '最初からゲームを始める
  EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーがウィンドウの幅を超えたら…
    IchijiTokuten=-500 '500点減点
    score=score+IchijiTokuten
    IchijiTokutenHyouji()
    If score<0 Then
      score=0 '0点以下にならないようにする
    EndIf
    ScoreKaunto()
    '
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たったら…
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      kitaisuu=kitaisuu-1 '自機数を1減らす
      ScoreKaunto()
      If Kitaisuu=0 Then
        GameOverGamen() '自機数が0ならゲームオーバー
      Else
        iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
        iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
        Goto Loop
      EndIf
      Goto Top 'トップに戻る
    EndIf
 
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
'2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      score=score+IchijiTokuten 'ボーナス得点
      ibkaunto=ibkaunto+1 'インボーダー撃墜数を1増やす
     
      ScoreKaunto()
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
 
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'  
Goto Loop'…ループの最初へ
'
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji '…宇宙表示サブ
  For i=1 To 100 ' …100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightSalmon")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightBlue")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 30 '30この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"Yellow")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
  Shapes.Move(ibakuhatu1,ix-35,-20) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,ix-15,-20) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,ix-25,-10) '爆発用の円3を描く
  IchijiTokuten=100
  IchijiTokutenHyouji()
  'Sound.PlayChimeAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  'Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  '
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh+50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh+50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh+50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub ScoreKaunto 'スコアーを表示するサブ
  GraphicsWindow.FontSize=15
  GraphicsWindow.BrushColor="Black"
  GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
  GraphicsWindow.FillRectangle(gw-150,gh-25,150,20)
  GraphicsWindow.BrushColor="Red"
  GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
  '
  'インボーダーの撃墜数チェック↓
  If ibkaunto=10 Then '10機打ち落としたら
    kitaisuu=kitaisuu+1 '自機数を1増やす
    Sound.PlayBellRing()
    ibkaunto=0 '撃墜数を0にリセット
  EndIf

  'もし撃墜数が10を越えたら自機数1機増加↓
  GraphicsWindow.BrushColor="#00bb00" '緑
  If kitaisuu=1 Then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲")
  ElseIf kitaisuu=2 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲")
  ElseIf kitaisuu=3 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲")
  ElseIf kitaisuu=4 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲")
  ElseIf kitaisuu=5 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲")
  ElseIf kitaisuu=6 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲")
  ElseIf kitaisuu=7 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲")
  ElseIf kitaisuu>=8 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲+")
  EndIf

EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)
  GraphicsWindow.PenColor="#111150"
  tenjyou=tenjyou+tenjyouatumi
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
EndSub
'
Sub GameOverGamen 'ゲームオーバー画面
  GraphicsWindow.Clear()
  GraphicsWindow.BrushColor="Orange"
  If score>hiscore Then
    hiscore=score
    GraphicsWindow.DrawText(10,10,"Wow!! You got hiscore!!!")
  EndIf
  GraphicsWindow.BrushColor="HotPink"
  GraphicsWindow.DrawText(50,40,"Game Over!")
  GraphicsWindow.BrushColor="GreenYellow"
  GraphicsWindow.DrawText(gw/2-40,60,"Your Score:"+score)
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.DrawText(gw/2-30,90,"Hi-Score:"+hiscore)
  GraphicsWindow.FontSize=20
  If score<1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Baby!!! 赤ちゃん!")
  ElseIf score<2000 And score>=1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Beginner!!! ビギナー!")
  ElseIf score<3000 And score>=2000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Good! But,You are Amateur!!! アマチュア!")
  ElseIf score<4000 And score>=3000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Wow! Wonderful!!! すげぇ!")
  ElseIf score<5000 And score>=4000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Professional!!! プロだぁ!")
  ElseIf score<6000 And score>=5000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Maybe,You are Genius!!! 天才!")
  ElseIf score>=6000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Unbelievable! You must be God! 神様だぁ!")
  Endif
  ' 
  Program.Delay(4000)'@
  '
EndSub
'
Sub IchijiTokutenHyouji '一時的に得点を表示して消すサブ
  If IchijiTokuten<0 Then '減点の場合
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,IchijiTokuten)
    Sound.PlayChimesAndWait()
    Program.Delay(100) 'Net用調整時間@
  Else 'ボーナス得点
    GraphicsWindow.BrushColor="YellowGreen"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,"+"+IchijiTokuten)
    Sound.PlayChimeAndWait()
    Program.Delay(100) 'Net用調整時間@
  EndIf
  GraphicsWindow.BrushColor="Black" '消去
  GraphicsWindow.FillRectangle(gw/2-30,gh/2-10,50,20)
EndSub


プログラムはこちらから

 ネットの方は、私は1000点行きません(汗)。PC上では遅すぎて面白くありません。
------------

ラベル:Small Basic
posted by Shindo Izo at 17:14| Comment(5) | 陰謀ダーゲーム | 更新情報をチェックする

2012年02月04日

陰謀ダーゲームを作る10 Small Basicの練習

 Small Basicを始めて、2ヶ月あまりが過ぎました。大分慣れてきましたが、慣れてくるに従って、「ああ、これが出来たらなぁ…」とか「これがやりにくいなぁ…」と思うようにもなってきました。(私のやり方がまずいのかも知れませんが…)
 気になる点:
1.PCとアップロードしたものが同じように動いてくれない
 私のプログラムの組み方が悪いのか、速さとか、タイミングなどが一致せずうまく行きません。時々予期しない動作をしたりします。
2.エディターが使いにくい
 文字の大きさを変えられない、マーキングもできない、日本語を使っていると時々変な動作になるときがある…、etc
3.効果音の数が少ない、音楽が扱えない
 これも私の未熟さ故かも知れません。使えるのかもしれませんがどうしていいのか分かりません。

 でもしょうがないのでしょうね、無料で使わせてもらえるだけありがたいと思うしかありませんね。

 さて、陰謀ダーゲームver.0.10…もうすぐ終わりです。最後の詰めです。今日は、トップ画面を作成してみました。自分のネームも入れました(半分ジョークです)。ゲームスピードもグッと遅くしてみました。
 が、今度は遅すぎてつまらなくなってしまいました。(>_<) その上、「陰謀ダーゲーム」の文字は48ポイントに指定したはずなのに…???
 緑の字が新しく付け加えた所です。赤い字はスピードの調整用です↓。


 GraphicsWindow.Title="陰謀ダーゲーム0.1 2012.2.4"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
GraphicsWindow.KeyDown=GameStart
hiscore=0
OnGame=0 'ゲームに入ったかどうかのフラグ
Top:
  score=0
  kihonten=10
  bairitu=0
  stage=0
  IchijiTokuten=0 'ボーナス得点やミスによる減点用
  kitaisuu=3 '自機機体数
  ibkaunto=0 'インボーダーの撃墜数
  'ゲームスピード調整用の値(ネット用)↓
    deltaX=.0025 'ボール用
    deltaY=.0025 'ボール用
    iMdy=0.005 'インボーダーのミサイルのスピード調整用 
    Idx=0.001 'インボーダーの移動スピード(調整用)
    MMdy=.02 '自機ミサイルの飛行スピード(調整用)
  'ゲームスピード調整用の値(pc用)↓
    'deltaX=.01 'ボール用
    'deltaY=.01 'ボール用
    'iMdy=0.02 'インボーダーのミサイルのスピード調整用
    'Idx=0.005 'インボーダーの移動スピード(調整用)
    'MMdy=.05 '自機ミサイルの飛行スピード(調整用)
'
Hajimari: 'ゲーム始まりの標識-------------------------------
GraphicsWindow.Clear() 'ウィンドウのクリアー
'
'ラケットゲーム用初期設定↓
  scorekaunto()
  bairitu=bairitu+1 'ステージが進むごとに得点倍率が上がる
  stage=stage+1
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw/2-30,gh-80,"Stage."+stage)
  x=Math.GetRandomNumber(gw-16) 'ボールの初期位置
  y=0 'ボールの初期位置
  If deltaX<0 Then 'deltaXをプラスに変える
    deltaX=-deltaX
  EndIf
  If deltaY<0 Then 'deltaYをプラスに変える
    deltaY=-deltaY
  EndIf
  deltaX=deltaX+.0025 'ボールのスピードアップnet
  deltaY=deltaY+.0025 'ボールのスピードアップnet
  tenjyou=0
  tenjyouatumi=gh/10
'
'インボーダー、自機用初期設定↓
  ix=0'…インボーダーのX座標(初期値)
  iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
  iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
  iMissyleY=0'インボーダーのミサイルのY座標を0とする
  'iMdy=iMdy+0.005 'インボーダーのミサイルのスピードアップ
  Idx=Idx+.00025 'インボーダーの移動スピードアップ
  'MMdy=MMdy+.01 '自機ミサイルの飛行スピードアップ
  MyMissileY=gh'…自機ミサイルの初期Y座標
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
  GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
  rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
  rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
  rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
  rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
  MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
  GraphicsWindow.BrushColor="Chocolate"
  iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
  ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
  itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
  iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
  GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
  ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Red" '塗り色を赤色に
  ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
  ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
  GraphicsWindow.BrushColor="Gold"
  ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
  OnMouseMove()
  MymissyleShokika() 'マイミサイルを画面の外に待機させる
  iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
  Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
If OnGame=0 Then 'ゲームに入ってなければ…
  TopGamen() 'トップページ表示サブへ
EndIf
'
'

Loop:'★★★ループの始まりの標識(メインルーチン)★★★
If OnGame=1 Then 'ゲームに入っているなら…
  OnGame=2 'フラグを2に変更
  GraphicsWindow.Clear() '画面消去
  GraphicsWindow.FontSize=48 'フォントサイズを48にする
  GraphicsWindow.BrushColor="Blue" '色をブルーにする
  GraphicsWindow.DrawText(gw/2-160,gh/2-70,"Game Start!") '「Game Start!」表示
  Sound.PlayBellRingAndWait() 'ベルリングを鳴らして一旦ストップ
  Goto Top 'トップへ
EndIf

'
'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-gh/4 Then '天井が下まで来たら…
    Sound.PlayChimeAndWait()
    Program.Delay(100) 'Net用時間調整!!!!!!!!!!!!!!!!!
    Goto Hajimari
  EndIf
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y>=gh-22 And y<=gh-20 And x>=rakettoX-18 And x<=rakettoX+52) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten
    ScoreKaunto()
    Sound.PlayClick()
  EndIf
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
  If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
    GameOverGamen() 'ゲームオーバー
    Goto Top '最初からゲームを始める
  EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーがウィンドウの幅を超えたら…
    IchijiTokuten=-500 '500点減点
    score=score+IchijiTokuten
    IchijiTokutenHyouji()
    If score<0 Then
      score=0 '0点以下にならないようにする
    EndIf
    ScoreKaunto()
    '
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たったら…
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      kitaisuu=kitaisuu-1 '自機数を1減らす
      ScoreKaunto() 'スコアー表示サブへ
      If Kitaisuu=0 Then '自機数が0なら…
        GameOverGamen() 'ゲームオーバー
      Else
        iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
        iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
        Goto Loop
      EndIf
      Goto Top 'トップに戻る
    EndIf
 
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
'2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      score=score+IchijiTokuten 'ボーナス得点
      ibkaunto=ibkaunto+1 'インボーダー撃墜数を1増やす
     
      ScoreKaunto() 'スコアー表示
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
 
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'  
Goto Loop'…ループの最初へ
'
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji '…宇宙表示サブ
  For i=1 To 100 ' …100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightSalmon")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightBlue")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 30 '30この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"Yellow")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
    Shapes.Move(ibakuhatu1,ix-35+i,-20) '爆発用の円1を描く
    Shapes.Move(ibakuhatu2,ix-15+i,-20) '爆発用の円2を描く
    Shapes.Move(ibakuhatu3,ix-25+i,-10) '爆発用の円3を描く
  IchijiTokuten=100
  IchijiTokutenHyouji()
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  '
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh+50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh+50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh+50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub ScoreKaunto 'スコアーを表示するサブ
  GraphicsWindow.FontSize=15
  GraphicsWindow.BrushColor="Black"
  GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
  GraphicsWindow.FillRectangle(gw-150,gh-25,150,20)
  GraphicsWindow.BrushColor="Red"
  GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
  '
  'インボーダーの撃墜数チェック↓
  If ibkaunto=10 Then 'インボーダーを10機打ち落としたら
    kitaisuu=kitaisuu+1 '自機数を1増やす
    Sound.PlayBellRing() 'ベルリングを鳴らす
    ibkaunto=0 '撃墜数を0にリセット
  EndIf

  'もし撃墜数が10を越えたら自機数1機増加↓
  GraphicsWindow.BrushColor="#00bb00" '緑
  If kitaisuu=1 Then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲")
  ElseIf kitaisuu=2 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲")
  ElseIf kitaisuu=3 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲")
  ElseIf kitaisuu=4 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲")
  ElseIf kitaisuu=5 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲")
  ElseIf kitaisuu=6 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲")
  ElseIf kitaisuu=7 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲")
  ElseIf kitaisuu>=8 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲+")
  EndIf
EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)
  GraphicsWindow.PenColor="#111150"
  tenjyou=tenjyou+tenjyouatumi
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
EndSub
'
Sub GameOverGamen 'ゲームオーバー画面
  GraphicsWindow.Clear()
  GraphicsWindow.FontSize=20
  GraphicsWindow.BrushColor="Orange"
  If score>hiscore Then 'もしハイスコアーなら
    hiscore=score '現在スコアーをハイスコアーに
    GraphicsWindow.DrawText(10,10,"Wow!! You got hiscore!!!")
  EndIf
  GraphicsWindow.BrushColor="HotPink"
  GraphicsWindow.DrawText(50,40,"Game Over!")
  GraphicsWindow.BrushColor="GreenYellow"
  GraphicsWindow.DrawText(gw/2-40,60,"Your Score:"+score)
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.DrawText(gw/2-30,90,"Hi-Score:"+hiscore)
  GraphicsWindow.FontSize=20
  If score<1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Baby!!! 赤ちゃん!")
  ElseIf score<2000 And score>=1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Beginner!!! ビギナー!")
  ElseIf score<3000 And score>=2000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Good! But,You are Amateur!!! アマチュア!")
  ElseIf score<4000 And score>=3000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Wow! Wonderful!!! すげぇ!")
  ElseIf score<5000 And score>=4000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Professional!!! プロだぁ!")
  ElseIf score<6000 And score>=5000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Maybe,You are Genius!!! 天才!")
  ElseIf score>=6000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Unbelievable! You must be God! 神様だぁ!")
  Endif
  ' 
  Program.Delay(4000)
  OnGame=0
  '
EndSub
'
Sub IchijiTokutenHyouji '一時的に得点を表示して消すサブ
  If IchijiTokuten<0 Then '減点の場合
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,IchijiTokuten)
    Sound.PlayChimesAndWait()
    Program.Delay(100) 'Net用調整時間!!!!!!!!!!!!!!!!!!!!!!!!!!!
  Else 'ボーナス得点
    GraphicsWindow.BrushColor="YellowGreen"
    GraphicsWindow.DrawText(gw/2-30,gh/2-10,"+"+IchijiTokuten)
    Sound.PlayChimeAndWait()
    'Program.Delay(100) 'Net用調整時間!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  EndIf
  GraphicsWindow.BrushColor="Black" '色を黒に
  GraphicsWindow.FillRectangle(gw/2-30,gh/2-10,50,20) '消去
EndSub
'
Sub GameStart '何かキーを押された場合の処理
  If OnGame=0 Then 'ゲームにまだ入ってないなら
    OnGame=1 'ゲーム中にする(フラグを1に)
  EndIf
EndSub

'
Sub TopGamen 'トップページ表示サブ
  GraphicsWindow.FontSize=48
  GraphicsWindow.BrushColor="Blue"
  GraphicsWindow.DrawText(gw/2-167,gh/2-77,"陰謀ダーゲーム")
  GraphicsWindow.BrushColor="CadetBlue"
  GraphicsWindow.DrawText(gw/2-170,gh/2-80,"陰謀ダーゲーム")
  GraphicsWindow.BrushColor="Gold"
  GraphicsWindow.FontSize=20
  GraphicsWindow.DrawText(gw/2-110,gh/2+20,"Push anykey to start")
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.FontSize=15
  GraphicsWindow.DrawText(gw/2-70,gh/2+70,"(C) iZo Arts Japan") '←ジョークです
EndSub


プログラムはこちらから

 何か、今回も変な動きです。ゲームスピードの調整がよく分かりません。このままPCでやるととんでもなく遅いゲームになってしまいます。ちっ(怒った顔)

 ブログアップ後の追伸
  今一度やってみたら、キーを押してもゲームに入りません。原因不明です。PC上では問題ないんですが(コンパイルしても問題なし)、何故かネット上ではダメです。もうやだ〜(悲しい顔)
--------------------
ラベル:Small Basic
posted by Shindo Izo at 20:56| Comment(0) | 陰謀ダーゲーム | 更新情報をチェックする

2012年02月06日

陰謀ダーゲームを作る11 Small Basicの練習

 陰謀ダーゲームver.0.11です。
 今まで、ネット上を想定して作ってきましたが諦めることにします。PC上ではスムーズに動くのに、ネットにアップするとガタガタになってしまいます。
 今日は、PCでゲームをやることに焦点を合わせて改良してみました。大筋はほとんど変わらず、ゲームとして面白くなるようにスピードの調整です。
 オンラインではガタガタですが、PC上では問題は今のところ見つかりません。自画自賛になってしまいますが、結構はまりました。(お使いのPCにより異なるかも知れませんが)
 緑の字が今回付け足した所で、赤字はスピード調整用です(もしPCでスピードがおかしい場合、ここを調整してください)↓


GraphicsWindow.Title="陰謀ダーゲーム0.11 by iZo Arts 20120206"'…ウィンドウタイトル
GraphicsWindow.BackgroundColor="Black"'…バックが黒
GraphicsWindow.FontSize=18
'
gw=GraphicsWindow.Width'…ウィンドウの幅:gw
gh=GraphicsWindow.Height'…ウィンドウの高さ:gh
'
GraphicsWindow.KeyDown=GameStart
hiscore=0
OnGame=0
Top:
  score=0
  kihonten=10
  bairitu=0
  stage=0
  IchijiTokuten=0 'ボーナス得点やミスによる減点用
  kitaisuu=3 '自機機体数
  ibkaunto=0 'インボーダーの撃墜数
  '
  'ゲームスピード調整用の値(pc用)◆↓
    deltaX=.02 'ボール用
    deltaY=.02 'ボール用
    iMdy=0.03 'インボーダーのミサイルのスピード調整用
    Idx=0.0075 'インボーダーの移動スピード(調整用)
    MMdy=.05 '自機ミサイルの飛行スピード(調整用)
'
Hajimari: 'ゲーム始まりの標識-------------------------------
GraphicsWindow.Clear() 'ウィンドウのクリアー
'
'ラケットゲーム用初期設定↓
  scorekaunto()
  bairitu=bairitu+1 'ステージが進むごとに得点倍率が上がる
  stage=stage+1
  GraphicsWindow.FontSize=24
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw/2-45,gh-80,"Stage."+stage)
  x=Math.GetRandomNumber(gw-16) 'ボールの初期位置
  y=0 'ボールの初期位置
  If deltaX<0 Then 'deltaXをプラスに変える
    deltaX=-deltaX
  EndIf
  If deltaY<0 Then 'deltaYをプラスに変える
    deltaY=-deltaY
  EndIf
  '
  deltaX=deltaX+.005 'ボールのスピードアップ◆
  deltaY=deltaY+.005 'ボールのスピードアップ◆
  '
  tenjyou=0 
  tenjyouatumi=gh/10 
'
'インボーダー、自機用初期設定↓
  ix=0'…インボーダーのX座標(初期値)
  iMissyleX0=gw/4'インボーダーのミサイルの発射開始される初期位置(X座標)
  iMissyleX=iMissyleX0'インボーダーのミサイルのX座標をiMissyleX0とする
  iMissyleY=0'インボーダーのミサイルのY座標を0とする
  '
  iMdy=iMdy+0.005 'インボーダーのミサイルのスピードアップ◆
  Idx=Idx+.0005 'インボーダーの移動スピードアップ◆
  '
  'MMdy=MMdy+.01 '自機ミサイルの飛行スピードアップ
  MyMissileY=gh'…自機ミサイルの初期Y座標
'
UchuuHyouji()'…宇宙表示サブに飛ぶ
'
'自機のグラフィック
  GraphicsWindow.BrushColor="Cyan"'…塗り色:青緑
  rbody=Shapes.AddRectangle(22,22)'…ロケットのボディの形
  rtop=Shapes.AddTriangle(0,20,8,0,16,20)'…ロケットのトップの形
  rwing=Shapes.AddTriangle(0,20,25,0,50,20)'…ロケットの翼の形
  rpit=Shapes.AddEllipse(8,15)'…ロケットのコックピットの形
  MyMissile=Shapes.AddRectangle(10,20)'…自機ミサイルの形
'
'インボーダーのグラフィック
  GraphicsWindow.BrushColor="Chocolate"
  iwing=Shapes.AddTriangle(0,0,20,20,40,0)'…インボーダーの翼の形
  ibody=Shapes.AddEllipse(30,16)'…インボーダーのボディの形
  itop=Shapes.AddTriangle(0,0,4,20,8,0)'…インボーダーの先の形
  iMissyle=Shapes.AddRectangle(8,20)
'
'インボーダー爆発のグラフィック用↓
  GraphicsWindow.BrushColor="Yellow" '塗り色を黄色に
  ibakuhatu1=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Red" '塗り色を赤色に
  ibakuhatu2=Shapes.AddEllipse(50,50) '直径50の円
  GraphicsWindow.BrushColor="Orange" '塗り色をオレンジ色に
  ibakuhatu3=Shapes.AddEllipse(50,50) '直径50の円
'
'ラケットゲームグラフィック用
  GraphicsWindow.BrushColor="Gold"
  ball=Shapes.AddEllipse(16,16)
'
'初期画面で左上に図形が集中するのを避けるための処理↓
  OnMouseMove() 
  MymissyleShokika() 'マイミサイルを画面の外に待機させる
  iMissyleShokika() 'インボーダーのミサイルを画面の外に待機させる
  Shapes.Move(ibakuhatu1,ix-35,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu2,ix-15,-50) '爆発画像を画面の外の待機させる
  Shapes.Move(ibakuhatu3,ix-25,-50) '爆発画像を画面の外の待機させる
'
GraphicsWindow.MouseMove=OnMouseMove'…マウスに動きがあったらOnMouseMoveサブへ飛ぶ
'
If OnGame=0 Then
  TopGamen()
EndIf
'
'
Loop:'★★★ループの始まりの標識(メインルーチン)★★★
If OnGame=1 Then
  OnGame=2
  GraphicsWindow.Clear()
  GraphicsWindow.FontSize=48 'フォントサイズを48にする
  GraphicsWindow.BrushColor="Blue" '色をブルーにする
  GraphicsWindow.DrawText(gw/2-150,gh/2-50,"Game Start!") '「Game Start!」表示
  Sound.PlayBellRingAndWait()
  Goto Top 
EndIf
'
'ラケットゲームの処理↓
  x=x+deltaX
  y=y+deltaY
  '
  If tenjyou>=gh-gh/4 Then '天井が下まで来たら…
    Sound.PlayChime()
    Goto Hajimari
  EndIf 
  '
  If(x>gw-16 Or x<=0) Then 'ボールが横の壁に当たったら…
    deltaX=-deltaX
  EndIf
  If(y<=tenjyou) Then 'ボールが天井を越えたら…
    deltaY=-deltaY
  EndIf
  '
  rakettoX=Shapes.GetLeft(rwing) 'ラケットの位置を取得
  If(y>=gh-22 And y<=gh-20 And x>=rakettoX-18 And x<=rakettoX+52) Then 'ボールがラケットに当たったら…
    deltaY=-deltaY
    tenjyouRakka()
    '
    score=score+bairitu*kihonten
    ScoreKaunto()
    Sound.PlayClick()
  EndIf 
  '
  Shapes.Move(ball,x,y) 'ボールを動かす
  '
  If(y>=gh) Then 'ボールが画面の底(下)を越えたら…
    If OnGame=0 then 'ゲームがスタートしてなければ…
      deltaY=-deltaY 'ボールの方向反対にする
      Goto Loop
    EndIf
    GameOverGamen() 'ゲームオーバー
    Goto Top '最初からゲームを始める
  EndIf
'
'1.インボーダーの動作↓
  '
  If ix>=gw Then'…もしインボーダーがウィンドウの幅を超えたら…
    IchijiTokuten=-500 '500点減点
    score=score+IchijiTokuten
    IchijiTokutenHyouji()
    If score<0 Then
      score=0 '0点以下にならないようにする
    EndIf
    ScoreKaunto()
    '
    ix=0'…インボーダーのX座標を0にする(最初に戻る)
    iMissyleShokika() 'インボーダーのミサイル初期化サブへ飛ぶ
  EndIf
  '
  ix=ix+Idx'…インボーダーのX座標をIdx分増やす(インボーダーのスピード調整)
  InvoderMove()'…インボーダーを動かすサブに飛ぶ
  '
  If ix>=iMissyleX0 Then 'もしインボーダーのX座標がiMissyleX0を超えたら以下を処理
    If iMissyleY>=gh-40 And iMissyleX>=rokettoX-25 And iMissyleX<=rokettoX+25 Then 'もしインボーダーのミサイルが自機に当たったら…
      RokettoBakuhatu() '自機の爆発サブに飛ぶ
      kitaisuu=kitaisuu-1 '自機数を1減らす
      ScoreKaunto()
      If Kitaisuu=0 Then
        GameOverGamen() '自機数が0ならゲームオーバー
      Else
        iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
        iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
        Goto Loop
      EndIf
      Goto Top 'トップに戻る
    EndIf
  
    If iMissyleY>=gh Then 'もしインボーダーのミサイルのY座標が画面の縦幅を超えたら
      iMissyleX=ix 'インボーダーミサイルのX座標をインボーダーのX座標とする
      iMissyleY=0 'インボーダーミサイルのY座標を0(画面の一番上)にする
    EndIf
    '
    Shapes.Move(iMissyle,iMissyleX,iMissyleY) 'インボーダーミサイルを座標(iMissylex,iMissyleY)に移動する
    iMissyleY=iMissyleY+iMdy 'インボーダーミサイルのY座標の値を増やす(ミサイルが下がる)
  Endif
  '
'2.自機の動作↓
  '
  If MissileFlag=1 Then '自機ミサイルが飛行中なら以下の処理
    If MyMissileY<=15 And MyMissileX>=ix-20 And MyMissileX<=ix+20 Then 'もしミサイルのY座標が15以下で、X座標がインボーダーの機体範囲内なら以下を処理する
      InvoderBakuhatu() 'インボーダー爆発サブへ飛ぶ
      score=score+IchijiTokuten 'ボーナス得点
      ibkaunto=ibkaunto+1 'インボーダー撃墜数を1増やす
      
      ScoreKaunto()
      '
      MymissyleShokika() '自機ミサイル初期化サブへ飛ぶ
      '
      ix=0 'インボーダーのX座標を0(左端)に戻す
      iMissyleShokika() 'インボーダーミサイル初期化サブへ飛ぶ
      '
      Goto Loop 'メインルーチンに戻る
    Endif
  
    If MyMissileY<=0 then 'もし自機ミサイルのY座標が15以下になら以下の処理
      MissileFlag=0 '自機ミサイル飛行終了とする
      MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
    EndIf
    Shapes.Move(MyMissile,MyMissileX-5,MyMissileY) '自機ミサイルを座標(MyMissileX,MyMissileY)に移動
    MyMissileY=MyMissileY-MMdy '自機ミサイルのY座標からMMdyを引く(ミサイルが前進する)
    Goto Loop 'Loopの最初に戻る
  EndIf
  If Mouse.IsLeftButtonDown Then 'もしマウスの左ボタンが押されたら以下の処理
    MissileFlag=1 'ミサイル飛行中宣言
    MyMissileX=GraphicsWindow.MouseX '自機ミサイルのX座標をマウスのX座標とする
  EndIf
'   
Goto Loop'…ループの最初へ
'
'
'-------------------- サブルーチン ↓ -------------------------------
'
Sub OnMouseMove'…マウスに動きがあった時のサブ
  rokettoX=GraphicsWindow.MouseX'…マウスの位置(X座標)
  Shapes.Move(rtop,rokettoX-7,gh-40)'…ロケットの先端を動かす
  Shapes.Move(rwing,rokettoX-24,gh-22)'…ロケット翼を動かす
  Shapes.Move(rbody,rokettoX-10,gh-25)'…ロケットのボディを動かす
  Shapes.Move(rpit,rokettoX-3,gh-19)'…ロケットのコックピットを動かす
EndSub
'
Sub UchuuHyouji '…宇宙表示サブ
  For i=1 To 100 ' …100回繰り返す(100この星)
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"White")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightSalmon")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 50 '50この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"LightBlue")'…座標(hx,hy)のピクセルを白にする
  EndFor
  For i=1 To 30 '30この星
    hx=Math.GetRandomNumber(gw)'…星のX座標(乱数)
    hy=Math.GetRandomNumber(gh)'…星のY座標(乱数)
    GraphicsWindow.SetPixel(hx,hy,"Yellow")'…座標(hx,hy)のピクセルを白にする
  EndFor
EndSub
'
Sub InvoderMove'…インボーダーの動きサブ
  Shapes.Move(iwing,ix-20,0)'…インボーダーの翼を動かす
  Shapes.Move(ibody,ix-15,0)'…インボーダーのボディを動かす
  Shapes.Move(itop,ix-4,9)'…インボーダーの先端を動かす
EndSub
'
Sub InvoderBakuhatu 'インボーダーの爆発表示サブ
    Shapes.Move(ibakuhatu1,ix-35+i,-20) '爆発用の円1を描く
    Shapes.Move(ibakuhatu2,ix-15+i,-20) '爆発用の円2を描く
    Shapes.Move(ibakuhatu3,ix-25+i,-10) '爆発用の円3を描く
  IchijiTokuten=100
  IchijiTokutenHyouji()
  Shapes.Move(ibakuhatu1,ix-35,-50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,ix-15,-50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,ix-25,-50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub MymissyleShokika '自機ミサイル初期化サブ
  MissileFlag=0 'ミサイル飛行フラグを降ろす(飛んでいない状態とする)
  MyMissileY=gh '自機ミサイルのY座標をウィンドウの一番下にする
  Shapes.Move(MyMissile,MyMissileX,MyMissileY) '画面から消す
EndSub
'
Sub iMissyleShokika 'インボーダーミサイル初期化サブ
  iMissyleX0=Math.GetRandomNumber(gw/4) 'ミサイル発射のX座標をランダムに決める(画面の1/4以下)
  iMissyleX=iMissyleX0 'ミサイルの位置(X座標)をiMissyleX0とする
  iMissyleY=0 'Y座標を0とする
  Shapes.Move(iMissyle,iMissyleX,iMissyleY-50) '画面の外に放り出す
EndSub
'
Sub RokettoBakuhatu '自機ロケットの爆発表示サブ
  Shapes.Move(ibakuhatu1,rokettoX-35,gh-35) '爆発用の円1を描く
  Shapes.Move(ibakuhatu2,rokettoX-15,gh-35) '爆発用の円2を描く
  Shapes.Move(ibakuhatu3,rokettoX-25,gh-25) '爆発用の円3を描く
  '
  Sound.PlayChimesAndWait() 'チャイムを鳴らし、鳴り終わるまで待つ
  Program.Delay(1000) '待ち時間を作る
  Shapes.Move(ibakuhatu1,rokettoX-35,gh+50) '発爆用の円1消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu2,rokettoX-15,gh+50) '発爆用の円2消去(ウドンィウ外へ)
  Shapes.Move(ibakuhatu3,rokettoX-25,gh+50) '発爆用の円3消去(ウドンィウ外へ)
EndSub
'
Sub ScoreKaunto 'スコアーを表示するサブ
  GraphicsWindow.FontSize=15
  GraphicsWindow.BrushColor="Black"
  GraphicsWindow.FillRectangle(gw-220,gh-50,200,20)
  GraphicsWindow.FillRectangle(gw-150,gh-25,150,20)
  GraphicsWindow.BrushColor="Red"
  GraphicsWindow.DrawText(gw-220,gh-50,"Score:"+score)
  GraphicsWindow.BrushColor="Orange"
  GraphicsWindow.DrawText(gw-120,gh-50,"Hi-score:"+hiscore)
  '
  'インボーダーの撃墜数チェック↓
  If ibkaunto=10 Then '10機打ち落としたら
    kitaisuu=kitaisuu+1 '自機数を1増やす
    Sound.PlayBellRing()
    ibkaunto=0 '撃墜数を0にリセット
  EndIf

  'もし撃墜数が10を越えたら自機数1機増加↓
  GraphicsWindow.BrushColor="#00bb00" '緑
  If kitaisuu=1 Then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲") 
  ElseIf kitaisuu=2 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲")
  ElseIf kitaisuu=3 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲") 
  ElseIf kitaisuu=4 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲")
  ElseIf kitaisuu=5 then
     GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲") 
  ElseIf kitaisuu=6 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲") 
  ElseIf kitaisuu=7 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲")
  ElseIf kitaisuu>=8 then
    GraphicsWindow.DrawText(gw-150,gh-25,"▲▲▲▲▲▲▲+")
  EndIf
EndSub
  '
Sub TenjyouRakka 'ボールの跳ね返る天井表示サブ
  GraphicsWindow.PenColor="Black"
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou) 
  GraphicsWindow.PenColor="#111150" 
  tenjyou=tenjyou+tenjyouatumi 
  GraphicsWindow.DrawLine(0,tenjyou,gw,tenjyou)  
EndSub 
'
Sub GameOverGamen 'ゲームオーバー画面
  GraphicsWindow.Clear()
  GraphicsWindow.FontSize=20
  GraphicsWindow.BrushColor="Orange"
  If score>hiscore Then
    hiscore=score
    GraphicsWindow.DrawText(10,10,"Wow!! You got hiscore!!!")
  EndIf
  GraphicsWindow.BrushColor="HotPink"
  GraphicsWindow.DrawText(50,40,"Game Over!")
  GraphicsWindow.BrushColor="GreenYellow"
  GraphicsWindow.DrawText(gw/2-40,60,"Your Score:"+score)
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.DrawText(gw/2-30,90,"Hi-Score:"+hiscore)
  GraphicsWindow.FontSize=20
  If score<1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Baby!!! 赤ちゃん!")
  ElseIf score<2000 And score>=1000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Beginner!!! ビギナー!")
  ElseIf score<3000 And score>=2000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Good! But,You are Amateur!!! アマチュア!")
  ElseIf score<4000 And score>=3000 Then
    Sound.PlayBellRingAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Wow! Wonderful!!! すげぇ!")
  ElseIf score<5000 And score>=4000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"You are Professional!!! プロだぁ!")
  ElseIf score<6000 And score>=5000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Maybe,You are Genius!!! 天才!")
  ElseIf score>=6000 Then
    Sound.PlayChimesAndWait()
    GraphicsWindow.DrawText(gw/2-150,gh/2+20,"Unbelievable! You must be God! 神様だぁ!")
  Endif
  '  
  Program.Delay(3000)
  OnGame=0
  '
EndSub
'
Sub IchijiTokutenHyouji '一時的に得点を表示して消すサブ
  GraphicsWindow.FontSize=42
  If IchijiTokuten<0 Then '減点の場合
    GraphicsWindow.BrushColor="Red"
    GraphicsWindow.DrawText(gw/2-60,gh/2-30,IchijiTokuten)
    Sound.PlayChimesAndWait()
    Program.Delay(400)
  Else 'ボーナス得点
    GraphicsWindow.BrushColor="YellowGreen"
    GraphicsWindow.DrawText(gw/2-60,gh/2-30,"+"+IchijiTokuten)
    Sound.PlayChime()
    Program.Delay(1000)
  EndIf
  GraphicsWindow.BrushColor="Black" '消去
  GraphicsWindow.FillRectangle(gw/2-60,gh/2-30,115,45)
EndSub
'
Sub GameStart '何かキーを押したらゲームスタート
  If OnGame=0 Then
    OnGame=1
  EndIf
EndSub
'
Sub TopGamen 'トップ画面表示
  GraphicsWindow.FontSize=48
  GraphicsWindow.BrushColor="Blue"
  GraphicsWindow.DrawText(gw/2-167,gh/2-77,"陰謀ダーゲーム")
  GraphicsWindow.BrushColor="CadetBlue"
  GraphicsWindow.DrawText(gw/2-170,gh/2-80,"陰謀ダーゲーム")
  GraphicsWindow.BrushColor="Gold"
  GraphicsWindow.FontSize=20
  GraphicsWindow.DrawText(gw/2-110,gh/2+20,"Press Anykey to START")
  GraphicsWindow.BrushColor="White"
  GraphicsWindow.FontSize=9
  GraphicsWindow.DrawText(gw/2-70,gh/2+45,"何かキーを押すとスタートします")
  GraphicsWindow.FontSize=15
  GraphicsWindow.DrawText(gw/2-70,gh/2+80,"(C) iZo Arts Japan")  
EndSub


プログラムはSmall Basicのエディタからインポートできます↓。

 プログラムID番号=JHV957

 長らくやってまいりました、「陰謀ダーゲーム」、とりあえず今回で終了にしようと思います。長らくお付き合い下さいましてありがとうございました。
 m(_ _)m
---------------
posted by Shindo Izo at 11:57| Comment(1) | 陰謀ダーゲーム | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。