2014年9月22日月曜日

戦車ゲーム


基本設定

ゲームスピード
game_speed


弾MAX
ball_max
*/

/*
弾設定

弾の種類
ball_type
1 自分の弾
2 敵の弾
3 味方の弾

弾の角度(radian)
ball_angle_radian

弾の位置
ball_posx
ball_posy

弾の存在・弾の種類など保存
ball_life
*/

/*
自機設定

自機の角度
mainbody_angle

自機の角度(radian)
mainbody_angle_radian

自機の位置
mainbody_posx
mainbody_posy
*/
;自機のスピード
mainbody_acc_speed  =4

;自機の回転スピード
mainbody_acc_anglespeed =int(2.2 * mainbody_acc_speed)
/**/


;初期設定
game_speed=50 ;ゲームスピード
ball_max=50  ;計算できるすべての弾の合計
ball_type=3  ;弾の種類数


;すべて小数点を扱えるようにする(弾丸)
dimtype ball_angle_radian,vartype("double"),ball_max;弾の角度(ラジアン)
dimtype ball_posx,vartype("double"),ball_max  ;弾の位置
dimtype ball_posy,vartype("double"),ball_max
dimtype ball_life,vartype("int"),ball_max,2   ;弾が飛ぶ時間
dimtype ball_type_vol,vartype("int"),ball_type  ;弾の種類別の量

;すべて小数点を扱えるようにする(自機)
dimtype mainbody_angle_radian,vartype("double"),1 ;自機の角度(ラジアン)
dimtype mainbody_posx,vartype("double"),1   ;自機の位置
dimtype mainbody_posy,vartype("double"),1

screen 0,400,400,0:gsel 0,2
mainbody_posx=ginfo(12)/2
mainbody_posy=ginfo(13)/2

gosub *gos_loadsound ;音を読み込む



*mainrepeat   ;メインリピート始まり

redraw 1:await game_speed:redraw 0

gosub *gos_keyget   ;ボタン感知
gosub *gos_mainbody  ;自機関係
gosub *gos_ball   ;弾関係

goto *mainrepeat  ;リピート戻る




;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;弾丸関係

*gos_ball
 gosub *gos_ball_acc  ;弾の計算
 gosub *gos_ball_draw ;弾の表示
 return

*gos_ball_acc ;/////////弾の計算/////////

repeat ball_max
 if ball_life(cnt,1)=0{continue}

 switch ball_life(cnt,0)        ;タイプ別に スピードと飛距離を設定
 case 1 :ball_acc_speed=8 :ball_acc_life=15 :swbreak
 swend

 ball_life(cnt,1)+=1         ;弾がどのくらいで消えるか(飛距離)
 if ball_life(cnt,1) > ball_acc_life {    ;弾消去
  ball_life(cnt,1) = 0
  ball_type_vol(ball_life(cnt,0)) -=1    ;タイプ別の弾の合計数を減らす
            ;弾爆発音
  }
   
 ball_posx(cnt)=ball_posx(cnt)+(sin(ball_angle_radian(cnt))*ball_acc_speed) ;弾の場所を計算
 ball_posy(cnt)=ball_posy(cnt)+(cos(ball_angle_radian(cnt))*ball_acc_speed)
 loop
 return


*gos_ball_add ;/////////弾発行/////////
;弾発行 例
;ball_pub_type=1
;ball_pub_angle=rnd(360)
;ball_pub_posx=100   ;rnd(ginfo(12))
;ball_pub_posy=100   ;rnd(ginfo(13))

;弾の合計数を調節(例 自分の弾は合計4発までしか発行できないなど)
ball_type_max_ch=0:switch ball_pub_type
  case 1
 if ball_type_vol(ball_pub_type)=4:ball_type_max_ch=1
  swbreak
  swend
 if ball_type_max_ch=1:return
 
;弾発行
repeat ball_max
 if ball_life(cnt,1)!0{continue}
 ball_life(cnt,0)=ball_pub_type          ;タイプ発行
 ball_type_vol(ball_life(cnt,0)) +=1         ;タイプ別の弾の合計数を増やす
 ball_life(cnt,1)=1             ;消えるまでのタイム用
 ball_angle_radian(cnt)=3.14159265 * ball_pub_angle / (180.0)  ;ラジアンをここで計算
 ball_posx(cnt)=double(ball_pub_posx)        ;弾の初期位置を実数にして代入
 ball_posy(cnt)=double(ball_pub_posy)
                ;弾発射音
 break
 loop

 return


*gos_ball_draw ;/////////弾の摸写/////////

repeat ball_max
 if ball_life(cnt,1)=0{continue}
 pset int(ball_posx(cnt)),int(ball_posy(cnt))
 loop
 
 return

;弾丸関係
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;自機関係


*gos_mainbody
 gosub *gos_mainbody_acc  ;自機の計算
 gosub *gos_mainbody_draw ;自機の表示
 gosub *gos_mainbody_keyget ;自機から発射される弾のキー調査
 return

*gos_mainbody_acc
 mainbody_angle_radian = 3.14159265 * double(mainbody_angle) / (180.0)
 mainbody_posx=mainbody_posx + ((sin(mainbody_angle_radian(cnt))*mainbody_acc_speed) ) * mainbody_move
 mainbody_posy=mainbody_posy + ((cos(mainbody_angle_radian(cnt))*mainbody_acc_speed) ) * mainbody_move
 return

*gos_mainbody_draw
 pset int(mainbody_posx),int(mainbody_posy)
 return

*gos_mainbody_keyget ;弾発射ボタン
 getkey mainbody_ball,90:if mainbody_ball=1{mainbody_ball_ch=1} ;Z
 getkey mainbody_ball,88:if mainbody_ball=1{mainbody_ball_ch=1} ;X

 if mainbody_ball_ch=1{
  ;弾発行手続き
  ball_pub_type=1
  ball_pub_angle=mainbody_angle
  ball_pub_posx=mainbody_posx
  ball_pub_posy=mainbody_posy
  ;弾発射
  gosub *gos_ball_add
  mainbody_ball_ch=0
  }
 return


;自機関係
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

;基本的なキー操作取得
*gos_keyget
 stick key,1+2+4+8
 mainbody_move=0
 if key&1:mainbody_angle+=mainbody_acc_anglespeed  ;回転
 if key&2:mainbody_move+=1        ;前進
 if key&4:mainbody_angle-=mainbody_acc_anglespeed  ;回転
 if key&8:mainbody_move-=1        ;後進
 return

;音声ファイルの読み込み
*gos_loadsound
 ;発射
 ;爆発
 return
戦車ゲームです。
画像は適当に。

0 件のコメント:

コメントを投稿