Code Monkey home page Code Monkey logo

kawasemi's Introduction

README

build

npm i
npm run dev

running localhost:8080

設計

Game

エントリーポイントとなるクラス。初期化とメインループによって構成されている。

  • Update 毎フレームこの処理が実行される。パイプラインは以下の様になっている
    • EventManager.Update(); 登録されているグローバルイベント(後述)があれば実行する。
    • Game.state.getState().Update(); 現在の state における Update 処理を実行する。
    • Drawer.Renderer.render(Drawer.Stage); ゲーム中の全スプライトを描画する。
    • Audio.Update();
    • Timer.Update();

EntityManager

ゲーム中の UI を除く物体について管理するクラス。

  • add / remove リストに追加/除外

  • find(name) 指定した name を持つ entity の参照を配列で取得する。

Enity

player,enemy などゲーム中の物体。UI は別系統で管理されており、含まれない。 ECS に近い設計をしているが、component,system は明確には存在しない。

  • name

  • floor � 自身の床にあたる entity があればその参照を追加する。

  • collider 衝突形状を指定する。現状 box しか使われていないが、サイズによって形状は異なる。

  • AIList 挙動を追加するリスト

  • Update() 毎フレームの更新処理。

EventTrigger

「特定の箇所に行くとイベントが発生する」を実現する。これは透明な entity であるが、プレイヤーと衝突するとイベントを発行し自身が消滅する。一定の広さを持つ領域に eventTrigger を貼りたい場合は大量に設置するのだが、この時イベント発行が重複しないように、一度発行したものと同じ種類の eventTrigger は non active になる。

AI

「壁にぶつかると跳ね返る」「近づくと攻撃体制になる」など、共通して用いられる挙動を分離したもの。 entity の AIList に追加することによって、entity は AI に追加された挙動を逐次 update する。

衝突判定

形状情報 collider を持つ entity 同士の衝突判定、応答を行う。 衝突応答関数は衝突したかどうかの真偽値、めり込み距離、法線などをもつCollisionInfoを返す。 衝突応答は本来 entity の更新とは別のフローでバッファリングして行われるべきだが、同じフローで逐次的に実行しているためバグっている。

UI

AtomicDesign に近い形を採用している atoms は最小単位の UI , molecules は少しまとまった UI , pages はその画面全体の UI を指す

フォント

  • constructor(pos,text,type) type は常にMESを指定していて、形骸化している

  • ChangeText(text) テキストの表示内容を変更する。この関数にはバグが有り、なぜか座標が初期化される副作用を持っている。

親子関係

アニメーション

自身に登録したローカルイベントを実行する。

独自 style 記法

現在一部の UI で試験的に導入しているシステムで、CSS,DOM に相当する JSON を記述すると UI 木が展開されて配置されるようになっている。しかし描画順を制御できない問題があり、実運用には至っていない。

UIManager

EntityManager の UI 版。

  • Clean() すべての UI を削除する
  • CleanBack() **フェードインエフェクトを除く、**全ての UI を削除する。画面遷移時の幕の裏で UI を更新する用途の為。
  • find(name) 指定した name を持つ UI を取得する。

イベント管理

UI アニメーションのように「ある時点から始まり、一定の時間実行され終了する」ような処理はコルーチンで記述するのが便利である。 現在イベントにはグローバルイベントローカルイベントの 2 種類が存在する。

  • グローバルイベント EventManager に Event を追加することによりメインループ内で処理される。 多くのイベントはこれ。

  • ローカルイベント entity がイベントを持ち、自身の update によってイベントを処理する。

状態遷移

ゲームの持つ大域状態はSceneと呼ばれ、Scene はStateMachineによって管理される。 Scene が定義するものは初期化処理、入力処理、メインループの組である。 StateMachine は Scene の集合によって作られ、「現在の Scene」を保持しており、transit(scene)によって現在の状態を更新する。

  • find(name) 状態集合の中から指定した name を持つ Scene を取得する。name は一意的でなければならない。

描画系統

描画は PIXI.JS v4 である。(2020/1/8 現在) update と draw は別フローになっており、entity に紐付いてる sprite があればそれを描画する。 実は現在カメラを使っておらずレンダラが直接フォーカスする機能しかないため、entity としてのカメラを作る予定。

親子関係

PIXI.js には sprite に親子関係をもたせる機能があるが、親の座標変換が子に適用される仕様となっており、サイズ(拡大率)を独立して指定したい需要には不向きである。そのため entity が親子関係を持ち、sprite は entity とは分離して記述される。

レイヤー

entity.layer に指定するレイヤー名によって指定されたレイヤーに描画される。 レイヤーは 7 種類ほどあり、レイヤーごとに拡大率やスクロール速度が微妙に異なる。

描画順序

z 座標によって指定するのが望ましいが、現在はレイヤーの指定順によってのみ決定づけられる。 同じレイヤー間の描画順序は entity の登録順であるため、現状制御することは困難。

シェーダ

PIXI の提供する機能を使用している。uniform 変数の送信なども可能。

リソース管理

リソースは src/resource/以下

グラフィック

一枚の画像に複数の entity のアニメーションを書き、プログラム上で対応付を行うスプライトシート方式を採用している。大本となるスプライトシート、スプライトシート上の位置とリソース名を対応付けた JSON ファイル、リソース名から texture を作成する Art クラスから構成されている。 〇〇 pattern のようなファイルがスプライトシートに対応する。

マップデータの読み込み

