🌸 「なでしこ」
>
🍯 「貯蔵庫」
色々避けつつ撃つゲーム(キーボード操作専用)
🌟新規
📒一覧
🔌
🔍検索
🚪ログイン
色々避けつつ撃つゲーム(キーボード操作専用) 📖
操作はカーソルキーとZ(弾),A(減速),S(加速)。隕石と敵と敵の弾と爆風を避けつつ撃つ。リアルタイムゲームのキー操作のサンプル。
プログラム:
(→大)
画面横は描画中キャンバス["width"] 画面縦は描画中キャンバス["height"] 自サイズは24 自回転は45 敵サイズは12 隕石サイズは12 爆発サイズは24 弾サイズは{半径:3} 自弾サイズは{長:4, 太:1} 自文字は「🚀」 敵文字は「👾」 隕石文字は「🥔」 爆発文字は「💥」 Xは画面横÷2 Yは画面縦÷2 エンカウンター基準値は画面縦×画面横÷4000 自速さは2 スコアは0 エンカウンターは0 背景カウンターは0 ゲームオーバーフラグはオフ キーマッピングは{ 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"] 基準日時は0 前回日時は0 経過時間は0 経過レートは1.0 ボタン状態は0 前回ボタン状態は0 現在ボタン状態は0 開始する。 ●開始とは 描画中キャンバスをクリックした時には、 もし、描画中でなければ、 初期化処理 星準備 描画中はオン 基準日時は「Date.now()」をJS実行 「描画フレーム」を画面更新時実行 ここまで ここまで 描画中キャンバスの「背景色」に黒色をDOMスタイル設定。 初期画面描画 ここまで ●初期化処理とは 描画中キャンバス["tabIndex"]は-1 描画中キャンバスの"focus"を[]でJSメソッド実行 描画中キャンバスの「keydown」に「キー押」をDOMイベント追加 描画中キャンバスの「keyup」に「キー離」をDOMイベント追加 ここまで ●終了処理とは 描画中キャンバスの「keydown」から「キー押」をDOMイベント削除 描画中キャンバスの「keyup」から「キー離」をDOMイベント削除 ここまで ●(群を)進行処理とは 個体数は群の要素数 もし、個体数>0ならば、 Iを個体数から1まで繰り返す 個体は群[I-1] 個体["X"]は個体["X"]+個体["DX"]×経過レート 個体["Y"]は個体["Y"]+個体["DY"]×経過レート もし、個体["X"]<0||個体["X"]>画面横||個体["Y"]<0||個体["Y"]>画面縦ならば、 群のI-1を配列切取 ここまで ここまで ここまで ここまで ●(群を)回転処理とは 個体数は群の要素数 もし、個体数>0ならば、 Iを個体数から1まで繰り返す 個体は群[I-1] 個体["R"]は個体["R"]+個体["DR"]×経過レート もし、個体["R"]<0ならば 個体["R"]は個体["R"]+360 違えばもし、個体["R"]≧360ならば、 個体["R"]は個体["R"]−360 ここまで ここまで ここまで ここまで ●星準備とは (エンカウンター基準値)回、 星出現 ここまで 星数は背景星の要素数 もし、星数>0ならば、 Iを1から星数まで繰り返す 星は背景星[I-1] 星["X"]は画面横×0.05+(画面横の乱数)×0.9 ここまで ここまで ここまで ●自弾進行とは 自弾群を進行処理 ここまで ●敵弾進行とは 敵弾群を進行処理 ここまで ●隕石進行とは 隕石群を進行処理 隕石群を回転処理 ここまで ●敵進行とは 敵群を進行処理 ここまで ●星進行とは 背景星を進行処理 ここまで ●爆発処理とは 爆発数は爆発中の要素数 もし、爆発数>0ならば、 Iを爆発数から1まで繰り返す 爆発は爆発中[I-1] 爆発["カウンタ"]は爆発["カウンタ"]−経過時間 もし、爆発["カウンタ"]<0ならば、 爆発中のI-1を配列切取 ここまで ここまで ここまで ここまで ●(速さで種類から)出現基礎とは 出現Xは(画面横×0.2+((画面横×0.8)の乱数)) 出現Yは(画面縦×0.1+((画面横×0.8)の乱数)) 出現向きは180 もし、種類が「隕石」ならば もし、(4の乱数)<1ならば、 出現Xは画面横 違えば、 出現Yは0 ここまで 出現向きは(50の乱数)+(50の乱数)+80 違えば、 出現Xは画面横 出現向きは(90の乱数)+135 ここまで もし、出現向き≧360ならば、 出現向きは出現向き−360 ここまで 向きはDEG2RAD(出現向き) 個体は{ X:出現X, 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 敵["攻撃インターバル"]は200+(100の乱数)×10 敵群に敵を配列追加 ここまで ●星出現とは 出現Xは画面横 出現Yは(画面縦×0.05+((画面縦×0.9)の乱数)) 出現向きは180 速さは(0.5+(3の乱数)÷2) 向きはDEG2RAD(出現向き) 星は{ X:出現X, Y:出現Y, 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ } 星を背景星に配列追加 ここまで ●ランダムエンカウンターとは エンカウンターはエンカウンター+1×経過レート もし、エンカウンター>10ならば、 敵数は敵群の要素数 色々数は(隕石群の要素数)+敵数 もし、(色々数の乱数)<(スコア÷100)+エンカウンター基準値ならば、 もし、(100の乱数)<15ならば、 敵出現 違えば 隕石出現 ここまで ここまで エンカウンターは0 ここまで ここまで ●背景演出とは 背景カウンターは背景カウンター+経過時間 もし、背景カウンター>400ならば、 星出現 背景カウンターは0 ここまで ここまで ●(敵から)弾発射とは 速さは1.0 出現向きは(45の乱数)+(45の乱数) もし、X<敵["X"]ならば、 出現向きは出現向き+90 ここまで もし、Y<敵["Y"]ならば、 出現向きは360-出現向き ここまで もし、出現向き≧360ならば、 出現向きは出現向き−360 ここまで 向きはDEG2RAD(出現向き) 弾は{ X:敵["X"], Y:敵["Y"], 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ, サイズ: 弾サイズ["半径"] } 敵弾群に弾を配列追加 ここまで ●敵処理とは 敵数は敵群の要素数 もし、敵数>0ならば、 Iを敵数から1まで繰り返す 敵は敵群[I-1] 敵["攻撃カウンタ"]は敵["攻撃カウンタ"]+経過時間 もし、敵["攻撃カウンタ"]>敵["攻撃インターバル"]ならば、 敵から弾発射 敵["攻撃カウンタ"]は0 ここまで ここまで ここまで ここまで ●敵弾判定処理とは 弾数は敵弾群の要素数 隕石数は隕石群の要素数 もし、弾数が0ならば、 戻る ここまで Tを弾数から1まで繰り返す 弾は敵弾群[T-1] もし、弾["X"]-弾["サイズ"]<X+自サイズ×0.4&&弾["X"]+弾["サイズ"]>X−自サイズ×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<Y+自サイズ×0.2&&弾["Y"]+弾["サイズ"]>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで もし、隕石数>0ならば Pを隕石数から1まで繰り返す 隕石は隕石群[P-1] もし、弾["X"]-弾["サイズ"]<隕石["X"]+隕石["サイズ"]×0.4&&弾["X"]+弾["サイズ"]>隕石["X"]−隕石["サイズ"]×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<隕石["Y"]+隕石["サイズ"]×0.4&&弾["Y"]+弾["サイズ"]>隕石["Y"]-隕石["サイズ"]×0.4ならば、 隕石群のP-1を配列切取 敵弾群のT-1を配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 隕石数は隕石群の要素数 スコアはスコア+5 抜ける ここまで ここまで ここまで ここまで ここまで ここまで ●自弾判定処理とは 弾数は自弾群の要素数 隕石数は隕石群の要素数 敵数は敵群の要素数 もし、弾数が0ならば、 戻る ここまで Tを弾数から1まで繰り返す 弾は自弾群[T-1] 処理済みはオフ もし、(隕石数>0)&&(処理済み=オフ)ならば Pを隕石数から1まで繰り返す 隕石は隕石群[P-1] もし、弾["X"]<隕石["X"]+隕石["サイズ"]×0.4&&弾["X"]+弾["長"]>隕石["X"]−隕石["サイズ"]×0.4ならば、 もし、弾["Y"]<隕石["Y"]+隕石["サイズ"]×0.4&&弾["Y"]+弾["太"]>隕石["Y"]-隕石["サイズ"]×0.4ならば、 隕石群のP-1を配列切取 自弾群のT-1を配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 隕石数は隕石群の要素数 スコアはスコア+5 処理済みはオン 抜ける ここまで ここまで ここまで ここまで もし、(敵数>0)&&(処理済み=オフ)ならば Eを敵数から1まで繰り返す 敵は敵群[E-1] もし、弾["X"]<敵["X"]+敵["サイズ"]×0.4&&弾["X"]+弾["長"]>敵["X"]−敵["サイズ"]×0.4ならば、 もし、弾["Y"]<敵["Y"]+敵["サイズ"]×0.4&&弾["Y"]+弾["太"]>敵["Y"]-敵["サイズ"]×0.4ならば、 敵群のE-1を配列切取 自弾群のT-1を配列切取 爆発は{X:敵["X"], Y:敵["Y"], サイズ:爆発サイズ, カウンタ: 200} 爆発中に爆発を配列追加 敵数は敵群の要素数 スコアはスコア+50 弾は空 抜ける ここまで ここまで ここまで ここまで ここまで ここまで ●隕石判定処理とは 隕石数は隕石群の要素数 もし、隕石数が0ならば、 戻る ここまで Pを隕石数から1まで繰り返す 隕石は隕石群[P-1] もし、隕石["X"]-隕石["サイズ"]×0.3<X+自サイズ×0.4&&隕石["X"]+隕石["サイズ"]×0.3>X−自サイズ×0.4ならば、 もし、隕石["Y"]-隕石["サイズ"]×0.3<Y+自サイズ×0.2&&隕石["Y"]+隕石["サイズ"]×0.3>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで ここまで ここまで ●爆発判定処理とは 爆発数は爆発中の要素数 もし、爆発数が0ならば、 戻る ここまで 敵弾数は敵弾群の要素数 隕石数は隕石群の要素数 Iを爆発数から1まで繰り返す 爆発は爆発中[I-1] もし、爆発["X"]-爆発["サイズ"]×0.3<X+自サイズ×0.4&&爆発["X"]+爆発["サイズ"]×0.3>X−自サイズ×0.4ならば、 もし、爆発["Y"]-爆発["サイズ"]×0.3<Y+自サイズ×0.2&&爆発["Y"]+爆発["サイズ"]×0.3>Y-自サイズ×0.2ならば、 ゲームオーバーフラグはオン 戻る ここまで ここまで もし、敵弾数>0ならば Tを敵弾数から1まで繰り返す 弾は敵弾群[T-1] もし、弾["X"]-弾["サイズ"]<爆発["X"]+爆発["サイズ"]×0.4&&弾["X"]+弾["サイズ"]>爆発["X"]−爆発["サイズ"]×0.4ならば、 もし、弾["Y"]-弾["サイズ"]<爆発["Y"]+爆発["サイズ"]×0.4&&弾["Y"]+弾["サイズ"]>爆発["Y"]-爆発["サイズ"]×0.4ならば、 敵弾群のT-1を配列切取 爆発["カウンタ"]は爆発["カウンタ"]+400 スコアはスコア+1 ここまで ここまで ここまで 敵弾数は敵弾群の要素数 ここまで もし、隕石数>0ならば Pを隕石数から1まで繰り返す 隕石は隕石群[P-1] もし、爆発["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-1を配列切取 爆発は{X:隕石["X"], Y:隕石["Y"], サイズ:爆発サイズ, カウンタ: 1000} 爆発中に爆発を配列追加 スコアはスコア+5 ここまで ここまで ここまで 隕石数は隕石群の要素数 ここまで ここまで ここまで ●描画フレームとは 前回日時は基準日時 基準日時は「Date.now()」をJS実行 経過時間は基準日時−前回日時 経過レートは経過時間÷20.0 ボタン状態更新 爆発処理 敵処理 敵弾進行 敵弾判定処理 自弾進行 自弾判定処理 敵進行 隕石進行 隕石判定処理 爆発判定処理 星進行 ランダムエンカウンター 背景演出 画面描画 操作処理 もし、ゲームオーバーフラグがオンならば、 ゲーム終わり ここまで もし、描画中ならば、 「描画フレーム」を画面更新時実行 ここまで ここまで ●自機描画とは 向きはDEG2RAD(自回転) CTXは描画中コンテキスト キャンバス状態保存 「{自サイズ}px sans- serif」に描画フォント設定 CTX["textAlign"]は"center" CTX["textBaseline"]は"middle" CTXの"translate"を[X, Y]でJSメソッド実行 CTXの"rotate"を[向き]でJSメソッド実行 [0, 0]に自文字を文字描画 キャンバス状態復元 ここまで ●敵弾描画とは 弾数は敵弾群の要素数 もし、弾数>0ならば、 2に線太さ設定 白色に線色設定 黒色に塗り色設定 Iを1から弾数まで繰り返す 弾は敵弾群[I-1] [弾["X"], 弾["Y"]]へ弾サイズ["半径"]の円描画。 ここまで ここまで ここまで ●自弾描画とは 弾数は自弾群の要素数 もし、弾数>0ならば、 1に線太さ設定 白色に線色設定 黒色に塗り色設定 Iを1から弾数まで繰り返す 弾は自弾群[I-1] [弾["X"], 弾["Y"], 自弾サイズ["長"], 自弾サイズ["太"]]の四角描画。 ここまで ここまで ここまで ●星描画とは 星数は背景星の要素数 もし、星数>0ならば、 1に線太さ設定 黄色に線色設定 黄色に塗り色設定 Iを1から星数まで繰り返す 星は背景星[I-1] [星["X"], 星["Y"]]へ1の円描画。 ここまで ここまで ここまで ●(群を文字で)群文字描画処理とは 個体数は群の要素数 もし、個体数>0ならば、 Iを1から個体数まで繰り返す 個体は群[I-1] 「{個体["サイズ"]}px sans- serif」に描画フォント設定 [個体["X"]−個体["サイズ"]÷2, 個体["Y"]+個体["サイズ"]÷2]に文字を文字描画 ここまで ここまで ここまで ●(群を文字で)回転付群文字描画処理とは 個体数は群の要素数 もし、個体数>0ならば、 CTXは描画中コンテキスト キャンバス状態保存 「{群[0]["サイズ"]}px sans- serif」に描画フォント設定 CTX["textAlign"]は"center" CTX["textBaseline"]は"middle" Iを1から個体数まで繰り返す 個体は群[I-1] 向きはDEG2RAD(個体["R"]) キャンバス状態保存 CTXの"translate"を[個体["X"], 個体["Y"]]でJSメソッド実行 CTXの"rotate"を[向き]でJSメソッド実行 [0, 0]に文字を文字描画 キャンバス状態復元 ここまで キャンバス状態復元 ここまで ここまで ●隕石描画とは 隕石群を隕石文字で回転付群文字描画処理 ここまで ●爆発描画とは 爆発中を爆発文字で群文字描画処理 ここまで ●敵描画とは 敵群を敵文字で群文字描画処理 ここまで ●ビルボード描画とは 白色に塗り色設定 速さアイコンは「→」を自速さでリフレイン 「12px sans- serif」に描画フォント設定 [画面横÷3×1-40, 20]に「スコア:{スコア}」を文字描画 [画面横÷3×2-40, 20]に「速さ:{速さアイコン}」を文字描画 ここまで ●画面描画とは [0,0,画面横,画面縦]の描画クリア 星描画 自機描画 隕石描画 敵描画 爆発描画 敵弾描画 自弾描画 ビルボード描画 ここまで ●初期画面描画とは [0,0,画面横,画面縦]の描画クリア 白色に線色設定 白色に塗り色設定 2に線太さ設定 「18px sans- serif」に描画フォント設定 [画面横÷2-60, 画面縦÷2]に「クリックで開始」を文字描画 ここまで ●ゲーム終とは 描画中はオフ 描画中キャンバスをクリックした時には ここまで 終了処理 白色に線色設定 白色に塗り色設定 2に線太さ設定 「24px sans- serif」に描画フォント設定 [画面横÷2-20, 画面縦÷2]に「おわり」を文字描画 ここまで ●キー押すとは 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で戻る ここまで ●自弾発射とは 速さは2.5 出現向きは0 向きはDEG2RAD(出現向き) 弾は{ X:X+自サイズ÷2, Y:Y, 向:出現向き, 速:速さ, DX:COS(向き)×速さ, DY:SIN(向き)×速さ, 長: 自弾サイズ["長"], 太: 自弾サイズ["太"] } 自弾群に弾を配列追加 ここまで ●操作処理とは DXは0 DYは0 D速さは0 もし、(12の保持チェック)ならば、 DYは-1 ここまで もし、(13の保持チェック)ならば、 DYは1 ここまで もし、(14の保持チェック)ならば、 DXは-1 ここまで もし、(15の保持チェック)ならば、 DXは1 ここまで もし、(0の押下チェック)ならば、 自弾発射 ここまで もし、(2の押下チェック)ならば、 D速さは-1 ここまで もし、(3の押下チェック)ならば、 D速さは1 ここまで XはX+DX×自速さ÷2×経過レート もし、X<0ならば、 Xは0 違えばもし、X>画面横ならば、 Xは画面横 ここまで YはY+DY×自速さ÷2×経過レート もし、Y<0ならば、 Yは0 違えばもし、Y>画面縦ならば、 Yは画面縦 ここまで 自速さは自速さ+D速さ もし、自速さ<1ならば、 自速さは1 違えばもし、自速さ>8ならば、 自速さは8 ここまで ここまで
プログラムを実行
⭐ てぃふと@うぇいく 作
タイトル:
色々避けつつ撃つゲーム(キーボード操作専用)
ライセンス:
CC0 (著作権破棄)
タイプ:
wnako
タグ:
-
利用バージョン:
3.3.55
作成日時:
2021/03/04 20:32 (編集: 2022/06/21 21:08)
公開の投稿
⭐⭐⭐⭐⭐
ログイン
して★を付けよう!
Twitterへ投稿
📝作品を編集
作品公開情報
📍この作品のURL:
📍アプリ(即時実行)のURL:
📍アプリ(実行ボタンあり)のURL:
📍ブログパーツ:
上記HTML↑をブログに貼り付けることでアプリを埋め込めます。
📍ライブラリ直リンク - 『!「***」を取込』で使うとき:
📍なでしこハブ (最新版の反映は1日後):
ソースの確認
編集履歴の確認
通報数:
0
通報って何?