🌸 「なでしこ」
>
🍯 「貯蔵庫」
いろいろ避けつつ撃つゲーム(キーボードとゲームパッド対応)
🌟新規
📒一覧
🔌
🔍検索
🚪ログイン
いろいろ避けつつ撃つゲーム(キーボードとゲームパッド対応) 📖
キーボードとゲームパッドの併用のサンプル。任意方向スクロール。UFO倒すと点高い。
プログラム:
(→大)
画面横は描画中キャンバス["width"] 画面縦は描画中キャンバス["height"] 中心は{ X:画面横÷2, Y:画面縦÷2 } 自サイズは24 自回転は45 自向きは270 自速さは1.5 自回転速さは8.0 敵サイズは12 敵視界は300 敵船サイズは16 敵船視界は150 隕石サイズは12 爆発サイズは24 弾サイズは{半径:3} 自弾サイズは{長:4, 太:1} 自文字は「🚀」 敵文字は「👾」 敵船文字は「🛸」 隕石文字は「🥔」 爆発文字は「💥」 進入禁止幅は24 スコアは0 スコアタイマは0 エンカウンターは0 ゲームオーバーフラグはオフ # キーコード/コードとボタン番号のマッピング表 # 主ボタンは、0-3がいわゆるボタン、12-15が上下左右 キーマッピングは{ ArrowDown:13, ArrowRight:15, ArrowLeft:14, ArrowUp:12, "40":13, "39":15, "37":14, "38":12, "KeyZ":0, "KeyX":1, "KeyA":2, "KeyS":3, "90":0, "89":1, "65":2, "83":3, "Escape":-1, "27":-1 } 描画中はオフ 敵群は[] 敵船群は[] 自弾群は[] 敵弾群は[] 隕石群は[] 爆発中は[] 背景星は[] キャンバスIDは描画中キャンバス["id"] CTXは描画中コンテキスト 枠モードは0 基準日時は0 前回日時は0 経過時間は0 経過レートは1.0 tidは-1 fidは-1 画面描画フレームデリゲートは「画面描画フレーム」のJSオブジェクト取得 宇宙サイズは25000 実体化サイズは1500 もし、画面横>画面縦ならば、 実体化サイズは画面横÷2×1.2 違えば、 実体化サイズは画面縦÷2×1.2 ここまで 向きはDEG2RAD(自向き) 自機は{ X:0, Y:0, R:自向き, TR:自向き, 速:自速さ, 回速:自回転速さ, サイズ:自サイズ, DX:COS(向き)×自速さ, DY:SIN(向き)×自速さ } # 描画高速化機能 文字描画準備文字列は『 ctx.save(); if (size) { ctx.font=""+size+"px sans- serif"; } ctx.textAlign="center"; ctx.textBaseline="middle"; 』 文字描画文字列は『 ctx.save(); ctx.translate(tgt.X-self.X+ctr.X,tgt.Y-self.Y+ctr.Y); if (tgt.R != null) { const r=tgt.R*(Math.PI/180); ctx.rotate(r); } ctx.fillText(c,0,0); ctx.restore(); 』 文字描画復帰文字列は『 ctx.restore(); 』 文字描画準備関数は"ctx,size"と文字描画準備文字列でJS関数作成 文字描画関数は"ctx,self,tgt,ctr,c"と文字描画文字列でJS関数作成 文字描画復帰関数は"ctx"と文字描画復帰文字列でJS関数作成 単文字描画文字列は『 ctx.save(); if (tgt["サイズ"]) { ctx.font=""+tgt["サイズ"]+"px sans- serif"; } ctx.textAlign="center"; ctx.textBaseline="middle"; ctx.translate(ctr.X,ctr.Y); if (tgt.R != null) { const r=(tgt.R+rmod)*(Math.PI/180); ctx.rotate(r); } ctx.fillText(c,0,0); ctx.restore(); 』 単文字描画関数は"ctx,tgt,ctr,rmod,c"と単文字描画文字列でJS関数作成 開始する。 ●開始とは 描画中キャンバスをクリックした時には、 もし、描画中でなければ、 ゲームスタート ここまで ここまで 描画中キャンバスの「背景色」に黒色をDOMスタイル設定。 初期画面描画 ここまで ●ゲームスタートとは 描画中キャンバスにキーパッドイベント設定 ゲームパッドイベント設定 描画中はオン 星準備 基準日時は「Date.now()」をJS実行 処理予約 ここまで ●(値を下限から上限で)範囲制限とは もし、値>上限ならば、 値は上限 違えばもし、値<下限ならば、 値は下限 ここまで 値で戻る ここまで ●(値を下限から上限で)範囲ループとは もし、値>上限ならば、 値は下限+値-上限 違えばもし、値<下限ならば、 値は上限-(下限-値) ここまで 値で戻る ここまで ●星準備とは (実体化サイズ×実体化サイズ÷1000)回、 Xは((実体化サイズ×2)の乱数)-実体化サイズ Yは((実体化サイズ×2)の乱数)-実体化サイズ 星は{ X:X, Y:Y, 向:0, 速:0.5, DX:0, DY:0, サイズ: 1 } 背景星に星を配列追加 ここまで ここまで ●(群を)進行処理とは 個体数は群の配列要素数 (個体数)回、 個体は群[個体数-回数] 個体["X"]は個体["X"]+個体["DX"]×経過レート 個体["Y"]は個体["Y"]+個体["DY"]×経過レート もし、個体["R"]=NULLでなければ、 もし、(個体["DR"]の変数型確認)が"undefined"でなければ、 個体["R"]は個体["R"]+個体["DR"]×経過レート もし、個体["R"]<0ならば 個体["R"]は個体["R"]+360 違えばもし、個体["R"]≧360ならば、 個体["R"]は個体["R"]−360 ここまで ここまで ここまで もし、個体["X"]<自機["X"]-実体化サイズ||個体["X"]>自機["X"]+実体化サイズ||個体["Y"]<自機["Y"]-実体化サイズ||個体["Y"]>自機["Y"]+実体化サイズならば、 群の個体数−回数を配列切り取る ここまで ここまで ここまで ●自弾進行とは 自弾群を進行処理 ここまで ●敵弾進行とは 敵弾群を進行処理 ここまで ●隕石進行とは 隕石群を進行処理 ここまで ●敵進行とは 敵群を進行処理 ここまで ●敵船進行とは 敵船群を進行処理 ここまで ●星進行とは (背景星の配列要素数)回、 個体は背景星[回数-1] 個体["X"]は個体["X"]+自機["DX"]÷2×経過レート 個体["Y"]は個体["Y"]+自機["DY"]÷2×経過レート もし、個体["X"]<自機["X"]-実体化サイズならば 個体["X"]は個体["X"]+実体化サイズ×2 違えばもし、個体["X"]>自機["X"]+実体化サイズならば 個体["X"]は個体["X"]-実体化サイズ×2 ここまで もし、個体["Y"]<自機["Y"]-実体化サイズならば、 個体["Y"]は個体["Y"]+実体化サイズ×2 違えばもし、個体["Y"]>自機["Y"]+実体化サイズならば 個体["Y"]は個体["Y"]-実体化サイズ×2 ここまで ここまで ここまで ●爆発処理とは 爆発数は爆発中の配列要素数 (爆発数)回、 爆発は爆発中[爆発数-回数] 爆発["カウンタ"]は爆発["カウンタ"]−経過時間 もし、爆発["カウンタ"]<0ならば、 爆発中の爆発数-回数を配列切り取り ここまで ここまで ここまで ●(速さで)出現基礎とは 出現Xは(((画面横×1.2)の乱数)-画面横×0.6) 出現Yは(((画面横×1.2)の乱数)-画面縦×0.6) 出現向きは(50の乱数)+(50の乱数)-50 出現位置は4の乱数 もし、出現位置<1ならば 出現Xは(-画面横×0.6) 出現向きは出現向き+0 違えばもし、出現位置<2ならば 出現Yは(-画面縦×0.6) 出現向きは出現向き+90 違えばもし、出現位置<3ならば 出現Xは画面横+画面横×0.6 出現向きは出現向き+180 違えば 出現Yは画面縦+画面縦×0.6 出現向きは出現向き+270 ここまで もし、出現向き<0ならば、 出現向きは出現向き+360 違えばもし、出現向き≧360ならば、 出現向きは出現向き-360 ここまで 向きはDEG2RAD(出現向き) 個体は{ X:出現X+自機["X"], Y:出現Y+自機["Y"], 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ } 個体を戻す ここまで ●隕石出現とは 速さは0.4+(20の乱数)÷10+スコア÷500 もし、速さ>3.0ならば、 速さは3.0 ここまで 隕石は速さで出現基礎 隕石["サイズ"]は隕石サイズ 隕石["R"]は360の乱数 回転速度は(5の乱数)+(5の乱数) もし、(2の乱数)<1ならば、 回転速度は回転速度×(-1) ここまで 隕石["DR"]は回転速度 隕石群に隕石を配列追加 ここまで ●敵出現とは 速さは0.5+(20の乱数)÷10 敵は速さで出現基礎 敵["サイズ"]は敵サイズ 敵["攻撃カウンタ"]は0 敵["攻撃インターバル"]は400+(100の乱数)×8 敵["視界"]は敵視界 敵群に敵を配列追加 ここまで ●(敵船から)敵召喚とは 速さは0.2+(6の乱数)÷10 敵は速さで出現基礎 敵["X"]は敵船["X"] 敵["Y"]は敵船["Y"] 敵["サイズ"]は敵サイズ 敵["攻撃カウンタ"]は0 敵["攻撃インターバル"]は400+(100の乱数)×8 敵["視界"]は敵視界 敵群に敵を配列追加 ここまで ●敵船出現とは 速さは0.5+(20の乱数)÷10 敵は速さで出現基礎 敵["サイズ"]は敵船サイズ 敵["攻撃カウンタ"]は0 敵["攻撃インターバル"]は300+(100の乱数)×8 敵["召喚カウンタ"]は0 敵["召喚インターバル"]は600+(100の乱数)×4 敵["視界"]は敵船視界 敵船群に敵を配列追加 ここまで ●ランダムエンカウンターとは エンカウンターはエンカウンター+1×経過レート もし、エンカウンター>10ならば、 もし、(100の乱数)<50+(スコア÷500)ならば、 サイコロは100の乱数 敵船数は敵船群の配列要素数 もし、(サイコロ<10)&&(敵船数<スコア÷2000)ならば、 敵船出現 違えばもし、サイコロ<25ならば、 敵出現 違えば 隕石出現 ここまで ここまで エンカウンターは0 ここまで ここまで ●(敵から)弾発射とは 速さは1.0 出現向きは(45の乱数)+(45の乱数) もし、自機["X"]<敵["X"]ならば、 出現向きは出現向き+90 ここまで もし、自機["Y"]<敵["Y"]ならば、 出現向きは360-出現向き ここまで もし、出現向き≧360ならば、 出現向きは出現向き−360 ここまで 向きはDEG2RAD(出現向き) 弾は{ X:敵["X"], Y:敵["Y"], 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ, サイズ: 弾サイズ["半径"] } 敵弾群に弾を配列追加 ここまで ●(群を)敵類処理とは (群の配列要素数)回、 敵は群[回数-1] もし、TYPEOF(敵["攻撃インターバル"])が"undefined"でなければ、 敵["攻撃カウンタ"]は敵["攻撃カウンタ"]+経過時間 もし、敵["攻撃カウンタ"]>敵["攻撃インターバル"]ならば、 距離2は(敵["X"]-自機["X"])*(敵["X"]-自機["X"])+(敵["Y"]-自機["Y"])*(敵["Y"]-自機["Y"]) もし、距離2<敵["視界"]×敵["視界"]ならば、 敵から弾発射 ここまで 敵["攻撃カウンタ"]は0 ここまで ここまで もし、敵["召喚インターバル"]=NULLでなければ、 敵["召喚カウンタ"]は敵["召喚カウンタ"]+経過時間 もし、敵["召喚カウンタ"]>敵["召喚インターバル"]ならば、 敵から敵召喚 敵["召喚カウンタ"]は0 ここまで ここまで ここまで ここまで ●敵処理とは 敵群を敵類処理 ここまで ●敵船処理とは 敵船群を敵類処理 ここまで ●敵弾判定処理とは 弾数は敵弾群の配列要素数 隕石数は隕石群の配列要素数 もし、弾数が0ならば、 戻る ここまで Xは自機["X"] Yは自機["Y"] 自サイズは自機["サイズ"] (弾数)回 Tは弾数-回数 弾は敵弾群[T] もし、弾["X"]-弾["サイズ"]<X+自サイズ×0.4&&弾["X"]+弾["サイズ"]>X−自サイズ×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<Y+自サイズ×0.3&&弾["Y"]+弾["サイズ"]>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで もし、隕石数>0ならば (隕石数)回 Pは隕石数-回数 隕石は隕石群[P] もし、弾["X"]-弾["サイズ"]<隕石["X"]+隕石["サイズ"]×0.4&&弾["X"]+弾["サイズ"]>隕石["X"]−隕石["サイズ"]×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<隕石["Y"]+隕石["サイズ"]×0.4&&弾["Y"]+弾["サイズ"]>隕石["Y"]-隕石["サイズ"]×0.4ならば、 隕石群のPを配列切取 敵弾群のTを配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 隕石数は隕石群の配列要素数 スコアはスコア+5 抜ける ここまで ここまで ここまで ここまで ここまで ここまで ●自弾判定処理とは 弾数は自弾群の配列要素数 もし、弾数が0ならば、 戻る ここまで 隕石数は隕石群の配列要素数 敵数は敵群の配列要素数 敵船数は敵船群の配列要素数 (弾数)回 Tは弾数-回数 弾は自弾群[T] 弾Xは弾["X"]+弾["DDX"]*弾["長"] 弾Yは弾["Y"]+弾["DDY"]*弾["長"] 処理済みはオフ もし、隕石数>0ならば (隕石数)回 Pは隕石数-回数 隕石は隕石群[P] もし、弾X<隕石["X"]+隕石["サイズ"]×0.4&&弾X>隕石["X"]−隕石["サイズ"]×0.4ならば、 もし、弾Y<隕石["Y"]+隕石["サイズ"]×0.4&&弾Y>隕石["Y"]-隕石["サイズ"]×0.4ならば、 隕石群のPを配列切取 自弾群のTを配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 隕石数は隕石群の配列要素数 スコアはスコア+10 処理済みはオン ここまで ここまで ここまで ここまで もし、(敵数>0)&&(処理済み=オフ)ならば (敵数)回 Eは敵数-回数 敵は敵群[E] もし、弾X<敵["X"]+敵["サイズ"]×0.4&&弾X>敵["X"]−敵["サイズ"]×0.4ならば、 もし、弾Y<敵["Y"]+敵["サイズ"]×0.4&&弾Y>敵["Y"]-敵["サイズ"]×0.4ならば、 敵群のEを配列切取 自弾群のTを配列切取 爆発は{X:敵["X"], Y:敵["Y"], サイズ:爆発サイズ, カウンタ: 200} 爆発中に爆発を配列追加 敵数は敵群の配列要素数 スコアはスコア+100 処理済みはオン 抜ける ここまで ここまで ここまで ここまで もし、(敵船数>0)&&(処理済み=オフ)ならば (敵船数)回 Sは敵船数-回数 敵船は敵船群[S] もし、弾X<敵船["X"]+敵船["サイズ"]×0.4&&弾X>敵船["X"]−敵船["サイズ"]×0.4ならば、 もし、弾Y<敵船["Y"]+敵船["サイズ"]×0.4&&弾Y>敵船["Y"]-敵船["サイズ"]×0.4ならば、 敵船群のSを配列切取 自弾群のTを配列切取 爆発は{X:敵船["X"], Y:敵船["Y"], サイズ:爆発サイズ, カウンタ: 200} 爆発中に爆発を配列追加 敵船数は敵船群の配列要素数 スコアはスコア+200 処理済みはオン 抜ける ここまで ここまで ここまで ここまで ここまで ここまで ●隕石判定処理とは 隕石数は隕石群の配列要素数 もし、隕石数が0ならば、 戻る ここまで Xは自機["X"] Yは自機["Y"] 自サイズは自機["サイズ"] (隕石数)回 隕石は隕石群[回数-1] もし、隕石["X"]-隕石["サイズ"]×0.3<X+自サイズ×0.4&&隕石["X"]+隕石["サイズ"]×0.3>X−自サイズ×0.4ならば、 もし、隕石["Y"]-隕石["サイズ"]×0.3<Y+自サイズ×0.3&&隕石["Y"]+隕石["サイズ"]×0.3>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで ここまで ここまで ●爆発判定処理とは 爆発数は爆発中の配列要素数 もし、爆発数が0ならば、 戻る ここまで 敵弾数は敵弾群の配列要素数 隕石数は隕石群の配列要素数 Xは自機["X"] Yは自機["Y"] 自サイズは自機["サイズ"] (爆発数)回 Iは爆発数-回数 爆発は爆発中[I] もし、爆発["X"]-爆発["サイズ"]×0.3<X+自サイズ×0.4&&爆発["X"]+爆発["サイズ"]×0.3>X−自サイズ×0.4ならば、 もし、爆発["Y"]-爆発["サイズ"]×0.3<Y+自サイズ×0.3&&爆発["Y"]+爆発["サイズ"]×0.3>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで もし、敵弾数>0ならば (敵弾数)回 Tは敵弾数-回数 弾は敵弾群[T] もし、弾["X"]-弾["サイズ"]<爆発["X"]+爆発["サイズ"]×0.4&&弾["X"]+弾["サイズ"]>爆発["X"]−爆発["サイズ"]×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<爆発["Y"]+爆発["サイズ"]×0.4&&弾["Y"]+弾["サイズ"]>爆発["Y"]-爆発["サイズ"]×0.4ならば、 敵弾群のTを配列切取 爆発["カウンタ"]は爆発["カウンタ"]+400 スコアはスコア+1 ここまで ここまで ここまで 敵弾数は敵弾群の配列要素数 ここまで もし、隕石数>0ならば (隕石数)回 Pは隕石数-回数 隕石は隕石群[P] もし、爆発["X"]−爆発["サイズ"]×0.4<隕石["X"]+隕石["サイズ"]×0.4&&爆発["X"]+爆発["サイズ"]×0.4>隕石["X"]−隕石["サイズ"]×0.4ならば、 もし、爆発["Y"]-爆発["サイズ"]×0.4<隕石["Y"]+隕石["サイズ"]×0.4&&爆発["Y"]+爆発["サイズ"]×0.4>隕石["Y"]-隕石["サイズ"]×0.4ならば、 隕石群のPを配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 スコアはスコア+5 ここまで ここまで ここまで 隕石数は隕石群の配列要素数 ここまで ここまで ここまで ●処理予約とは tidは"処理フレーム"を0.02秒タイマー開始時 ここまで ●処理中止とは 全タイマー停止 ここまで ●処理フレームとは 前回日時は基準日時 基準日時は「Date.now()」をJS実行 経過時間は基準日時−前回日時 経過レートは経過時間÷20.0 ボタン状態更新 ゲームパッド状態更新 自機進行 爆発処理 自弾進行 自弾判定処理 敵船処理 敵処理 敵弾進行 敵弾判定処理 敵船進行 敵進行 隕石進行 隕石判定処理 爆発判定処理 星進行 ランダムエンカウンター 操作処理 もし、ゲームオーバーフラグがオンならば、 ゲーム終わり ここまで もし、描画中ならば、 描画予約 違えば、 処理中止 ここまで ここまで ●自機描画とは 単文字描画関数(CTX,自機,中心,自回転,自文字) ここまで ●敵弾描画とは 弾数は敵弾群の配列要素数 もし、弾数>0ならば、 1に線太さ設定 白色に線色設定 黒色に塗り色設定 (弾数)回 弾は敵弾群[回数-1] [弾["X"]-自機["X"]+中心["X"], 弾["Y"]-自機["Y"]+中心["Y"]]へ弾サイズ["半径"]の円描画。 ここまで ここまで ここまで ●自弾描画とは 弾数は自弾群の配列要素数 もし、弾数>0ならば、 自弾群[0]["太"]に線太さ設定 黄色に線色設定 (自弾群の配列要素数)回、 弾は自弾群[回数-1] X1は弾["X"]-自機["X"]+中心["X"] Y1は弾["Y"]-自機["Y"]+中心["Y"] X2はX1+弾["DDX"]×弾["長"] Y2はY1+弾["DDY"]×弾["長"] [X1, Y1]から[X2, Y2]へ線描画。 ここまで ここまで ここまで ●星描画とは 1に線太さ設定 黄色に線色設定 黄色に塗り色設定 (背景星の配列要素数)回、 星は背景星[回数-1] [星["X"]-自機["X"]+中心["X"], 星["Y"]-自機["Y"]+中心["Y"]]へ1の円描画。 ここまで ここまで ●(群を文字で)群文字描画処理とは 個体数は群の配列要素数 もし、個体数>0ならば、 文字描画準備関数(CTX,群[0]["サイズ"]) (個体数)回、 個体は群[回数-1] 文字描画関数(CTX,自機,個体,中心,文字) ここまで 文字描画復帰関数(CTX) ここまで ここまで ●隕石描画とは 隕石群を隕石文字で群文字描画処理 ここまで ●爆発描画とは 爆発中を爆発文字で群文字描画処理 ここまで ●敵描画とは 敵群を敵文字で群文字描画処理 ここまで ●敵船描画とは 敵船群を敵船文字で群文字描画処理 ここまで ●ビルボード描画とは 白色に塗り色設定 「12px sans- serif」に描画フォント設定 [画面横÷3×1-40, 20]に「スコア:{スコア}」を文字描画 もし、ゲームパッド有ならば、 [0, 20]に「🕹」を文字描画 ここまで ここまで ●描画予約とは もし、fidが(-1)ならば、 // fidは画面描画フレームデリゲートを実行予約 画面描画フレームデリゲートを画面更新時実行 fidは1 ここまで ここまで ●画面描画フレームとは fidは-1 [0,0,画面横,画面縦]の描画クリア 自機描画 隕石描画 敵船描画 敵描画 爆発描画 敵弾描画 自弾描画 星描画 ビルボード描画 ここまで ●初期画面描画とは [0,0,画面横,画面縦]の描画クリア 白色に線色設定 白色に塗り色設定 2に線太さ設定 「18px sans- serif」に描画フォント設定 [画面横÷2-60, 画面縦÷2]に「クリックで開始」を文字描画 ここまで ●ゲーム終とは 描画中はオフ 白色に線色設定 白色に塗り色設定 2に線太さ設定 「24px sans- serif」に描画フォント設定 [画面横÷2-20, 画面縦÷2]に「おわり」を文字描画 ここまで ●自弾発射とは 速さは2.5 出現向きは自機["R"] 向きはDEG2RAD(出現向き) 弾は{ X:自機["X"]+自機["サイズ"]÷2×COS(向き), Y:自機["Y"]+自機["サイズ"]÷2×SIN(向き), 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ, DDX:COS(向き), DDY:SIN(向き), 長: 自弾サイズ["長"], 太: 自弾サイズ["太"] } 自弾群に弾を配列追加 ここまで ●操作処理とは DXは0 DYは0 DFIREはオフ もし、(中断チェック)ならば、 ゲームオーバーフラグはオン 戻る ここまで もし、(12の保持チェック)ならば、 DYは-1 ここまで もし、(13の保持チェック)ならば、 DYは1 ここまで もし、(14の保持チェック)ならば、 DXは-1 ここまで もし、(15の保持チェック)ならば、 DXは1 ここまで もし、(0の押下チェック)ならば、 DFIREはオン ここまで もし、ゲームパッド有ならば、 もし、パッドアクシス数≧2ならば、 AXは0のパッドアクシス値 AYは1のパッドアクシス値 もし、AX<0.2&&AX>(-0.2)ならば、 AXは0 違えばもし、AX>0.9ならば、 AXは0.9 違えばもし、AX<(-0.9)ならば、 AXは-0.9 ここまで もし、AY<0.2&&(AY>-0.2)ならば、 AYは0 違えばもし、AY>0.9ならば、 AYは0.9 違えばもし、AY<(-0.9)ならば、 AYは-0.9 ここまで もし、AX≠0||AY≠0ならば、 DXはAX DYはAY ここまで ここまで もし、(12のボタン保持チェック)ならば、 DYは-1 ここまで もし、(13のボタン保持チェック)ならば、 DYは1 ここまで もし、(14のボタン保持チェック)ならば、 DXは-1 ここまで もし、(15のボタン保持チェック)ならば、 DXは1 ここまで もし、(0のボタン押下チェック)ならば、 DFIREはオン ここまで ここまで もし、DFIREならば、 自弾発射 ここまで もし、DX≠0||DY≠0ならば、 RAD向きはDXとDYのATAN2 D向きはRAD2DEG(RAD向き) もし、D向き<0ならば、 D向きはD向き+360 ここまで 自機["TR"]はD向き もし、いいえならば、 向きはDEG2RAD(D向き) 自機["R"]はD向き 自機["DX"]はCOS(向き)×自機["速"] 自機["DY"]はSIN(向き)×自機["速"] ここまで ここまで ここまで ●(群をDXYに)群ワープとは 個体数は群の配列要素数 もし、個体数=0ならば、 戻る ここまで DXはDXY[0] DYはDXY[1] (個体数)回 個体は群[回数-1] 個体["X"]は個体["X"]-DX 個体["Y"]は個体["Y"]-DY ここまで ここまで ●ワープXYとは DXYは[自機["X"],自機["Y"]] 隕石群をDXYに群ワープ 敵群をDXYに群ワープ 敵船群をDXYに群ワープ 爆発中をDXYに群ワープ 敵弾群をDXYに群ワープ 自弾群をDXYに群ワープ 背景星をDXYに群ワープ 自機["X"]は0 自機["Y"]は0 ここまで ●自機進行とは ワープはオフ もし、自機["R"]が自機["TR"]でなければ、 もし、自機["TR"]>自機["R"]ならば もし、自機["TR"]-自機["R"]≦180ならば、 Rは自機["R"]+自機["回速"]×経過レート もし、R>自機["TR"]ならば、 Rは自機["TR"] ここまで 違えば、 Rは自機["R"]-自機["回速"]×経過レート もし、R<0ならば、 RはR+360 もし、R<自機["TR"]ならば、 Rは自機["TR"] ここまで ここまで ここまで 違えば、 もし、自機["R"]-自機["TR"]≦180ならば、 Rは自機["R"]-自機["回速"]×経過レート もし、R<自機["TR"]ならば、 Rは自機["TR"] ここまで 違えば、 Rは自機["R"]+自機["回速"]×経過レート もし、R≧360ならば、 RはR-360 もし、R>自機["TR"]ならば、 Rは自機["TR"] ここまで ここまで ここまで ここまで 自機["R"]はR 向きはDEG2RAD(R) 自機["DX"]はCOS(向き)×自機["速"] 自機["DY"]はSIN(向き)×自機["速"] ここまで Xは自機["X"]+自機["DX"]×経過レート Yは自機["Y"]+自機["DY"]×経過レート もし、X<(-宇宙サイズ)ならば、 ワープはオン 違えばもし、X>宇宙サイズならば、 ワープはオン ここまで もし、Y<(-宇宙サイズ)ならば、 ワープはオン 違えばもし、Y>宇宙サイズならば、 ワープはオン ここまで 自機["X"]はX 自機["Y"]はY もし、ワープならば、 ワープXY ここまで ここまで # ゲームパッド機能 コントローラ群は[] 現コントローラは{id:"",index:-1} 現在パッドボタン値一覧状態は[] 現在パッドアクシス値一覧状態は[] 前回パッドボタン状態は0 現在パッドボタン状態は0 ゲームパッドAPIチェック関数文字列は『return (typeof window.navigator.getGamepads !== "undefined")』 ゲームパッドAPIチェック関数は[]とゲームパッドAPIチェック関数文字列でJS関数作成 ●ゲームパッドAPIチェックとは ゲームパッドAPIチェック関数()で戻る ここまで ●ゲームパッドイベント設定とは もし、ゲームパッドAPIチェック()ならば、 WINDOWの「gamepadconnected」に「ゲームパット接続」をDOMイベント追加 WINDOWの「gamepaddisconnected」に「ゲームパッド切断」をDOMイベント追加 ここまで ここまで ●ゲームパッドイベント解除とは もし、ゲームパッドAPIチェック()ならば、 WINDOWの「gamepadconnected」から「ゲームパット接続」をDOMイベント削除 WINDOWの「gamepaddisconnected」から「ゲームパッド切断」をDOMイベント削除 ここまで ここまで ●ゲームパット接続とは EVTはWINDOW["event"] パッドは{ id:EVT["gamepad"]["id"], index:EVT["gamepad"]["index"] } コントローラ群にパッドを配列追加 もし、現コントローラ["index"]が(-1)ならば、 現コントローラはパッド ここまで ここまで ●ゲームパッド切断とは EVTはWINDOW["event"] パッドは{ id:EVT["gamepad"]["id"], index:EVT["gamepad"]["index"] } もし、TYPEOF(パッド["id"])が"undefined"ならば、 (コントローラ群の配列要素数)回、 Pは回数-1 PADはコントローラ群[P] もし、PAD["id"]=パッド["id"]ならば、 コントローラ群のPを配列切り取る 抜ける ここまで ここまで もし、現コントローラ["id"]=パッド["id"]ならば、 もし、(コントローラ群の配列要素数)>0ならば、 現コントローラはコントローラ群[0] 違えば、 現コントローラは{id:"",index:-1} ここまで ここまで 違えば (コントローラ群の配列要素数)回、 Pは回数-1 PADはコントローラ群[P] もし、PAD["index"]=パッド["index"]ならば、 コントローラ群のPを配列切り取る 抜ける ここまで ここまで もし、現コントローラ["index"]=パッド["index"]ならば、 もし、(コントローラ群の配列要素数)>0ならば、 現コントローラはコントローラ群[0] 違えば、 現コントローラは{id:"",index:-1} ここまで ここまで ここまで ここまで ●ゲームパッド状態更新とは 対象パッドは{id:"",index:-1} 前回パッドボタン状態は現在パッドボタン状態 もし、ゲームパッドAPIチェック()ならば、 ゲームパッド群は"navigator.getGamepads()"をJS実行 もし、ゲームパッド群ならば もし、現コントローラ["index"]≧0ならば、 (ゲームパッド群の配列要素数)回 Pは回数-1 パッドはゲームパッド群[P] もし、パッドならば、 もし、パッド["id"]ならば、 もし、パッド["id"]=現コントローラ["id"]ならば 対象パッドはパッド 抜ける ここまで 違えば、 もし、パッド["index"]=現コントローラ["index"]ならば 対象パッドはパッド 抜ける ここまで ここまで ここまで ここまで 違えば、 (ゲームパッド群の配列要素数)回 Pは回数-1 パッドはゲームパッド群[P] もし、パッドならば、 対象パッドはパッド 現コントローラは{ id:パッド["id"], index:パッド["index"] } コントローラ群に現コントローラを配列追加 抜ける ここまで ここまで ここまで ここまで ここまで もし、対象パッド["index"]≧0ならば 現在パッドボタン状態は0 現在パッドボタン値一覧状態は[] ビット値は1 (対象パッド["buttons"]の配列要素数)回 Bは回数-1 ボタンは対象パッド["buttons"][B] もし、TYPEOF(ボタン)が"object"ならば、 値はボタン["value"] 違えば、 値はボタン ここまで もし、値>0.4ならば 現在パッドボタン状態は現在パッドボタン状態+ビット値 ここまで 現在パッドボタン値一覧状態に値を配列追加 ビット値はビット値×2 ここまで 現在パッドアクシス値一覧状態は対象パッド["axes"] 違えば、 現在パッドボタン状態は0 現在パッドボタン値一覧状態は[] 現在パッドアクシス値一覧状態は[] ここまで ここまで ●(INDEXの)ボタン押下チェックとは 値は1をINDEXでSHIFT_L ((値と現在パッドボタン状態のAND)と(前回パッドボタン状態のNOT)のAND)で戻る ここまで ●(INDEXの)ボタン保持チェックとは 値は1をINDEXでSHIFT_L (値と現在パッドボタン状態のAND)≠0で戻る ここまで ●(INDEXの)パッドアクシス値とは もし、INDEX≧(現在パッドアクシス値一覧状態の配列要素数)ならば、 0で戻る ここまで 現在パッドアクシス値一覧状態[INDEX]で戻る ここまで ●パッドアクシス数とは 現在パッドアクシス値一覧状態の配列要素数で戻る ここまで ●ゲームパッド有とは (現コントローラ["index"]≧0)で戻る ここまで # キーパッド機能 ボタン状態は0 前回ボタン状態は0 現在ボタン状態は0 キーパッドイベント対象は0 ゲーム中断キーはオフ ●(対象に)キーパッドイベント設定とは キーパッドイベント対象は対象 もし、対象["tagName"]が「CANVAS」ならば、 対象["tabIndex"]は0 []で対象の"focus"をJSメソッド実行 ここまで 対象の「keydown」に「キー押」をDOMイベント追加 対象の「keyup」に「キー離」をDOMイベント追加 ここまで ●キーパッドイベント解除とは キーパッドイベント対象の「keydown」から「キー押」をDOMイベント削除 キーパッドイベント対象の「keyup」から「キー離」をDOMイベント削除 ここまで ●キー押すとは EVTはWINDOW["event"] もし、EVT["code"]ならば、 コードはEVT["code"] キーはキーマッピング[コード] 違えば、 コードはEVT["keyCode"] キーはキーマッピング[コード] ここまで もし、(キーの変数型確認)が"undefined"でなければ、 もし、キー≧0ならば、 値は1をキーでSHIFT_L ボタン状態はボタン状態と値のOR 違えば、 ゲーム中断キーはオン ここまで EVTのDOMイベント処理停止 ここまで ここまで ●キー離すとは EVTはWINDOW["event"] もし、EVT["code"]ならば、 コードはEVT["code"] キーはキーマッピング[コード] 違えば、 コードはEVT["keyCode"] キーはキーマッピング[コード] ここまで もし、(キーの変数型確認)が"undefined"でなければ、 もし、キー≧0ならば、 値は1をキーでSHIFT_LのNOT ボタン状態はボタン状態と値のAND EVTのDOMイベント処理停止 ここまで ここまで ここまで ●ボタン状態更新とは 前回ボタン状態は現在ボタン状態 現在ボタン状態はボタン状態 ここまで ●(INDEXの)押下チェックとは 値は1をINDEXでSHIFT_L ((値と現在ボタン状態のAND)と(前回ボタン状態のNOT)のAND)で戻る ここまで ●(INDEXの)保持チェックとは 値は1をINDEXでSHIFT_L (値と現在ボタン状態のAND)≠0で戻る ここまで ●中断チェックとは ゲーム中断キーで戻る ここまで # 基本機能 /* JSメソッド実行文字列は『return IF.OBJ[IF.METHOD].apply(IF.OBJ,IF.ARGS)』 JSメソッド実行関数は["IF"]とJSメソッド実行文字列でJS関数作成 */ ATAN2関数文字列は『return Math.atan2(y, x)』 ATAN2関数は["y,x"]とATAN2関数文字列でJS関数作成 /* 実行予約関数文字列は『return window.requestAnimationFrame(func)』 実行予約関数は["func"]と実行予約関数文字列でJS関数作成 */ /* ●(Funcを)実行予約とは // [FuncNameのJSオブジェクト取得]でWINDOW["requestAnimationFrame"]をJS関数実行で戻る // 実行予約関数((FuncNameのJSオブジェクト取得))で戻る 実行予約関数(Func)で戻る ここまで */ /* ●(OBJのMETHODをARGSで)JSメソッド実行とは JSメソッド実行関数({OBJ:OBJ,METHOD:METHOD,ARGS:ARGS})で戻る ここまで */ ●(ARGSとBODYで)JS関数作成とは 『(function(A,B){return new Function(A,B);})』を[ARGS,BODY]でJS関数実行を戻す ここまで /* ●CTX取得とは 「sys.__ctx」をJS実行で戻る ここまで */ ●(xとyの)ATAN2とは ATAN2関数(y, x)で戻る ここまで
プログラムを実行
⭐ てぃふと@うぇいく 作
タイトル:
いろいろ避けつつ撃つゲーム(キーボードとゲームパッド対応)
ライセンス:
CC0 (著作権破棄)
タイプ:
wnako
タグ:
-
利用バージョン:
3.3.55
作成日時:
2021/03/18 21:17 (編集: 2022/06/21 21:13)
公開の投稿
⭐
ログイン
して★を付けよう!
Twitterへ投稿
📝作品を編集
作品公開情報
📍この作品のURL:
📍アプリ(即時実行)のURL:
📍アプリ(実行ボタンあり)のURL:
📍ブログパーツ:
上記HTML↑をブログに貼り付けることでアプリを埋め込めます。
📍ライブラリ直リンク - 『!「***」を取込』で使うとき:
📍なでしこハブ (最新版の反映は1日後):
ソースの確認
編集履歴の確認
通報数:
0
通報って何?