マップデータは外部ツール tiled によって json 形式で作成する。json をパースし entity を配置することによってステージを作成する。

  • 壁面自動対応 壁面は壁チップと呼ばれる特殊なチップを使用している。このチップは連続する壁チップが一塊の大きな壁となるように壁タイルをうまく自動で対応付けるものである。

フォント

文字はすべて画像。現在 1 種類のフォントしか扱えず、文字色や大きさを変更することはできない。 フォント名はかわせみゴシックかさいはてゴシックのどっちかにしようと思っている。

音声

webAudioAPI をラップした Audio クラスで読み込みと再生を行う。再生時にボリュームとピッチを指定することができる。 状態として現在再生中のBGM名を持っている。 使用してはいないがローパスフィルタもある

  • PlayBGM(name) name で指定した BGM を再生する。name に 0 を指定すると StopBGM()を実行する
  • StopBGM() 現在 BGM が再生中であれば、 BGM を停止する。

Input

  • isKeyClicked(key) key が「押された瞬間のフレーム」だけ true を返す。
  • isKeyPressed(key) key が押された瞬間のフレームに true を返し、その後しばらくの間 false を返し、続いて断続的に true を返す。 これは名前は知らないが、長押しを扱う入力インターフェースでよく見られる挙動である。

その他

Util

頻繁に使う数学系関数やキーコードの定数などを定義している。利便性を考慮し module ではなく直接 global に置いてある。

パラメータ管理

Param クラスに分離している

Timer

一回のメインループを時間の 1 単位とし、離散的な時間として扱う。 スローモーションを実装するため、連続的な時間も保持している

デバッグモード

util のisDebugModeを true にするとデバッグモードになる。 Debug クラスの debugOption モジュールにオプションを記載する。(スコア 5000 点、全武器入手、攻撃力 5000 など)

Pipeline クラス

煩雑な手続きを置く場所

  • Pool

オブジェクトプールの実装であるが、実はボトルネックではないため実質廃止。 一部の Entity がまだ pool で管理されているため、統一したい

  • distanceField

画像から距離場を作ってステージ生成したかったときの、試験的導入技術の名残

kawasemi's People

Contributors

uynet avatar

Watchers

 avatar  avatar

Forkers

cringelord1940

kawasemi's Issues

ゲームシステムの変更/ショットの自動化

実際に展示した感じだと動きながら攻撃するのがかなり難しいように見えた

プレイヤーは操作に集中できるようにすれば多少は改善するんじゃないかと思った
あとジャンプ力をかなり落とす

まじで普通にやってれば死なないくらいの難易度がいいのかな

UIアーキテクチャの修正

コンポーネント間のネストができない、描画順序を制御できないなどの問題が多いため
Reactをパクる

タイルセット自動生成ツールの作成

以下のようなコマンド☆を作成する

  • Enemyフォルダを作成する
    中にenemy1.png , enemy2.png ,enemy3.png ...と画像ファイルを置く
    コマンド☆を打つ
    enemy1,2,3が結合されたタイルセットができる
    (タイルセット...tiledで使用するもの)
    さらにタイルセットIDとenemy番号の紐づけがされたJSONが出力される
    さらに、分解された画像をいい感じにロードして参照を持ってくれるようにする

クラス名にEventを使用している

"Event"はJSのデバイスの入力検出に使われているクラス名であるが、実はずっと上書きして使っていたことが判明。
import忘れた場合などに事故の元となるため、クラス名を適切に変更する処置が求められる。

フォントシステムの修繕

現在のフォントシステムは色々やばいことになっている
PIXIのコンテナとしてスプライト画像をまとめているのだが、文字の相対座標やらカーニングやらがバグって大変なことに

とりあえず画像ではなくpixiのフォント出力を使う
(しかしそうすると一文字ずつ表示する演出ができなくなってしまうが...)

◾️そもそも読みにくい
普通の読めるフォントと演出用フォントを両方使えるようにする

UI addChildについての仕様を整理する

現行:

  • addChildで追加したUIはUIManagerには登録されない

    • そのためUpdateするには親UIのUpdate内からchildrenをUpdateする必要がある
    • これを毎回確認するのは原始的であるため、いい感じにしたい
  • spriteのchildに登録されるため、親UIを削除すると一緒に消える

  • removeChildはスプライトの参照を削除するのみ

  • UIManager,Drawerのadd/removeを直接経由せず、親UIのスプライトに付随して登録/削除がなされている

  • Updateの継承元にはEventList.Execute()があるが、継承時にこれを忘れず書く必要があるため、いい感じにしたい
    - これはアニメーション用にコルーチンを実行する関数

  • 影響の出る箇所

    • UIManager.Find
    • その他、UI内でChildren.ForEachしている所

画面比を変えたい

将来的に各種プラットフォームで配信するにあたって、相応しい画面比に変更する必要がある

現行 800:640
目標 800:450 (16:9)

あたって、影響の出る箇所を調査する

  • ステージ画面
  • ワールドマップ
  • shopUI
  • 画面遷移のフェードインエフェクト
  • 各種ステージのバランス調整

チャンク境界移動時に生成する部分を新規チャンクのみに限定

現在はチャンク移動時に全clearして生成しなおしている

■=ステージに登録されるチャンク
P = プレイヤー

□□□□□
□■■■□
□■P■□
□■■■□
□□□□□
↓右に移動する
□□□□□
□□■■■
□□■P■
□□■■■
□□□□□

このとき、
□□□□□
□□■■★
□□■P★
□□■■★
□□□□□

★の部分のみ生成するようにする

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.